aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/feebumper.cpp
diff options
context:
space:
mode:
authorezegom <ezegom@bu.edu>2019-07-29 17:43:43 -0400
committerGregory Sanders <gsanders87@gmail.com>2019-08-26 12:25:36 -0400
commit1a4c791cf49ff15aa9deba4388c0180b8f47f15b (patch)
tree0112dea42c32f239bdb086b76542d24e4c573142 /src/wallet/feebumper.cpp
parentadff8fe32101b2c007a85415c3ec565a7f137252 (diff)
rpc bumpfee: move feerate estimation logic into separate method
Diffstat (limited to 'src/wallet/feebumper.cpp')
-rw-r--r--src/wallet/feebumper.cpp54
1 files changed, 29 insertions, 25 deletions
diff --git a/src/wallet/feebumper.cpp b/src/wallet/feebumper.cpp
index 619197a57a..1e25d4ee28 100644
--- a/src/wallet/feebumper.cpp
+++ b/src/wallet/feebumper.cpp
@@ -57,6 +57,34 @@ static feebumper::Result PreconditionChecks(interfaces::Chain::Lock& locked_chai
return feebumper::Result::OK;
}
+static CFeeRate EstimateFeeRate(CWallet* wallet, const CWalletTx& wtx, CCoinControl& coin_control, CAmount& old_fee)
+{
+ // Get the fee rate of the original transaction. This is calculated from
+ // the tx fee/vsize, so it may have been rounded down. Add 1 satoshi to the
+ // result.
+ old_fee = wtx.GetDebit(ISMINE_SPENDABLE) - wtx.tx->GetValueOut();
+ int64_t txSize = GetVirtualTransactionSize(*(wtx.tx));
+ CFeeRate feerate(old_fee, txSize);
+ feerate += CFeeRate(1);
+
+ // The node has a configurable incremental relay fee. Increment the fee by
+ // the minimum of that and the wallet's conservative
+ // WALLET_INCREMENTAL_RELAY_FEE value to future proof against changes to
+ // network wide policy for incremental relay fee that our node may not be
+ // aware of. This ensures we're over the over the required relay fee rate
+ // (BIP 125 rule 4). The replacement tx will be at least as large as the
+ // original tx, so the total fee will be greater (BIP 125 rule 3)
+ CFeeRate node_incremental_relay_fee = wallet->chain().relayIncrementalFee();
+ CFeeRate wallet_incremental_relay_fee = CFeeRate(WALLET_INCREMENTAL_RELAY_FEE);
+ feerate += std::max(node_incremental_relay_fee, wallet_incremental_relay_fee);
+
+ // Fee rate must also be at least the wallet's GetMinimumFeeRate
+ CFeeRate min_feerate(GetMinimumFeeRate(*wallet, coin_control, /* feeCalc */ nullptr));
+
+ // Set the required fee rate for the replacement transaction in coin control.
+ return std::max(feerate, min_feerate);
+}
+
namespace feebumper {
bool TransactionCanBeBumped(const CWallet* wallet, const uint256& txid)
@@ -230,31 +258,7 @@ Result CreateRateBumpTransaction(CWallet* wallet, const uint256& txid, const CCo
}
}
- // Get the fee rate of the original transaction. This is calculated from
- // the tx fee/vsize, so it may have been rounded down. Add 1 satoshi to the
- // result.
- old_fee = wtx.GetDebit(ISMINE_SPENDABLE) - wtx.tx->GetValueOut();
- int64_t txSize = GetVirtualTransactionSize(*(wtx.tx));
- // Feerate of thing we are bumping
- CFeeRate feerate(old_fee, txSize);
- feerate += CFeeRate(1);
-
- // The node has a configurable incremental relay fee. Increment the fee by
- // the minimum of that and the wallet's conservative
- // WALLET_INCREMENTAL_RELAY_FEE value to future proof against changes to
- // network wide policy for incremental relay fee that our node may not be
- // aware of. This ensures we're over the over the required relay fee rate
- // (BIP 125 rule 4). The replacement tx will be at least as large as the
- // original tx, so the total fee will be greater (BIP 125 rule 3)
- CFeeRate node_incremental_relay_fee = wallet->chain().relayIncrementalFee();
- CFeeRate wallet_incremental_relay_fee = CFeeRate(WALLET_INCREMENTAL_RELAY_FEE);
- feerate += std::max(node_incremental_relay_fee, wallet_incremental_relay_fee);
-
- // Fee rate must also be at least the wallet's GetMinimumFeeRate
- CFeeRate min_feerate(GetMinimumFeeRate(*wallet, new_coin_control, /* feeCalc */ nullptr));
-
- // Set the required fee rate for the replacement transaction in coin control.
- new_coin_control.m_feerate = std::max(feerate, min_feerate);
+ new_coin_control.m_feerate = EstimateFeeRate(wallet, wtx, new_coin_control, old_fee);
// Fill in required inputs we are double-spending(all of them)
// N.B.: bip125 doesn't require all the inputs in the replaced transaction to be