diff --git a/src/interfaces/wallet.cpp b/src/interfaces/wallet.cpp --- a/src/interfaces/wallet.cpp +++ b/src/interfaces/wallet.cpp @@ -108,7 +108,7 @@ result.txout = wtx.tx->vout[n]; result.time = wtx.GetTxTime(); result.depth_in_main_chain = depth; - result.is_spent = wallet.IsSpent(wtx.GetId(), n); + result.is_spent = wallet.IsSpent(COutPoint(wtx.GetId(), n)); return result; } @@ -213,7 +213,7 @@ } bool isLockedCoin(const COutPoint &output) override { LOCK2(cs_main, m_wallet.cs_wallet); - return m_wallet.IsLockedCoin(output.GetTxId(), output.GetN()); + return m_wallet.IsLockedCoin(output); } void listLockedCoins(std::vector &outputs) override { LOCK2(cs_main, m_wallet.cs_wallet); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3038,13 +3038,12 @@ "Invalid parameter, vout index out of bounds"); } - if (pwallet->IsSpent(outpt.GetTxId(), outpt.GetN())) { + if (pwallet->IsSpent(outpt)) { throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected unspent output"); } - const bool is_locked = - pwallet->IsLockedCoin(outpt.GetTxId(), outpt.GetN()); + const bool is_locked = pwallet->IsLockedCoin(outpt); if (fUnlock && !is_locked) { throw JSONRPCError(RPC_INVALID_PARAMETER, diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -892,11 +892,11 @@ const CoinSelectionParams &coin_selection_params, bool &bnb_used) const; - bool IsSpent(const TxId &txid, uint32_t n) const; + bool IsSpent(const COutPoint &outpoint) const; std::vector GroupOutputs(const std::vector &outputs, bool single_coin) const; - bool IsLockedCoin(const TxId &txid, uint32_t n) const; + bool IsLockedCoin(const COutPoint &outpoint) const; void LockCoin(const COutPoint &output); void UnlockCoin(const COutPoint &output); void UnlockAllCoins(); diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -652,8 +652,7 @@ /** * Outpoint is spent if any non-conflicted transaction, spends it: */ -bool CWallet::IsSpent(const TxId &txid, uint32_t n) const { - const COutPoint outpoint(txid, n); +bool CWallet::IsSpent(const COutPoint &outpoint) const { std::pair range = mapTxSpends.equal_range(outpoint); @@ -2033,8 +2032,9 @@ } Amount nCredit = Amount::zero(); + const TxId &txid = GetId(); for (uint32_t i = 0; i < tx->vout.size(); i++) { - if (!pwallet->IsSpent(GetId(), i)) { + if (!pwallet->IsSpent(COutPoint(txid, i))) { const CTxOut &txout = tx->vout[i]; nCredit += pwallet->GetCredit(txout, ISMINE_SPENDABLE); if (!MoneyRange(nCredit)) { @@ -2079,8 +2079,9 @@ } Amount nCredit = Amount::zero(); + const TxId &txid = GetId(); for (uint32_t i = 0; i < tx->vout.size(); i++) { - if (!pwallet->IsSpent(GetId(), i)) { + if (!pwallet->IsSpent(COutPoint(txid, i))) { const CTxOut &txout = tx->vout[i]; nCredit += pwallet->GetCredit(txout, ISMINE_WATCH_ONLY); if (!MoneyRange(nCredit)) { @@ -2447,17 +2448,19 @@ continue; } + const COutPoint outpoint(wtxid, i); + if (coinControl && coinControl->HasSelected() && !coinControl->fAllowOtherInputs && - !coinControl->IsSelected(COutPoint(entry.first, i))) { + !coinControl->IsSelected(outpoint)) { continue; } - if (IsLockedCoin(entry.first, i)) { + if (IsLockedCoin(outpoint)) { continue; } - if (IsSpent(wtxid, i)) { + if (IsSpent(outpoint)) { continue; } @@ -3779,7 +3782,7 @@ continue; } - Amount n = IsSpent(walletEntry.first, i) + Amount n = IsSpent(COutPoint(walletEntry.first, i)) ? Amount::zero() : pcoin->tx->vout[i].nValue; @@ -4013,12 +4016,11 @@ setLockedCoins.clear(); } -bool CWallet::IsLockedCoin(const TxId &txid, uint32_t n) const { +bool CWallet::IsLockedCoin(const COutPoint &outpoint) const { // setLockedCoins AssertLockHeld(cs_wallet); - COutPoint outpt(txid, n); - return setLockedCoins.count(outpt) > 0; + return setLockedCoins.count(outpoint) > 0; } void CWallet::ListLockedCoins(std::vector &vOutpts) const {