Return the default unified address if we have the UFVK but no address metadata.
This commit is contained in:
parent
4df6c028f4
commit
a1bd440f2b
|
@ -3136,7 +3136,7 @@ UniValue z_getaddressforaccount(const UniValue& params, bool fHelp)
|
||||||
}
|
}
|
||||||
if (receivers.empty()) {
|
if (receivers.empty()) {
|
||||||
// Default is the best and second-best shielded pools, and the transparent pool.
|
// Default is the best and second-best shielded pools, and the transparent pool.
|
||||||
receivers = {ReceiverType::P2PKH, ReceiverType::Sapling, ReceiverType::Orchard};
|
receivers = CWallet::DefaultReceiverTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<libzcash::diversifier_index_t> j = std::nullopt;
|
std::optional<libzcash::diversifier_index_t> j = std::nullopt;
|
||||||
|
|
|
@ -61,6 +61,10 @@ const char * DEFAULT_WALLET_DAT = "wallet.dat";
|
||||||
*/
|
*/
|
||||||
CFeeRate CWallet::minTxFee = CFeeRate(DEFAULT_TRANSACTION_MINFEE);
|
CFeeRate CWallet::minTxFee = CFeeRate(DEFAULT_TRANSACTION_MINFEE);
|
||||||
|
|
||||||
|
std::set<ReceiverType> CWallet::DefaultReceiverTypes() {
|
||||||
|
return {ReceiverType::P2PKH, ReceiverType::Sapling, ReceiverType::Orchard};
|
||||||
|
}
|
||||||
|
|
||||||
/** @defgroup mapWallet
|
/** @defgroup mapWallet
|
||||||
*
|
*
|
||||||
* @{
|
* @{
|
||||||
|
@ -857,10 +861,12 @@ PaymentAddress CWallet::GetPaymentAddressForRecipient(
|
||||||
const uint256& txid,
|
const uint256& txid,
|
||||||
const libzcash::RecipientAddress& recipient) const
|
const libzcash::RecipientAddress& recipient) const
|
||||||
{
|
{
|
||||||
|
auto self = this;
|
||||||
auto defaultAddress = [&]() -> PaymentAddress {
|
auto defaultAddress = [&]() -> PaymentAddress {
|
||||||
|
auto ufvk = self->GetUFVKForReceiver(RecipientAddressToReceiver(recipient));
|
||||||
return std::visit(match {
|
return std::visit(match {
|
||||||
[&](const CKeyID& addr) {
|
[&](const CKeyID& addr) {
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(addr);
|
auto ua = self->FindUnifiedAddressByReceiver(addr);
|
||||||
if (ua.has_value()) {
|
if (ua.has_value()) {
|
||||||
return libzcash::PaymentAddress{ua.value()};
|
return libzcash::PaymentAddress{ua.value()};
|
||||||
} else {
|
} else {
|
||||||
|
@ -868,7 +874,7 @@ PaymentAddress CWallet::GetPaymentAddressForRecipient(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&](const CScriptID& addr) {
|
[&](const CScriptID& addr) {
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(addr);
|
auto ua = self->FindUnifiedAddressByReceiver(addr);
|
||||||
if (ua.has_value()) {
|
if (ua.has_value()) {
|
||||||
return libzcash::PaymentAddress{ua.value()};
|
return libzcash::PaymentAddress{ua.value()};
|
||||||
} else {
|
} else {
|
||||||
|
@ -876,21 +882,38 @@ PaymentAddress CWallet::GetPaymentAddressForRecipient(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&](const SaplingPaymentAddress& addr) {
|
[&](const SaplingPaymentAddress& addr) {
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(addr);
|
auto ua = self->FindUnifiedAddressByReceiver(addr);
|
||||||
if (ua.has_value()) {
|
if (ua.has_value()) {
|
||||||
return libzcash::PaymentAddress{ua.value()};
|
return libzcash::PaymentAddress{ua.value()};
|
||||||
|
} else if (ufvk.has_value() && ufvk->GetSaplingKey().has_value()) {
|
||||||
|
auto saplingKey = ufvk->GetSaplingKey().value();
|
||||||
|
auto j = saplingKey.DecryptDiversifier(addr.d);
|
||||||
|
// std::get is safe here because we know we have a valid Sapling diversifier index
|
||||||
|
auto defaultUA = std::get<std::pair<UnifiedAddress, diversifier_index_t>>(
|
||||||
|
ufvk->Address(j, CWallet::DefaultReceiverTypes()));
|
||||||
|
return libzcash::PaymentAddress{defaultUA.first};
|
||||||
} else {
|
} else {
|
||||||
return libzcash::PaymentAddress{addr};
|
return libzcash::PaymentAddress{addr};
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[&](const OrchardRawAddress& addr) {
|
[&](const OrchardRawAddress& addr) {
|
||||||
auto ua = pwalletMain->FindUnifiedAddressByReceiver(addr);
|
auto ua = self->FindUnifiedAddressByReceiver(addr);
|
||||||
if (ua.has_value()) {
|
if (ua.has_value()) {
|
||||||
return libzcash::PaymentAddress{ua.value()};
|
return libzcash::PaymentAddress{ua.value()};
|
||||||
} else {
|
} else if (ufvk.has_value() && ufvk->GetOrchardKey().has_value()) {
|
||||||
return libzcash::PaymentAddress{UnifiedAddress::ForSingleReceiver(addr)};
|
auto orchardKey = ufvk->GetOrchardKey().value();
|
||||||
|
auto j = orchardKey.ToIncomingViewingKey().DecryptDiversifier(addr);
|
||||||
|
if (j.has_value()) {
|
||||||
|
auto genResult = ufvk->Address(j.value(), CWallet::DefaultReceiverTypes());
|
||||||
|
auto defaultUA = std::get_if<std::pair<UnifiedAddress, diversifier_index_t>>(&genResult);
|
||||||
|
if (defaultUA != nullptr) {
|
||||||
|
return libzcash::PaymentAddress{defaultUA->first};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return libzcash::PaymentAddress{UnifiedAddress::ForSingleReceiver(addr)};
|
||||||
|
}
|
||||||
}, recipient);
|
}, recipient);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -913,6 +936,7 @@ PaymentAddress CWallet::GetPaymentAddressForRecipient(
|
||||||
|
|
||||||
bool CWallet::IsInternalRecipient(const libzcash::RecipientAddress& recipient) const
|
bool CWallet::IsInternalRecipient(const libzcash::RecipientAddress& recipient) const
|
||||||
{
|
{
|
||||||
|
auto self = this;
|
||||||
return std::visit(match {
|
return std::visit(match {
|
||||||
[&](const CKeyID& addr) {
|
[&](const CKeyID& addr) {
|
||||||
// we never send transparent change when sending to or from a
|
// we never send transparent change when sending to or from a
|
||||||
|
@ -924,7 +948,7 @@ bool CWallet::IsInternalRecipient(const libzcash::RecipientAddress& recipient) c
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
[&](const SaplingPaymentAddress& addr) {
|
[&](const SaplingPaymentAddress& addr) {
|
||||||
auto ufvk = pwalletMain->GetUFVKForReceiver(addr);
|
auto ufvk = self->GetUFVKForReceiver(addr);
|
||||||
if (ufvk.has_value()) {
|
if (ufvk.has_value()) {
|
||||||
auto changeAddr = ufvk->GetChangeAddress(SaplingChangeRequest());
|
auto changeAddr = ufvk->GetChangeAddress(SaplingChangeRequest());
|
||||||
if (changeAddr.has_value()) {
|
if (changeAddr.has_value()) {
|
||||||
|
@ -934,7 +958,7 @@ bool CWallet::IsInternalRecipient(const libzcash::RecipientAddress& recipient) c
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
[&](const OrchardRawAddress& addr) {
|
[&](const OrchardRawAddress& addr) {
|
||||||
auto ufvk = pwalletMain->GetUFVKForReceiver(addr);
|
auto ufvk = self->GetUFVKForReceiver(addr);
|
||||||
if (ufvk.has_value()) {
|
if (ufvk.has_value()) {
|
||||||
auto changeAddr = ufvk->GetChangeAddress(OrchardChangeRequest());
|
auto changeAddr = ufvk->GetChangeAddress(OrchardChangeRequest());
|
||||||
if (changeAddr.has_value()) {
|
if (changeAddr.has_value()) {
|
||||||
|
@ -1583,7 +1607,7 @@ set<uint256> CWallet::GetConflicts(const uint256& txid) const
|
||||||
|
|
||||||
for (uint32_t i = 0; i < wtx.GetOrchardBundle().GetNumActions(); i++) {
|
for (uint32_t i = 0; i < wtx.GetOrchardBundle().GetNumActions(); i++) {
|
||||||
OrchardOutPoint op(wtx.GetHash(), i);
|
OrchardOutPoint op(wtx.GetHash(), i);
|
||||||
auto potential_spends = pwalletMain->orchardWallet.GetPotentialSpends(op);
|
auto potential_spends = orchardWallet.GetPotentialSpends(op);
|
||||||
|
|
||||||
if (potential_spends.size() <= 1) {
|
if (potential_spends.size() <= 1) {
|
||||||
continue; // No conflict if zero or one spends
|
continue; // No conflict if zero or one spends
|
||||||
|
@ -3691,7 +3715,7 @@ bool CWallet::MnemonicVerified() {
|
||||||
}
|
}
|
||||||
|
|
||||||
HDSeed CWallet::GetHDSeedForRPC() const {
|
HDSeed CWallet::GetHDSeedForRPC() const {
|
||||||
auto seed = pwalletMain->GetMnemonicSeed();
|
auto seed = GetMnemonicSeed();
|
||||||
if (!seed.has_value()) {
|
if (!seed.has_value()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "HD seed not found");
|
throw JSONRPCError(RPC_WALLET_ERROR, "HD seed not found");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1704,6 +1704,12 @@ public:
|
||||||
*/
|
*/
|
||||||
static CAmount GetRequiredFee(unsigned int nTxBytes);
|
static CAmount GetRequiredFee(unsigned int nTxBytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current set of default receiver types used when the wallet generates
|
||||||
|
* unified addresses
|
||||||
|
*/
|
||||||
|
static std::set<libzcash::ReceiverType> DefaultReceiverTypes();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool NewKeyPool();
|
bool NewKeyPool();
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue