Merge bitcoin/bitcoin#26084: sendall: check if the maxtxfee has been exceeded

6f8e3818af sendall: check if the maxtxfee has been exceeded (ishaanam)

Pull request description:

  Previously the `sendall` RPC didn't check whether the fees of the transaction it creates exceed the set `maxtxfee`. This PR adds this check to `sendall` and a test case for it.

ACKs for top commit:
  achow101:
    ACK 6f8e3818af
  Xekyo:
    ACK 6f8e3818af
  glozow:
    Concept ACK 6f8e3818af. The high feerate is unlikely but sendall should respect the existing wallet options.

Tree-SHA512: 6ef0961937091293d49be16f17e4451cff3159d901c0c7c6e508883999dfe0c20ed4d7126bf74bfea8150d4c1eef961a45f0c28ef64562e6cb817fede2319f1a
This commit is contained in:
MacroFake 2022-09-15 08:45:04 +02:00
commit 718304d222
No known key found for this signature in database
GPG key ID: CE2B75697E69A548
2 changed files with 19 additions and 0 deletions

View file

@ -1402,6 +1402,10 @@ RPCHelpMan sendall()
const CAmount fee_from_size{fee_rate.GetFee(tx_size.vsize)};
const CAmount effective_value{total_input_value - fee_from_size};
if (fee_from_size > pwallet->m_default_max_tx_fee) {
throw JSONRPCError(RPC_WALLET_ERROR, TransactionErrorString(TransactionError::MAX_FEE_EXCEEDED).original);
}
if (effective_value <= 0) {
if (send_max) {
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, "Total value of UTXO pool too low to pay for transaction, try using lower feerate.");

View file

@ -264,6 +264,18 @@ class SendallTest(BitcoinTestFramework):
recipients=[self.remainder_target],
options={"inputs": [utxo], "send_max": True})
@cleanup
def sendall_fails_on_high_fee(self):
self.log.info("Test sendall fails if the transaction fee exceeds the maxtxfee")
self.add_utxos([21])
assert_raises_rpc_error(
-4,
"Fee exceeds maximum configured by user",
self.wallet.sendall,
recipients=[self.remainder_target],
fee_rate=100000)
def run_test(self):
self.nodes[0].createwallet("activewallet")
self.wallet = self.nodes[0].get_wallet_rpc("activewallet")
@ -312,5 +324,8 @@ class SendallTest(BitcoinTestFramework):
# Sendall fails when using send_max while specifying inputs
self.sendall_fails_on_specific_inputs_with_send_max()
# Sendall fails when providing a fee that is too high
self.sendall_fails_on_high_fee()
if __name__ == '__main__':
SendallTest().main()