wallet: Lock address type in ReserveDestination

This commit is contained in:
João Barbosa 2019-10-24 09:44:20 +01:00
parent bbc9e4133c
commit 55295fba4c
2 changed files with 12 additions and 12 deletions

View file

@ -2490,7 +2490,8 @@ bool CWallet::CreateTransaction(interfaces::Chain::Lock& locked_chain, const std
int& nChangePosInOut, std::string& strFailReason, const CCoinControl& coin_control, bool sign) int& nChangePosInOut, std::string& strFailReason, const CCoinControl& coin_control, bool sign)
{ {
CAmount nValue = 0; CAmount nValue = 0;
ReserveDestination reservedest(this); const OutputType change_type = TransactionChangeType(coin_control.m_change_type ? *coin_control.m_change_type : m_default_change_type, vecSend);
ReserveDestination reservedest(this, change_type);
int nChangePosRequest = nChangePosInOut; int nChangePosRequest = nChangePosInOut;
unsigned int nSubtractFeeFromAmount = 0; unsigned int nSubtractFeeFromAmount = 0;
for (const auto& recipient : vecSend) for (const auto& recipient : vecSend)
@ -2549,8 +2550,7 @@ bool CWallet::CreateTransaction(interfaces::Chain::Lock& locked_chain, const std
return false; return false;
} }
CTxDestination dest; CTxDestination dest;
const OutputType change_type = TransactionChangeType(coin_control.m_change_type ? *coin_control.m_change_type : m_default_change_type, vecSend); bool ret = reservedest.GetReservedDestination(dest, true);
bool ret = reservedest.GetReservedDestination(change_type, dest, true);
if (!ret) if (!ret)
{ {
strFailReason = "Keypool ran out, please call keypoolrefill first"; strFailReason = "Keypool ran out, please call keypoolrefill first";
@ -3069,8 +3069,8 @@ bool CWallet::GetNewChangeDestination(const OutputType type, CTxDestination& des
m_spk_man->TopUp(); m_spk_man->TopUp();
ReserveDestination reservedest(this); ReserveDestination reservedest(this, type);
if (!reservedest.GetReservedDestination(type, dest, true)) { if (!reservedest.GetReservedDestination(dest, true)) {
error = "Error: Keypool ran out, please call keypoolrefill first"; error = "Error: Keypool ran out, please call keypoolrefill first";
return false; return false;
} }
@ -3235,7 +3235,7 @@ std::set<CTxDestination> CWallet::GetLabelAddresses(const std::string& label) co
return result; return result;
} }
bool ReserveDestination::GetReservedDestination(const OutputType type, CTxDestination& dest, bool internal) bool ReserveDestination::GetReservedDestination(CTxDestination& dest, bool internal)
{ {
m_spk_man = pwallet->GetLegacyScriptPubKeyMan(); m_spk_man = pwallet->GetLegacyScriptPubKeyMan();
if (!m_spk_man) { if (!m_spk_man) {

View file

@ -140,8 +140,9 @@ class ReserveDestination
{ {
protected: protected:
//! The wallet to reserve from //! The wallet to reserve from
CWallet* pwallet; CWallet* const pwallet;
LegacyScriptPubKeyMan* m_spk_man{nullptr}; LegacyScriptPubKeyMan* m_spk_man{nullptr};
OutputType const type;
//! The index of the address's key in the keypool //! The index of the address's key in the keypool
int64_t nIndex{-1}; int64_t nIndex{-1};
//! The public key for the address //! The public key for the address
@ -153,10 +154,9 @@ protected:
public: public:
//! Construct a ReserveDestination object. This does NOT reserve an address yet //! Construct a ReserveDestination object. This does NOT reserve an address yet
explicit ReserveDestination(CWallet* pwalletIn) explicit ReserveDestination(CWallet* pwallet, OutputType type)
{ : pwallet(pwallet)
pwallet = pwalletIn; , type(type) { }
}
ReserveDestination(const ReserveDestination&) = delete; ReserveDestination(const ReserveDestination&) = delete;
ReserveDestination& operator=(const ReserveDestination&) = delete; ReserveDestination& operator=(const ReserveDestination&) = delete;
@ -168,7 +168,7 @@ public:
} }
//! Reserve an address //! Reserve an address
bool GetReservedDestination(const OutputType type, CTxDestination& pubkey, bool internal); bool GetReservedDestination(CTxDestination& pubkey, bool internal);
//! Return reserved address //! Return reserved address
void ReturnDestination(); void ReturnDestination();
//! Keep the address. Do not return it's key to the keypool when this object goes out of scope //! Keep the address. Do not return it's key to the keypool when this object goes out of scope