Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_avoidreuse.py
Show First 20 Lines • Show All 143 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 148 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=5000000, | total_sum=5000000, | ||||
reused_supported=True, | reused_supported=True, | ||||
reused_count=0) | reused_count=0) | ||||
# getbalances should show no used, 5MM XEC trusted | # getbalances should show no used, 5MM XEC trusted | ||||
assert_balances(self.nodes[1], mine={"used": 0, "trusted": 5000000}) | assert_balances(self.nodes[1], mine={"used": 0, "trusted": 5000000}) | ||||
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, 10000000) | self.nodes[0].sendtoaddress(new_fundaddr, 10000000) | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
self.sync_all() | self.sync_all() | ||||
# listunspent should show 2 total outputs (5MM, 10MM XEC), one unused | # listunspent should show 2 total outputs (5MM, 10MM XEC), one unused | ||||
# (5MM), one reused (10MM) | # (5MM), one reused (10MM) | ||||
assert_unspent( | assert_unspent( | ||||
self.nodes[1], | self.nodes[1], | ||||
total_count=2, | total_count=2, | ||||
total_sum=15000000, | total_sum=15000000, | ||||
reused_count=1, | reused_count=1, | ||||
reused_sum=10000000) | reused_sum=10000000) | ||||
# getbalances should show 10MM used, 5MM XEC trusted | # getbalances should show 10MM used, 5MM XEC trusted | ||||
assert_balances( | assert_balances( | ||||
self.nodes[1], | self.nodes[1], | ||||
mine={ | mine={ | ||||
"used": 10000000, | "used": 10000000, | ||||
"trusted": 5000000}) | "trusted": 5000000}) | ||||
# node 1 should now have a balance of 5MM (no dirty) or 15MM (including | # node 1 should now have a balance of 5MM (no dirty) or 15MM (including | ||||
# dirty) | # dirty) | ||||
assert_approx(self.nodes[1].getbalance(), 5000000, 1000) | assert_approx(self.nodes[1].getbalance(), 5000000, 1000) | ||||
assert_approx( | assert_approx(self.nodes[1].getbalance(avoid_reuse=False), | ||||
self.nodes[1].getbalance( | 15000000, 1000) | ||||
avoid_reuse=False), | |||||
15000000, | |||||
1000) | |||||
assert_raises_rpc_error(-6, "Insufficient funds", | assert_raises_rpc_error(-6, "Insufficient funds", | ||||
self.nodes[1].sendtoaddress, retaddr, 10000000) | self.nodes[1].sendtoaddress, retaddr, 10000000) | ||||
self.nodes[1].sendtoaddress(retaddr, 4000000) | self.nodes[1].sendtoaddress(retaddr, 4000000) | ||||
# listunspent should show 2 total outputs (1MM, 10MM XEC), one unused | # listunspent should show 2 total outputs (1MM, 10MM XEC), one unused | ||||
# (1MM), one reused (10MM) | # (1MM), one reused (10MM) | ||||
assert_unspent( | assert_unspent( | ||||
self.nodes[1], | self.nodes[1], | ||||
total_count=2, | total_count=2, | ||||
total_sum=11000000, | total_sum=11000000, | ||||
reused_count=1, | reused_count=1, | ||||
reused_sum=10000000) | reused_sum=10000000) | ||||
# getbalances should show 10MM used, 1MM XEC trusted | # getbalances should show 10MM used, 1MM XEC trusted | ||||
assert_balances( | assert_balances( | ||||
self.nodes[1], | self.nodes[1], | ||||
mine={ | mine={ | ||||
"used": 10000000, | "used": 10000000, | ||||
"trusted": 1000000}) | "trusted": 1000000}) | ||||
# node 1 should now have about 1MM XEC left (no dirty) and 11MM | # node 1 should now have about 1MM XEC left (no dirty) and 11MM | ||||
# (including dirty) | # (including dirty) | ||||
assert_approx(self.nodes[1].getbalance(), 1000000, 1000) | assert_approx(self.nodes[1].getbalance(), 1000000, 1000) | ||||
assert_approx( | assert_approx(self.nodes[1].getbalance(avoid_reuse=False), | ||||
self.nodes[1].getbalance( | 11000000, 1000) | ||||
avoid_reuse=False), | |||||
11000000, | |||||
1000) | |||||
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 96 Lines • Show Last 20 Lines |