mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-29 05:22:30 +02:00
Replace size/weight estimate tuple with struct for named fields
This commit is contained in:
parent
3ad1b8899b
commit
881a3e2e17
@ -190,7 +190,7 @@ Result CreateRateBumpTransaction(CWallet& wallet, const uint256& txid, const CCo
|
|||||||
if (coin_control.m_feerate) {
|
if (coin_control.m_feerate) {
|
||||||
// The user provided a feeRate argument.
|
// The user provided a feeRate argument.
|
||||||
// We calculate this here to avoid compiler warning on the cs_wallet lock
|
// 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);
|
Result res = CheckFeeRate(wallet, wtx, *new_coin_control.m_feerate, maxTxSize, errors);
|
||||||
if (res != Result::OK) {
|
if (res != Result::OK) {
|
||||||
return res;
|
return res;
|
||||||
|
@ -1627,15 +1627,14 @@ bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set<CScri
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns pair of vsize and weight
|
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
|
||||||
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
|
|
||||||
{
|
{
|
||||||
std::vector<CTxOut> txouts;
|
std::vector<CTxOut> txouts;
|
||||||
for (const CTxIn& input : tx.vin) {
|
for (const CTxIn& input : tx.vin) {
|
||||||
const auto mi = wallet->mapWallet.find(input.prevout.hash);
|
const auto mi = wallet->mapWallet.find(input.prevout.hash);
|
||||||
// Can not estimate size without knowing the input details
|
// Can not estimate size without knowing the input details
|
||||||
if (mi == wallet->mapWallet.end()) {
|
if (mi == wallet->mapWallet.end()) {
|
||||||
return std::make_pair(-1, -1);
|
return TxSize{-1, -1};
|
||||||
}
|
}
|
||||||
assert(input.prevout.n < mi->second.tx->vout.size());
|
assert(input.prevout.n < mi->second.tx->vout.size());
|
||||||
txouts.emplace_back(mi->second.tx->vout[input.prevout.n]);
|
txouts.emplace_back(mi->second.tx->vout[input.prevout.n]);
|
||||||
@ -1644,16 +1643,16 @@ std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// txouts needs to be in the order of tx.vin
|
// txouts needs to be in the order of tx.vin
|
||||||
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig)
|
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig)
|
||||||
{
|
{
|
||||||
CMutableTransaction txNew(tx);
|
CMutableTransaction txNew(tx);
|
||||||
if (!wallet->DummySignTx(txNew, txouts, use_max_sig)) {
|
if (!wallet->DummySignTx(txNew, txouts, use_max_sig)) {
|
||||||
return std::make_pair(-1, -1);
|
return TxSize{-1, -1};
|
||||||
}
|
}
|
||||||
CTransaction ctx(txNew);
|
CTransaction ctx(txNew);
|
||||||
int64_t vsize = GetVirtualTransactionSize(ctx);
|
int64_t vsize = GetVirtualTransactionSize(ctx);
|
||||||
int64_t weight = GetTransactionWeight(ctx);
|
int64_t weight = GetTransactionWeight(ctx);
|
||||||
return std::make_pair(vsize, weight);
|
return TxSize{vsize, weight};
|
||||||
}
|
}
|
||||||
|
|
||||||
int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet, bool use_max_sig)
|
int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet, bool use_max_sig)
|
||||||
@ -2820,7 +2819,7 @@ bool CWallet::CreateTransactionInternal(
|
|||||||
|
|
||||||
CMutableTransaction txNew;
|
CMutableTransaction txNew;
|
||||||
FeeCalculation feeCalc;
|
FeeCalculation feeCalc;
|
||||||
std::pair<int64_t, int64_t> tx_sizes;
|
TxSize tx_sizes;
|
||||||
int nBytes;
|
int nBytes;
|
||||||
{
|
{
|
||||||
std::set<CInputCoin> setCoins;
|
std::set<CInputCoin> setCoins;
|
||||||
@ -2967,7 +2966,7 @@ bool CWallet::CreateTransactionInternal(
|
|||||||
|
|
||||||
// Calculate the transaction fee
|
// Calculate the transaction fee
|
||||||
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
||||||
nBytes = tx_sizes.first;
|
nBytes = tx_sizes.vsize;
|
||||||
if (nBytes < 0) {
|
if (nBytes < 0) {
|
||||||
error = _("Signing transaction failed");
|
error = _("Signing transaction failed");
|
||||||
return false;
|
return false;
|
||||||
@ -2992,7 +2991,7 @@ bool CWallet::CreateTransactionInternal(
|
|||||||
|
|
||||||
// Because we have dropped this change, the tx size and required fee will be different, so let's recalculate those
|
// Because we have dropped this change, the tx size and required fee will be different, so let's recalculate those
|
||||||
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
||||||
nBytes = tx_sizes.first;
|
nBytes = tx_sizes.vsize;
|
||||||
fee_needed = coin_selection_params.m_effective_feerate.GetFee(nBytes);
|
fee_needed = coin_selection_params.m_effective_feerate.GetFee(nBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3072,7 +3071,7 @@ bool CWallet::CreateTransactionInternal(
|
|||||||
|
|
||||||
// Limit size
|
// Limit size
|
||||||
if ((sign && GetTransactionWeight(*tx) > MAX_STANDARD_TX_WEIGHT) ||
|
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");
|
error = _("Transaction too large");
|
||||||
return false;
|
return false;
|
||||||
|
@ -1346,12 +1346,17 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TxSize {
|
||||||
|
int64_t vsize{-1};
|
||||||
|
int64_t weight{-1};
|
||||||
|
};
|
||||||
|
|
||||||
/** Calculate the size of the transaction assuming all signatures are max size
|
/** Calculate the size of the transaction assuming all signatures are max size
|
||||||
* Use DummySignatureCreator, which inserts 71 byte signatures everywhere.
|
* Use DummySignatureCreator, which inserts 71 byte signatures everywhere.
|
||||||
* NOTE: this requires that all inputs must be in mapWallet (eg the tx should
|
* NOTE: this requires that all inputs must be in mapWallet (eg the tx should
|
||||||
* be IsAllFromMe). */
|
* be IsAllFromMe). */
|
||||||
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig = false) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet);
|
TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, bool use_max_sig = false) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet);
|
||||||
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig = false);
|
TxSize CalculateMaximumSignedTxSize(const CTransaction& tx, const CWallet* wallet, const std::vector<CTxOut>& txouts, bool use_max_sig = false);
|
||||||
|
|
||||||
//! Add wallet name to persistent configuration so it will be loaded on startup.
|
//! Add wallet name to persistent configuration so it will be loaded on startup.
|
||||||
bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name);
|
bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name);
|
||||||
|
Loading…
Reference in New Issue
Block a user