Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_avoidreuse.py
Show First 20 Lines • Show All 91 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
self.test_immutable() | self.test_immutable() | ||||
self.nodes[0].generate(110) | self.nodes[0].generate(110) | ||||
self.sync_all() | self.sync_all() | ||||
reset_balance(self.nodes[1], self.nodes[0].getnewaddress()) | reset_balance(self.nodes[1], self.nodes[0].getnewaddress()) | ||||
self.test_fund_send_fund_senddirty() | self.test_fund_send_fund_senddirty() | ||||
reset_balance(self.nodes[1], self.nodes[0].getnewaddress()) | reset_balance(self.nodes[1], self.nodes[0].getnewaddress()) | ||||
self.test_fund_send_fund_send() | self.test_fund_send_fund_send() | ||||
reset_balance(self.nodes[1], self.nodes[0].getnewaddress()) | |||||
self.test_getbalances_used() | |||||
def test_persistence(self): | def test_persistence(self): | ||||
'''Test that wallet files persist the avoid_reuse flag.''' | '''Test that wallet files persist the avoid_reuse flag.''' | ||||
self.log.info("Test wallet files persist avoid_reuse flag") | self.log.info("Test wallet files persist avoid_reuse flag") | ||||
# Configure node 1 to use avoid_reuse | # Configure node 1 to use avoid_reuse | ||||
self.nodes[1].setwalletflag('avoid_reuse') | self.nodes[1].setwalletflag('avoid_reuse') | ||||
▲ Show 20 Lines • Show All 205 Lines • ▼ Show 20 Lines | def test_fund_send_fund_send(self): | ||||
# 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): | |||||
''' | |||||
getbalances and listunspent should pick up on reused addresses | |||||
immediately, even for address reusing outputs created before the first | |||||
transaction was spending from that address | |||||
''' | |||||
self.log.info("Test getbalances used category") | |||||
# node under test should be completely empty | |||||
assert_equal(self.nodes[1].getbalance(avoid_reuse=False), 0) | |||||
new_addr = self.nodes[1].getnewaddress() | |||||
ret_addr = self.nodes[0].getnewaddress() | |||||
# send multiple transactions, reusing one address | |||||
for _ in range(11): | |||||
self.nodes[0].sendtoaddress(new_addr, 1) | |||||
self.nodes[0].generate(1) | |||||
self.sync_all() | |||||
# send transaction that should not use all the available outputs | |||||
# per the current coin selection algorithm | |||||
self.nodes[1].sendtoaddress(ret_addr, 5) | |||||
# getbalances and listunspent should show the remaining outputs | |||||
# in the reused address as used/reused | |||||
assert_unspent( | |||||
self.nodes[1], | |||||
total_count=2, | |||||
total_sum=6, | |||||
reused_count=1, | |||||
reused_sum=1) | |||||
assert_balances(self.nodes[1], mine={"used": 1, "trusted": 5}) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
AvoidReuseTest().main() | AvoidReuseTest().main() |