diff --git a/src/wallet/coincontrol.h b/src/wallet/coincontrol.h index e1afa2de03d..458e770e035 100644 --- a/src/wallet/coincontrol.h +++ b/src/wallet/coincontrol.h @@ -16,7 +16,10 @@ class CCoinControl { public: + //! Custom change destination, if not set an address is generated CTxDestination destChange; + //! Custom change type, ignored if destChange is set, defaults to g_change_type + OutputType change_type; //! If false, allows unselected inputs, but requires all selected inputs be used bool fAllowOtherInputs; //! Includes watch only addresses which match the ISMINE_WATCH_SOLVABLE criteria @@ -40,6 +43,7 @@ public: void SetNull() { destChange = CNoDestination(); + change_type = g_change_type; fAllowOtherInputs = false; fAllowWatchOnly = false; setSelected.clear(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 7fb26900e1d..07a23ce249b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2674,11 +2674,11 @@ bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, int& nC return true; } -OutputType CWallet::TransactionChangeType(const std::vector& vecSend) +OutputType CWallet::TransactionChangeType(OutputType change_type, const std::vector& vecSend) { // If -changetype is specified, always use that change type. - if (g_change_type != OUTPUT_TYPE_NONE) { - return g_change_type; + if (change_type != OUTPUT_TYPE_NONE) { + return change_type; } // if g_address_type is legacy, use legacy address as change (even @@ -2797,7 +2797,7 @@ bool CWallet::CreateTransaction(const std::vector& vecSend, CWalletT return false; } - const OutputType change_type = TransactionChangeType(vecSend); + const OutputType change_type = TransactionChangeType(coin_control.change_type, vecSend); LearnRelatedScripts(vchPubKey, change_type); scriptChange = GetScriptForDestination(GetDestinationForKey(vchPubKey, change_type)); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e8f536634e8..a4684c2935d 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -965,7 +965,7 @@ public: CAmount GetLegacyBalance(const isminefilter& filter, int minDepth, const std::string* account) const; CAmount GetAvailableBalance(const CCoinControl* coinControl = nullptr) const; - OutputType TransactionChangeType(const std::vector& vecSend); + OutputType TransactionChangeType(OutputType change_type, const std::vector& vecSend); /** * Insert additional inputs into the transaction by