Skip to content

Commit 05227a3

Browse files
committed
tests for bumpfee / estimate_modes
* invalid parameter tests for bumpfee * add tests for no conf_target explicit estimate_modes
1 parent 3404c1b commit 05227a3

File tree

2 files changed

+147
-1
lines changed

2 files changed

+147
-1
lines changed

test/functional/wallet_basic.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,60 @@ def run_test(self):
219219
assert_equal(self.nodes[2].getbalance(), node_2_bal)
220220
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('10'), fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex']))
221221

222+
# Sendmany with explicit fee (BTC/kB)
223+
# Throw if no conf_target provided
224+
assert_raises_rpc_error(-8, "Selected estimate_mode requires a fee rate",
225+
self.nodes[2].sendmany,
226+
amounts={ address: 10 },
227+
estimate_mode='bTc/kB')
228+
# Throw if negative feerate
229+
assert_raises_rpc_error(-3, "Amount out of range",
230+
self.nodes[2].sendmany,
231+
amounts={ address: 10 },
232+
conf_target=-1,
233+
estimate_mode='bTc/kB')
234+
fee_per_kb = 0.0002500
235+
explicit_fee_per_byte = Decimal(fee_per_kb) / 1000
236+
txid = self.nodes[2].sendmany(
237+
amounts={ address: 10 },
238+
conf_target=fee_per_kb,
239+
estimate_mode='bTc/kB',
240+
)
241+
self.nodes[2].generate(1)
242+
self.sync_all(self.nodes[0:3])
243+
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), node_2_bal - Decimal('10'), explicit_fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex']))
244+
assert_equal(self.nodes[2].getbalance(), node_2_bal)
245+
node_0_bal += Decimal('10')
246+
assert_equal(self.nodes[0].getbalance(), node_0_bal)
247+
248+
# Sendmany with explicit fee (SAT/B)
249+
# Throw if no conf_target provided
250+
assert_raises_rpc_error(-8, "Selected estimate_mode requires a fee rate",
251+
self.nodes[2].sendmany,
252+
amounts={ address: 10 },
253+
estimate_mode='sat/b')
254+
# Throw if negative feerate
255+
assert_raises_rpc_error(-3, "Amount out of range",
256+
self.nodes[2].sendmany,
257+
amounts={ address: 10 },
258+
conf_target=-1,
259+
estimate_mode='sat/b')
260+
fee_sat_per_b = 2
261+
fee_per_kb = fee_sat_per_b / 100000.0
262+
explicit_fee_per_byte = Decimal(fee_per_kb) / 1000
263+
txid = self.nodes[2].sendmany(
264+
amounts={ address: 10 },
265+
conf_target=fee_sat_per_b,
266+
estimate_mode='sAT/b',
267+
)
268+
self.nodes[2].generate(1)
269+
self.sync_all(self.nodes[0:3])
270+
balance = self.nodes[2].getbalance()
271+
node_2_bal = self.check_fee_amount(balance, node_2_bal - Decimal('10'), explicit_fee_per_byte, self.get_vsize(self.nodes[2].gettransaction(txid)['hex']))
272+
assert_equal(balance, node_2_bal)
273+
node_0_bal += Decimal('10')
274+
assert_equal(self.nodes[0].getbalance(), node_0_bal)
275+
222276
self.start_node(3, self.nodes[3].extra_args)
223277
connect_nodes(self.nodes[0], 3)
224278
self.sync_all()
@@ -349,6 +403,74 @@ def run_test(self):
349403
self.nodes[0].generate(1)
350404
self.sync_all(self.nodes[0:3])
351405

406+
# send with explicit btc/kb fee
407+
self.log.info("test explicit fee (sendtoaddress as btc/kb)")
408+
self.nodes[0].generate(1)
409+
self.sync_all(self.nodes[0:3])
410+
prebalance = self.nodes[2].getbalance()
411+
assert prebalance > 2
412+
address = self.nodes[1].getnewaddress()
413+
# Throw if no conf_target provided
414+
assert_raises_rpc_error(-8, "Selected estimate_mode requires a fee rate",
415+
self.nodes[2].sendtoaddress,
416+
address=address,
417+
amount=1.0,
418+
estimate_mode='BTc/Kb')
419+
# Throw if negative feerate
420+
assert_raises_rpc_error(-3, "Amount out of range",
421+
self.nodes[2].sendtoaddress,
422+
address=address,
423+
amount=1.0,
424+
conf_target=-1,
425+
estimate_mode='btc/kb')
426+
txid = self.nodes[2].sendtoaddress(
427+
address=address,
428+
amount=1.0,
429+
conf_target=0.00002500,
430+
estimate_mode='btc/kb',
431+
)
432+
tx_size = self.get_vsize(self.nodes[2].gettransaction(txid)['hex'])
433+
self.sync_all(self.nodes[0:3])
434+
self.nodes[0].generate(1)
435+
self.sync_all(self.nodes[0:3])
436+
postbalance = self.nodes[2].getbalance()
437+
fee = prebalance - postbalance - Decimal('1')
438+
assert_fee_amount(fee, tx_size, Decimal('0.00002500'))
439+
440+
# send with explicit sat/b fee
441+
self.sync_all(self.nodes[0:3])
442+
self.log.info("test explicit fee (sendtoaddress as sat/b)")
443+
self.nodes[0].generate(1)
444+
prebalance = self.nodes[2].getbalance()
445+
assert prebalance > 2
446+
address = self.nodes[1].getnewaddress()
447+
# Throw if no conf_target provided
448+
assert_raises_rpc_error(-8, "Selected estimate_mode requires a fee rate",
449+
self.nodes[2].sendtoaddress,
450+
address=address,
451+
amount=1.0,
452+
estimate_mode='SAT/b')
453+
# Throw if negative feerate
454+
assert_raises_rpc_error(-3, "Amount out of range",
455+
self.nodes[2].sendtoaddress,
456+
address=address,
457+
amount=1.0,
458+
conf_target=-1,
459+
estimate_mode='SAT/b')
460+
txid = self.nodes[2].sendtoaddress(
461+
address=address,
462+
amount=1.0,
463+
conf_target=2,
464+
estimate_mode='SAT/B',
465+
)
466+
tx_size = self.get_vsize(self.nodes[2].gettransaction(txid)['hex'])
467+
self.sync_all(self.nodes[0:3])
468+
self.nodes[0].generate(1)
469+
self.sync_all(self.nodes[0:3])
470+
postbalance = self.nodes[2].getbalance()
471+
fee = prebalance - postbalance - Decimal('1')
472+
assert_fee_amount(fee, tx_size, Decimal('0.00002000'))
473+
352474
# 2. Import address from node2 to node1
353475
self.nodes[1].importaddress(address_to_import)
354476

test/functional/wallet_bumpfee.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def run_test(self):
7171

7272
self.log.info("Running tests")
7373
dest_address = peer_node.getnewaddress()
74+
test_invalid_parameters(rbf_node, dest_address)
7475
test_simple_bumpfee_succeeds(self, "default", rbf_node, peer_node, dest_address)
7576
test_simple_bumpfee_succeeds(self, "fee_rate", rbf_node, peer_node, dest_address)
7677
test_feerate_args(self, rbf_node, peer_node, dest_address)
@@ -92,6 +93,28 @@ def run_test(self):
9293
test_small_output_with_feerate_succeeds(self, rbf_node, dest_address)
9394
test_no_more_inputs_fails(self, rbf_node, dest_address)
9495

96+
def test_invalid_parameters(node, dest_address):
97+
txid = spend_one_input(node, dest_address)
98+
# invalid estimate mode
99+
assert_raises_rpc_error(-8, "Invalid estimate_mode parameter", node.bumpfee, txid, {
100+
"estimate_mode": "moo",
101+
})
102+
assert_raises_rpc_error(-3, "Expected type string", node.bumpfee, txid, {
103+
"estimate_mode": 38,
104+
})
105+
assert_raises_rpc_error(-3, "Expected type string", node.bumpfee, txid, {
106+
"estimate_mode": {
107+
"foo": "bar",
108+
},
109+
})
110+
assert_raises_rpc_error(-8, "Invalid estimate_mode parameter", node.bumpfee, txid, {
111+
"estimate_mode": Decimal("3.141592"),
112+
})
113+
# confTarget and conf_target
114+
assert_raises_rpc_error(-8, "confTarget and conf_target options should not both be set", node.bumpfee, txid, {
115+
"confTarget": 123,
116+
"conf_target": 456,
117+
})
95118

96119
def test_simple_bumpfee_succeeds(self, mode, rbf_node, peer_node, dest_address):
97120
self.log.info('Test simple bumpfee: {}'.format(mode))
@@ -127,9 +150,10 @@ def test_feerate_args(self, rbf_node, peer_node, dest_address):
127150
self.sync_mempools((rbf_node, peer_node))
128151
assert rbfid in rbf_node.getrawmempool() and rbfid in peer_node.getrawmempool()
129152

130-
assert_raises_rpc_error(-8, "confTarget can't be set with fee_rate. Please provide either a confirmation target in blocks for automatic fee estimation, or an explicit fee rate.", rbf_node.bumpfee, rbfid, {"fee_rate": NORMAL, "confTarget": 1})
153+
assert_raises_rpc_error(-8, "conf_target can't be set with fee_rate. Please provide either a confirmation target in blocks for automatic fee estimation, or an explicit fee rate.", rbf_node.bumpfee, rbfid, {"fee_rate": NORMAL, "confTarget": 1})
131154

132155
assert_raises_rpc_error(-3, "Unexpected key totalFee", rbf_node.bumpfee, rbfid, {"totalFee": NORMAL})
156+
assert_raises_rpc_error(-8, "conf_target can't be set with fee_rate. Please provide either a confirmation target in blocks for automatic fee estimation, or an explicit fee rate.", rbf_node.bumpfee, rbfid, {"fee_rate":0.00001, "confTarget": 1})
133157

134158
# Bumping to just above minrelay should fail to increase total fee enough, at least
135159
assert_raises_rpc_error(-8, "Insufficient total fee", rbf_node.bumpfee, rbfid, {"fee_rate": INSUFFICIENT})

0 commit comments

Comments
 (0)