mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-23 07:15:29 +01:00
test: Call ceildiv helper with integer
It returns an incorrect result when called with a Decimal, for which the "//" operator works differently. Also drop unnecessary call to satoshi_round.
This commit is contained in:
parent
219d728fcb
commit
d1fab9d5d2
2 changed files with 14 additions and 6 deletions
|
@ -36,6 +36,7 @@ def assert_approx(v, vexp, vspan=0.00001):
|
||||||
|
|
||||||
def assert_fee_amount(fee, tx_size, feerate_BTC_kvB):
|
def assert_fee_amount(fee, tx_size, feerate_BTC_kvB):
|
||||||
"""Assert the fee is in range."""
|
"""Assert the fee is in range."""
|
||||||
|
assert isinstance(tx_size, int)
|
||||||
target_fee = get_fee(tx_size, feerate_BTC_kvB)
|
target_fee = get_fee(tx_size, feerate_BTC_kvB)
|
||||||
if fee < target_fee:
|
if fee < target_fee:
|
||||||
raise AssertionError("Fee of %s BTC too low! (Should be %s BTC)" % (str(fee), str(target_fee)))
|
raise AssertionError("Fee of %s BTC too low! (Should be %s BTC)" % (str(fee), str(target_fee)))
|
||||||
|
@ -219,7 +220,13 @@ def str_to_b64str(string):
|
||||||
|
|
||||||
|
|
||||||
def ceildiv(a, b):
|
def ceildiv(a, b):
|
||||||
"""Divide 2 ints and round up to next int rather than round down"""
|
"""
|
||||||
|
Divide 2 ints and round up to next int rather than round down
|
||||||
|
Implementation requires python integers, which have a // operator that does floor division.
|
||||||
|
Other types like decimal.Decimal whose // operator truncates towards 0 will not work.
|
||||||
|
"""
|
||||||
|
assert isinstance(a, int)
|
||||||
|
assert isinstance(b, int)
|
||||||
return -(-a // b)
|
return -(-a // b)
|
||||||
|
|
||||||
|
|
||||||
|
@ -227,7 +234,7 @@ def get_fee(tx_size, feerate_btc_kvb):
|
||||||
"""Calculate the fee in BTC given a feerate is BTC/kvB. Reflects CFeeRate::GetFee"""
|
"""Calculate the fee in BTC given a feerate is BTC/kvB. Reflects CFeeRate::GetFee"""
|
||||||
feerate_sat_kvb = int(feerate_btc_kvb * Decimal(1e8)) # Fee in sat/kvb as an int to avoid float precision errors
|
feerate_sat_kvb = int(feerate_btc_kvb * Decimal(1e8)) # Fee in sat/kvb as an int to avoid float precision errors
|
||||||
target_fee_sat = ceildiv(feerate_sat_kvb * tx_size, 1000) # Round calculated fee up to nearest sat
|
target_fee_sat = ceildiv(feerate_sat_kvb * tx_size, 1000) # Round calculated fee up to nearest sat
|
||||||
return satoshi_round(target_fee_sat / Decimal(1e8)) # Truncate BTC result to nearest sat
|
return target_fee_sat / Decimal(1e8) # Return result in BTC
|
||||||
|
|
||||||
|
|
||||||
def satoshi_round(amount):
|
def satoshi_round(amount):
|
||||||
|
|
|
@ -16,6 +16,7 @@ from test_framework.util import (
|
||||||
assert_fee_amount,
|
assert_fee_amount,
|
||||||
assert_greater_than,
|
assert_greater_than,
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
|
count_bytes,
|
||||||
)
|
)
|
||||||
from test_framework.wallet_util import bytes_to_wif
|
from test_framework.wallet_util import bytes_to_wif
|
||||||
|
|
||||||
|
@ -320,20 +321,20 @@ class WalletSendTest(BitcoinTestFramework):
|
||||||
|
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, fee_rate=7, add_to_wallet=False)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, fee_rate=7, add_to_wallet=False)
|
||||||
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
||||||
assert_fee_amount(fee, Decimal(len(res["hex"]) / 2), Decimal("0.00007"))
|
assert_fee_amount(fee, count_bytes(res["hex"]), Decimal("0.00007"))
|
||||||
|
|
||||||
# "unset" and None are treated the same for estimate_mode
|
# "unset" and None are treated the same for estimate_mode
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, fee_rate=2, estimate_mode="unset", add_to_wallet=False)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, fee_rate=2, estimate_mode="unset", add_to_wallet=False)
|
||||||
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
||||||
assert_fee_amount(fee, Decimal(len(res["hex"]) / 2), Decimal("0.00002"))
|
assert_fee_amount(fee, count_bytes(res["hex"]), Decimal("0.00002"))
|
||||||
|
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=4.531, add_to_wallet=False)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=4.531, add_to_wallet=False)
|
||||||
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
||||||
assert_fee_amount(fee, Decimal(len(res["hex"]) / 2), Decimal("0.00004531"))
|
assert_fee_amount(fee, count_bytes(res["hex"]), Decimal("0.00004531"))
|
||||||
|
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=3, add_to_wallet=False)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=3, add_to_wallet=False)
|
||||||
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
fee = self.nodes[1].decodepsbt(res["psbt"])["fee"]
|
||||||
assert_fee_amount(fee, Decimal(len(res["hex"]) / 2), Decimal("0.00003"))
|
assert_fee_amount(fee, count_bytes(res["hex"]), Decimal("0.00003"))
|
||||||
|
|
||||||
# Test that passing fee_rate as both an argument and an option raises.
|
# Test that passing fee_rate as both an argument and an option raises.
|
||||||
self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=1, fee_rate=1, add_to_wallet=False,
|
self.test_send(from_wallet=w0, to_wallet=w1, amount=1, arg_fee_rate=1, fee_rate=1, add_to_wallet=False,
|
||||||
|
|
Loading…
Add table
Reference in a new issue