diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp index d4ae5748bb6..1c176c6c8fb 100644 --- a/src/rpc/mempool.cpp +++ b/src/rpc/mempool.cpp @@ -315,7 +315,7 @@ static std::vector MempoolEntryDescription() void AppendChunkInfo(UniValue& all_chunks, FeePerWeight chunk_feerate, std::vector chunk_txs) { UniValue chunk(UniValue::VOBJ); - chunk.pushKV("chunkfee", ValueFromAmount((int)chunk_feerate.fee)); + chunk.pushKV("chunkfee", ValueFromAmount(chunk_feerate.fee)); chunk.pushKV("chunkweight", chunk_feerate.size); UniValue chunk_txids(UniValue::VARR); for (const auto& chunk_tx : chunk_txs) { @@ -383,7 +383,7 @@ static void entryToJSON(const CTxMemPool& pool, UniValue& info, const CTxMemPool fees.pushKV("modified", ValueFromAmount(e.GetModifiedFee())); fees.pushKV("ancestor", ValueFromAmount(ancestor_fees)); fees.pushKV("descendant", ValueFromAmount(descendant_fees)); - fees.pushKV("chunk", ValueFromAmount((int)feerate.fee)); + fees.pushKV("chunk", ValueFromAmount(feerate.fee)); info.pushKV("fees", std::move(fees)); const CTransaction& tx = e.GetTx(); diff --git a/test/functional/mining_prioritisetransaction.py b/test/functional/mining_prioritisetransaction.py index 44ce8a2b103..31ed6372f8f 100755 --- a/test/functional/mining_prioritisetransaction.py +++ b/test/functional/mining_prioritisetransaction.py @@ -36,6 +36,57 @@ class PrioritiseTransactionTest(BitcoinTestFramework): node.prioritisetransaction(txid, 0, -delta) assert_equal(node.getprioritisedtransactions(), {}) + def test_large_fee_bump(self): + self.log.info("Test that a large fee delta is honoured") + tx = self.wallet.create_self_transfer() + txid = tx["txid"] + fee_delta = int(86 * COIN) # large enough to not fit into (u)int32_t + self.nodes[0].prioritisetransaction(txid=txid, fee_delta=fee_delta) + assert_equal( + self.nodes[0].getprioritisedtransactions(), + { + txid: { + "fee_delta": fee_delta, + "in_mempool": False, + }, + }, + ) + self.nodes[0].sendrawtransaction(tx["hex"]) + expected_modified_fee = tx["fee"] + Decimal(fee_delta) / COIN + assert_equal( + self.nodes[0].getprioritisedtransactions(), + { + txid: { + "fee_delta": fee_delta, + "in_mempool": True, + "modified_fee": int(expected_modified_fee * COIN), + }, + }, + ) + # This transaction forms its own chunk. + mempool_entry = self.nodes[0].getrawmempool(verbose=True)[txid] + assert_equal(mempool_entry["fees"]["base"], tx["fee"]) + assert_equal(mempool_entry["fees"]["modified"], expected_modified_fee) + assert_equal(mempool_entry["fees"]["ancestor"], expected_modified_fee) + assert_equal(mempool_entry["fees"]["descendant"], expected_modified_fee) + assert_equal(mempool_entry["fees"]["chunk"], expected_modified_fee) + assert_equal(mempool_entry["chunkweight"], mempool_entry["weight"]) + append_chunk_info = self.nodes[0].getmempoolcluster(txid) + assert_equal( + append_chunk_info, + { + "clusterweight": mempool_entry["weight"], + "txcount": 1, + "chunks": [{ + "chunkfee": expected_modified_fee, + "chunkweight": mempool_entry["weight"], + "txs": [txid], + }], + }, + ) + self.generate(self.nodes[0], 1) + assert_equal(self.nodes[0].getprioritisedtransactions(), {}) + def test_replacement(self): self.log.info("Test tx prioritisation stays after a tx is replaced") conflicting_input = self.wallet.get_utxo() @@ -175,6 +226,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework): # Test `prioritisetransaction` invalid `fee_delta` assert_raises_rpc_error(-3, "JSON value of type string is not of expected type number", self.nodes[0].prioritisetransaction, txid=txid, fee_delta='foo') + self.test_large_fee_bump() self.test_replacement() self.test_diamond()