diff options
author | S3RK <1466284+S3RK@users.noreply.github.com> | 2022-05-18 08:25:04 +0200 |
---|---|---|
committer | S3RK <1466284+S3RK@users.noreply.github.com> | 2022-05-18 08:25:04 +0200 |
commit | c3981e379fa088aa7aa03b2f505342a5b3bc3436 (patch) | |
tree | e371d7b5780ea16c1e5b26f110281702468faaf4 /src/wallet | |
parent | f7a1e676d536115aba649672ba1e68755a1c90dc (diff) |
wallet: do not count wallet utxos as external
Diffstat (limited to 'src/wallet')
-rw-r--r-- | src/wallet/rpc/spend.cpp | 13 | ||||
-rw-r--r-- | src/wallet/spend.cpp | 22 |
2 files changed, 18 insertions, 17 deletions
diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp index 3d975b5402..9020eade23 100644 --- a/src/wallet/rpc/spend.cpp +++ b/src/wallet/rpc/spend.cpp @@ -699,19 +699,6 @@ void FundTransaction(CWallet& wallet, CMutableTransaction& tx, CAmount& fee_out, setSubtractFeeFromOutputs.insert(pos); } - // Fetch specified UTXOs from the UTXO set to get the scriptPubKeys and values of the outputs being selected - // and to match with the given solving_data. Only used for non-wallet outputs. - std::map<COutPoint, Coin> coins; - for (const CTxIn& txin : tx.vin) { - coins[txin.prevout]; // Create empty map entry keyed by prevout. - } - wallet.chain().findCoins(coins); - for (const auto& coin : coins) { - if (!coin.second.out.IsNull()) { - coinControl.SelectExternal(coin.first, coin.second.out); - } - } - bilingual_str error; if (!FundTransaction(wallet, tx, fee_out, change_position, error, lockUnspents, setSubtractFeeFromOutputs, coinControl)) { diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp index e5fd7b0eb4..162d06e596 100644 --- a/src/wallet/spend.cpp +++ b/src/wallet/spend.cpp @@ -1018,14 +1018,28 @@ bool FundTransaction(CWallet& wallet, CMutableTransaction& tx, CAmount& nFeeRet, coinControl.fAllowOtherInputs = true; - for (const CTxIn& txin : tx.vin) { - coinControl.Select(txin.prevout); - } - // Acquire the locks to prevent races to the new locked unspents between the // CreateTransaction call and LockCoin calls (when lockUnspents is true). LOCK(wallet.cs_wallet); + // Fetch specified UTXOs from the UTXO set to get the scriptPubKeys and values of the outputs being selected + // and to match with the given solving_data. Only used for non-wallet outputs. + std::map<COutPoint, Coin> coins; + for (const CTxIn& txin : tx.vin) { + coins[txin.prevout]; // Create empty map entry keyed by prevout. + } + wallet.chain().findCoins(coins); + + for (const CTxIn& txin : tx.vin) { + // if it's not in the wallet and corresponding UTXO is found than select as external output + const auto& outPoint = txin.prevout; + if (wallet.mapWallet.find(outPoint.hash) == wallet.mapWallet.end() && !coins[outPoint].out.IsNull()) { + coinControl.SelectExternal(outPoint, coins[outPoint].out); + } else { + coinControl.Select(outPoint); + } + } + FeeCalculation fee_calc_out; std::optional<CreatedTransactionResult> txr = CreateTransaction(wallet, vecSend, nChangePosInOut, error, coinControl, fee_calc_out, false); if (!txr) return false; |