|
|
|
@ -1594,14 +1594,15 @@ bool CWallet::ImportScriptPubKeys(const std::string& label, const std::set<CScri
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int64_t CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
|
|
|
|
|
// Returns pair of vsize and weight
|
|
|
|
|
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, bool use_max_sig)
|
|
|
|
|
{
|
|
|
|
|
std::vector<CTxOut> txouts;
|
|
|
|
|
for (const CTxIn& input : tx.vin) {
|
|
|
|
|
const auto mi = wallet->mapWallet.find(input.prevout.hash);
|
|
|
|
|
// Can not estimate size without knowing the input details
|
|
|
|
|
if (mi == wallet->mapWallet.end()) {
|
|
|
|
|
return -1;
|
|
|
|
|
return std::make_pair(-1, -1);
|
|
|
|
|
}
|
|
|
|
|
assert(input.prevout.n < mi->second.tx->vout.size());
|
|
|
|
|
txouts.emplace_back(mi->second.tx->vout[input.prevout.n]);
|
|
|
|
@ -1610,13 +1611,16 @@ int64_t CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wall
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// txouts needs to be in the order of tx.vin
|
|
|
|
|
int64_t CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig)
|
|
|
|
|
std::pair<int64_t, int64_t> CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector<CTxOut>& txouts, bool use_max_sig)
|
|
|
|
|
{
|
|
|
|
|
CMutableTransaction txNew(tx);
|
|
|
|
|
if (!wallet->DummySignTx(txNew, txouts, use_max_sig)) {
|
|
|
|
|
return -1;
|
|
|
|
|
return std::make_pair(-1, -1);
|
|
|
|
|
}
|
|
|
|
|
return GetVirtualTransactionSize(CTransaction(txNew));
|
|
|
|
|
CTransaction ctx(txNew);
|
|
|
|
|
int64_t vsize = GetVirtualTransactionSize(ctx);
|
|
|
|
|
int64_t weight = GetTransactionWeight(ctx);
|
|
|
|
|
return std::make_pair(vsize, weight);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int CalculateMaximumSignedInputSize(const CTxOut& txout, const CWallet* wallet, bool use_max_sig)
|
|
|
|
@ -2770,6 +2774,7 @@ bool CWallet::CreateTransactionInternal(
|
|
|
|
|
CMutableTransaction txNew;
|
|
|
|
|
FeeCalculation feeCalc;
|
|
|
|
|
CAmount nFeeNeeded;
|
|
|
|
|
std::pair<int64_t, int64_t> tx_sizes;
|
|
|
|
|
int nBytes;
|
|
|
|
|
{
|
|
|
|
|
std::set<CInputCoin> setCoins;
|
|
|
|
@ -2952,7 +2957,8 @@ bool CWallet::CreateTransactionInternal(
|
|
|
|
|
txNew.vin.push_back(CTxIn(coin.outpoint,CScript()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nBytes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
|
|
|
|
tx_sizes = CalculateMaximumSignedTxSize(CTransaction(txNew), this, coin_control.fAllowWatchOnly);
|
|
|
|
|
nBytes = tx_sizes.first;
|
|
|
|
|
if (nBytes < 0) {
|
|
|
|
|
error = _("Signing transaction failed");
|
|
|
|
|
return false;
|
|
|
|
|