diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 16c994749..02d862437 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2872,7 +2872,9 @@ bool CWallet::UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) wtx.mapSaplingNoteData = tmp; } - return !unchangedSproutFlag || !unchangedSaplingFlag; + bool unchangedOrchardFlag = (wtxIn.mapOrchardActionData.empty() || wtxIn.mapOrchardActionData == wtx.mapOrchardActionData); + + return !unchangedSproutFlag || !unchangedSaplingFlag || !unchangedOrchardFlag; } /** diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e10c4c7e6..5b133be80 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -581,8 +581,7 @@ public: } if (fOverwintered && nVersion >= ZIP225_TX_VERSION) { - // ORCHARD TODO: serialize/deserialize orchard bits using a pointer - // to the Orchard wallet & the txid as referents + READWRITE(mapOrchardActionData); } if (ser_action.ForRead()) diff --git a/src/zcash/address/orchard.cpp b/src/zcash/address/orchard.cpp index a1271a4b0..26e36b3fa 100644 --- a/src/zcash/address/orchard.cpp +++ b/src/zcash/address/orchard.cpp @@ -7,10 +7,12 @@ namespace libzcash { OrchardRawAddress OrchardIncomingViewingKey::Address(const diversifier_index_t& j) const { + assert(inner.get() != nullptr); return OrchardRawAddress(orchard_incoming_viewing_key_to_address(inner.get(), j.begin())); } std::optional OrchardIncomingViewingKey::DecryptDiversifier(const OrchardRawAddress& addr) const { + assert(inner.get() != nullptr); diversifier_index_t j_ret; if (orchard_incoming_viewing_key_decrypt_diversifier(inner.get(), addr.inner.get(), j_ret.begin())) { return j_ret; @@ -20,10 +22,12 @@ std::optional OrchardIncomingViewingKey::DecryptDiversifier } OrchardIncomingViewingKey OrchardFullViewingKey::ToIncomingViewingKey() const { + assert(inner.get() != nullptr); return OrchardIncomingViewingKey(orchard_full_viewing_key_to_incoming_viewing_key(inner.get())); } OrchardIncomingViewingKey OrchardFullViewingKey::ToInternalIncomingViewingKey() const { + assert(inner.get() != nullptr); return OrchardIncomingViewingKey(orchard_full_viewing_key_to_internal_incoming_viewing_key(inner.get())); } diff --git a/src/zcash/address/orchard.hpp b/src/zcash/address/orchard.hpp index d89322441..c6517e13a 100644 --- a/src/zcash/address/orchard.hpp +++ b/src/zcash/address/orchard.hpp @@ -97,17 +97,17 @@ class OrchardIncomingViewingKey private: std::unique_ptr inner; - OrchardIncomingViewingKey() : - inner(nullptr, orchard_incoming_viewing_key_free) {} - OrchardIncomingViewingKey(OrchardIncomingViewingKeyPtr* key) : inner(key, orchard_incoming_viewing_key_free) {} friend class OrchardFullViewingKey; friend class OrchardSpendingKey; friend class ::OrchardWallet; - public: + // DO NOT USE - this is exposed for serialization purposes only. + OrchardIncomingViewingKey() : + inner(nullptr, orchard_incoming_viewing_key_free) {} + OrchardIncomingViewingKey(OrchardIncomingViewingKey&& key) : inner(std::move(key.inner)) {} OrchardIncomingViewingKey(const OrchardIncomingViewingKey& key) : @@ -139,15 +139,20 @@ public: friend bool operator==(const OrchardIncomingViewingKey& a, const OrchardIncomingViewingKey& b) { + assert(a.inner.get() != nullptr); + assert(b.inner.get() != nullptr); return orchard_incoming_viewing_key_eq(a.inner.get(), b.inner.get()); } friend bool operator<(const OrchardIncomingViewingKey& c1, const OrchardIncomingViewingKey& c2) { + assert(c1.inner.get() != nullptr); + assert(c2.inner.get() != nullptr); return orchard_incoming_viewing_key_lt(c1.inner.get(), c2.inner.get()); } template void Serialize(Stream& s) const { + assert(inner.get() != nullptr); RustStream rs(s); if (!orchard_incoming_viewing_key_serialize(inner.get(), &rs, RustStream::write_callback)) { throw std::ios_base::failure("Failed to serialize Orchard incoming viewing key");