2 # Copyright (c) 2019 The Zcash developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or https://www.opensource.org/licenses/mit-license.php .
6 import sys; assert sys.version_info < (3,), ur"This script does not run under Python 3. Please use Python 2.7.x."
8 from decimal import Decimal
9 from test_framework.test_framework import BitcoinTestFramework
10 from test_framework.util import assert_equal, get_coinbase_address, \
11 initialize_chain_clean, start_nodes, wait_and_assert_operationid_status
12 from mergetoaddress_helper import assert_mergetoaddress_exception
15 class MergeToAddressMixedNotes(BitcoinTestFramework):
16 def setup_nodes(self):
17 return start_nodes(4, self.options.tmpdir, [[
18 '-nuparams=5ba81b19:100', # Overwinter
19 '-nuparams=76b809bb:100', # Sapling
20 '-experimentalfeatures', '-zmergetoaddress'
23 def setup_chain(self):
24 print("Initializing test directory " + self.options.tmpdir)
25 initialize_chain_clean(self.options.tmpdir, 4)
28 print "Mining blocks..."
29 self.nodes[0].generate(102)
32 # Send some ZEC to Sprout/Sapling addresses
33 coinbase_addr = get_coinbase_address(self.nodes[0])
34 sproutAddr = self.nodes[0].z_getnewaddress('sprout')
35 saplingAddr = self.nodes[0].z_getnewaddress('sapling')
36 t_addr = self.nodes[1].getnewaddress()
38 opid = self.nodes[0].z_sendmany(coinbase_addr, [{"address": sproutAddr, "amount": Decimal('10')}], 1, 0)
39 wait_and_assert_operationid_status(self.nodes[0], opid)
40 self.nodes[0].generate(1)
42 assert_equal(self.nodes[0].z_getbalance(sproutAddr), Decimal('10'))
43 assert_equal(self.nodes[0].z_getbalance(saplingAddr), Decimal('0'))
44 assert_equal(Decimal(self.nodes[1].z_gettotalbalance()["transparent"]), Decimal('0'))
45 # Make sure we cannot use "ANY_SPROUT" and "ANY_SAPLING" even if we only have Sprout Notes
46 assert_mergetoaddress_exception(
47 "Cannot send from both Sprout and Sapling addresses using z_mergetoaddress",
48 lambda: self.nodes[0].z_mergetoaddress(["ANY_SPROUT", "ANY_SAPLING"], t_addr))
49 opid = self.nodes[0].z_sendmany(coinbase_addr, [{"address": saplingAddr, "amount": Decimal('10')}], 1, 0)
50 wait_and_assert_operationid_status(self.nodes[0], opid)
51 self.nodes[0].generate(1)
54 assert_equal(Decimal(self.nodes[1].z_gettotalbalance()["transparent"]), Decimal('0'))
56 # Merge Sprout -> taddr
57 result = self.nodes[0].z_mergetoaddress(["ANY_SPROUT"], t_addr, 0)
58 wait_and_assert_operationid_status(self.nodes[0], result['opid'])
59 self.nodes[0].generate(1)
62 assert_equal(self.nodes[0].z_getbalance(sproutAddr), Decimal('0'))
63 assert_equal(self.nodes[0].z_getbalance(saplingAddr), Decimal('10'))
64 assert_equal(Decimal(self.nodes[1].z_gettotalbalance()["transparent"]), Decimal('10'))
66 # Make sure we cannot use "ANY_SPROUT" and "ANY_SAPLING" even if we only have Sapling Notes
67 assert_mergetoaddress_exception(
68 "Cannot send from both Sprout and Sapling addresses using z_mergetoaddress",
69 lambda: self.nodes[0].z_mergetoaddress(["ANY_SPROUT", "ANY_SAPLING"], t_addr))
70 # Merge Sapling -> taddr
71 result = self.nodes[0].z_mergetoaddress(["ANY_SAPLING"], t_addr, 0)
72 wait_and_assert_operationid_status(self.nodes[0], result['opid'])
73 self.nodes[0].generate(1)
76 assert_equal(self.nodes[0].z_getbalance(sproutAddr), Decimal('0'))
77 assert_equal(self.nodes[0].z_getbalance(saplingAddr), Decimal('0'))
78 assert_equal(Decimal(self.nodes[1].z_gettotalbalance()["transparent"]), Decimal('20'))
81 if __name__ == '__main__':
82 MergeToAddressMixedNotes().main()