diff --git a/src/wallet/feebumper.cpp b/src/wallet/feebumper.cpp index 0b135efa51..3d05d24d67 100644 --- a/src/wallet/feebumper.cpp +++ b/src/wallet/feebumper.cpp @@ -207,7 +207,7 @@ Result CreateRateBumpTransaction(CWallet& wallet, const uint256& txid, const CCo if (coin_control.m_feerate) { // The user provided a feeRate argument. // We calculate this here to avoid compiler warning on the cs_wallet lock - const int64_t maxTxSize = CalculateMaximumSignedTxSize(*wtx.tx, &wallet).first; + const int64_t maxTxSize{CalculateMaximumSignedTxSize(*wtx.tx, &wallet).vsize}; Result res = CheckFeeRate(wallet, wtx, *new_coin_control.m_feerate, maxTxSize, errors); if (res != Result::OK) { return res; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index c22a088360..146f776c7b 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1675,7 +1675,7 @@ bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const CCoinControl* coin_control) +TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const CCoinControl* coin_control) { std::vector txouts; // Look up the inputs. The inputs are either in the wallet, or in coin_control. @@ -1687,27 +1687,27 @@ std::pair CalculateMaximumSignedTxSize(const CTransaction &tx, } else if (coin_control) { CTxOut txout; if (!coin_control->GetExternalOutput(input.prevout, txout)) { - return std::make_pair(-1, -1); + return TxSize{-1, -1}; } txouts.emplace_back(txout); } else { - return std::make_pair(-1, -1); + return TxSize{-1, -1}; } } return CalculateMaximumSignedTxSize(tx, wallet, txouts, coin_control); } // txouts needs to be in the order of tx.vin -std::pair CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector& txouts, const CCoinControl* coin_control) +TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector& txouts, const CCoinControl* coin_control) { CMutableTransaction txNew(tx); if (!wallet->DummySignTx(txNew, txouts, coin_control)) { - return std::make_pair(-1, -1); + return TxSize{-1, -1}; } CTransaction ctx(txNew); int64_t vsize = GetVirtualTransactionSize(ctx); int64_t weight = GetTransactionWeight(ctx); - return std::make_pair(vsize, weight); + return TxSize{vsize, weight}; } int CalculateMaximumSignedInputSize(const CTxOut& txout, const SigningProvider* provider, bool use_max_sig) { @@ -3311,7 +3311,7 @@ bool CWallet::CreateTransactionInternal( CMutableTransaction txNew; FeeCalculation feeCalc; - std::pair tx_sizes; + TxSize tx_sizes; int nBytes; { std::set setCoins; @@ -3736,7 +3736,7 @@ bool CWallet::CreateTransactionInternal( // end ELEMENTS // Calculate the transaction fee - nBytes = tx_sizes.first; + nBytes = tx_sizes.vsize; if (nBytes < 0) { error = _("Signing transaction failed"); return false; @@ -3780,7 +3780,7 @@ bool CWallet::CreateTransactionInternal( // Because we have dropped this change, the tx size and required fee will be different, so let's recalculate those tx_sizes = CalculateMaximumSignedTxSize(CTransaction(tx_blinded), this, &coin_control); - nBytes = tx_sizes.first; + nBytes = tx_sizes.vsize; fee_needed = coin_selection_params.m_effective_feerate.GetFee(nBytes); } @@ -3950,7 +3950,7 @@ bool CWallet::CreateTransactionInternal( // Limit size if ((sign && GetTransactionWeight(*tx) > MAX_STANDARD_TX_WEIGHT) || - (!sign && tx_sizes.second > MAX_STANDARD_TX_WEIGHT)) + (!sign && tx_sizes.weight > MAX_STANDARD_TX_WEIGHT)) { error = _("Transaction too large"); return false; diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 25ce311c49..70ed8ca701 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1501,12 +1501,17 @@ public: } }; +struct TxSize { + int64_t vsize{-1}; + int64_t weight{-1}; +}; + /** Calculate the size of the transaction assuming all signatures are max size * Use DummySignatureCreator, which inserts 71 byte signatures everywhere. * NOTE: this requires that all inputs must be in mapWallet (eg the tx should * be IsAllFromMe). */ -std::pair CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const CCoinControl* coin_control = nullptr) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet); -std::pair CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector& txouts, const CCoinControl* coin_control = nullptr); +TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const CCoinControl* coin_control = nullptr) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet); +TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector& txouts, const CCoinControl* coin_control = nullptr); //! Add wallet name to persistent configuration so it will be loaded on startup. bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name);