Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_avoidreuse.py
Show First 20 Lines • Show All 144 Lines • ▼ Show 20 Lines | def test_immutable(self): | ||||
assert_raises_rpc_error(-8, | assert_raises_rpc_error(-8, | ||||
"Wallet flag is immutable", | "Wallet flag is immutable", | ||||
self.nodes[1].setwalletflag, | self.nodes[1].setwalletflag, | ||||
'disable_private_keys') | 'disable_private_keys') | ||||
tempwallet = ".wallet_avoidreuse.py_test_immutable_wallet.dat" | tempwallet = ".wallet_avoidreuse.py_test_immutable_wallet.dat" | ||||
# Create a wallet with disable_private_keys set; this should work | # Create a wallet with disable_private_keys set; this should work | ||||
self.nodes[1].createwallet(tempwallet, True) | self.nodes[1].createwallet( | ||||
wallet_name=tempwallet, | |||||
disable_private_keys=True) | |||||
w = self.nodes[1].get_wallet_rpc(tempwallet) | w = self.nodes[1].get_wallet_rpc(tempwallet) | ||||
# Attempt to unset the disable_private_keys flag; this should not work | # Attempt to unset the disable_private_keys flag; this should not work | ||||
assert_raises_rpc_error(-8, | assert_raises_rpc_error(-8, | ||||
"Wallet flag is immutable", | "Wallet flag is immutable", | ||||
w.setwalletflag, | w.setwalletflag, | ||||
'disable_private_keys', | 'disable_private_keys', | ||||
False) | False) | ||||
▲ Show 20 Lines • Show All 137 Lines • ▼ Show 20 Lines | def test_sending_from_reused_address_fails(self): | ||||
self.nodes[1], | self.nodes[1], | ||||
total_count=1, | total_count=1, | ||||
total_sum=5, | total_sum=5, | ||||
reused_supported=True, | reused_supported=True, | ||||
reused_count=0) | reused_count=0) | ||||
# getbalances should show no used, 5 BCH trusted | # getbalances should show no used, 5 BCH trusted | ||||
assert_balances(self.nodes[1], mine={"used": 0, "trusted": 5}) | assert_balances(self.nodes[1], mine={"used": 0, "trusted": 5}) | ||||
if not self.options.descriptors: | |||||
# For the second send, we transmute it to a related single-key address | # For the second send, we transmute it to a related single-key address | ||||
# to make sure it's also detected as re-use | # to make sure it's also detected as re-use | ||||
# NB: this is not very useful for ABC, but we keep the new variable | # NB: this is not very useful for ABC, but we keep the new variable | ||||
# name for consistency. | # name for consistency. | ||||
new_fundaddr = fundaddr | new_fundaddr = fundaddr | ||||
self.nodes[0].sendtoaddress(new_fundaddr, 10) | self.nodes[0].sendtoaddress(new_fundaddr, 10) | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
self.sync_all() | self.sync_all() | ||||
# listunspent should show 2 total outputs (5, 10 BCH), one unused (5), | # listunspent should show 2 total outputs (5, 10 BCH), one unused (5), | ||||
# one reused (10) | # one reused (10) | ||||
assert_unspent( | assert_unspent( | ||||
self.nodes[1], | self.nodes[1], | ||||
total_count=2, | total_count=2, | ||||
total_sum=15, | total_sum=15, | ||||
reused_count=1, | reused_count=1, | ||||
reused_sum=10) | reused_sum=10) | ||||
# getbalances should show 10 used, 5 BCH trusted | # getbalances should show 10 used, 5 BCH trusted | ||||
assert_balances(self.nodes[1], mine={"used": 10, "trusted": 5}) | assert_balances(self.nodes[1], mine={"used": 10, "trusted": 5}) | ||||
# node 1 should now have a balance of 5 (no dirty) or 15 (including | # node 1 should now have a balance of 5 (no dirty) or 15 (including | ||||
# dirty) | # dirty) | ||||
assert_approx(self.nodes[1].getbalance(), 5, 0.001) | assert_approx(self.nodes[1].getbalance(), 5, 0.001) | ||||
assert_approx(self.nodes[1].getbalance(avoid_reuse=False), 15, 0.001) | assert_approx( | ||||
self.nodes[1].getbalance( | |||||
avoid_reuse=False), 15, 0.001) | |||||
assert_raises_rpc_error(-6, "Insufficient funds", | assert_raises_rpc_error(-6, "Insufficient funds", | ||||
self.nodes[1].sendtoaddress, retaddr, 10) | self.nodes[1].sendtoaddress, retaddr, 10) | ||||
self.nodes[1].sendtoaddress(retaddr, 4) | self.nodes[1].sendtoaddress(retaddr, 4) | ||||
# listunspent should show 2 total outputs (1, 10 BCH), one unused (1), | # listunspent should show 2 total outputs (1, 10 BCH), one unused (1), | ||||
# one reused (10) | # one reused (10) | ||||
assert_unspent( | assert_unspent( | ||||
self.nodes[1], | self.nodes[1], | ||||
total_count=2, | total_count=2, | ||||
total_sum=11, | total_sum=11, | ||||
reused_count=1, | reused_count=1, | ||||
reused_sum=10) | reused_sum=10) | ||||
# getbalances should show 10 used, 1 BCH trusted | # getbalances should show 10 used, 1 BCH trusted | ||||
assert_balances(self.nodes[1], mine={"used": 10, "trusted": 1}) | assert_balances(self.nodes[1], mine={"used": 10, "trusted": 1}) | ||||
# node 1 should now have about 1 BCH left (no dirty) and 11 (including | # node 1 should now have about 1 BCH left (no dirty) and 11 (including | ||||
# dirty) | # dirty) | ||||
assert_approx(self.nodes[1].getbalance(), 1, 0.001) | assert_approx(self.nodes[1].getbalance(), 1, 0.001) | ||||
assert_approx(self.nodes[1].getbalance(avoid_reuse=False), 11, 0.001) | assert_approx( | ||||
self.nodes[1].getbalance( | |||||
avoid_reuse=False), 11, 0.001) | |||||
def test_getbalances_used(self): | def test_getbalances_used(self): | ||||
''' | ''' | ||||
getbalances and listunspent should pick up on reused addresses | getbalances and listunspent should pick up on reused addresses | ||||
immediately, even for address reusing outputs created before the first | immediately, even for address reusing outputs created before the first | ||||
transaction was spending from that address | transaction was spending from that address | ||||
''' | ''' | ||||
self.log.info("Test getbalances used category") | self.log.info("Test getbalances used category") | ||||
▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines |