Correctly derive UAs for unknown Orchard receivers.
The previous code assumed that we would only see wallet addresses that we had explicitly generated, and crashed if we detected a note sent to a different Orchard receiver within a known account. Fixes zcash/zcash#5827. Co-authored-by: Jack Grigg <jack@electriccoin.co>
This commit is contained in:
parent
9e80e4aff6
commit
896ae6315b
|
@ -2612,10 +2612,9 @@ UniValue z_listunspent(const UniValue& params, bool fHelp)
|
||||||
if (account.has_value()) {
|
if (account.has_value()) {
|
||||||
obj.pushKV("account", (uint64_t) account.value());
|
obj.pushKV("account", (uint64_t) account.value());
|
||||||
}
|
}
|
||||||
if (!isInternal) {
|
auto addr = pwalletMain->GetPaymentAddressForRecipient(entry.GetOutPoint().hash, entry.GetAddress());
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(entry.GetAddress());
|
if (addr.second != RecipientType::WalletInternalAddress) {
|
||||||
assert(ua.has_value());
|
obj.pushKV("address", keyIO.EncodePaymentAddress(addr.first));
|
||||||
obj.pushKV("address", keyIO.EncodePaymentAddress(ua.value()));
|
|
||||||
}
|
}
|
||||||
obj.pushKV("amount", ValueFromAmount(entry.GetNoteValue()));
|
obj.pushKV("amount", ValueFromAmount(entry.GetNoteValue()));
|
||||||
obj.pushKV("memo", HexStr(entry.GetMemo()));
|
obj.pushKV("memo", HexStr(entry.GetMemo()));
|
||||||
|
@ -4514,10 +4513,9 @@ UniValue z_viewtransaction(const UniValue& params, bool fHelp)
|
||||||
auto noteValue = orchardActionSpend.GetNoteValue();
|
auto noteValue = orchardActionSpend.GetNoteValue();
|
||||||
|
|
||||||
std::optional<std::string> addrStr;
|
std::optional<std::string> addrStr;
|
||||||
if (!pwalletMain->IsInternalRecipient(receivedAt)) {
|
auto addr = pwalletMain->GetPaymentAddressForRecipient(txid, receivedAt);
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(receivedAt);
|
if (addr.second != RecipientType::WalletInternalAddress) {
|
||||||
assert(ua.has_value());
|
addrStr = keyIO.EncodePaymentAddress(addr.first);
|
||||||
addrStr = keyIO.EncodePaymentAddress(ua.value());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue entry(UniValue::VOBJ);
|
UniValue entry(UniValue::VOBJ);
|
||||||
|
|
Loading…
Reference in New Issue