forked from hush/hush3
![michaeltoutonghi@gmail.com](/assets/img/avatar_default.png)
committed by
GitHub
![GitHub](/assets/img/avatar_default.png)
26 changed files with 656 additions and 153 deletions
@ -0,0 +1,34 @@ |
|||
#!/usr/bin/env python2 |
|||
# Copyright (c) 2018 The Zcash developers |
|||
# Distributed under the MIT software license, see the accompanying |
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|||
|
|||
from test_framework.test_framework import BitcoinTestFramework |
|||
from test_framework.util import start_nodes, wait_and_assert_operationid_status |
|||
|
|||
class RegtestSignrawtransactionTest (BitcoinTestFramework): |
|||
|
|||
def setup_nodes(self): |
|||
return start_nodes(4, self.options.tmpdir, [[ |
|||
"-nuparams=5ba81b19:200", # Overwinter |
|||
"-nuparams=76b809bb:204", # Sapling |
|||
]] * 4) |
|||
|
|||
def run_test(self): |
|||
self.nodes[0].generate(1) |
|||
self.sync_all() |
|||
taddr = self.nodes[1].getnewaddress() |
|||
zaddr1 = self.nodes[1].z_getnewaddress('sprout') |
|||
|
|||
self.nodes[0].sendtoaddress(taddr, 2.0) |
|||
self.nodes[0].generate(1) |
|||
self.sync_all() |
|||
|
|||
# Create and sign Overwinter transaction. |
|||
# If the incorrect consensus branch id is selected, there will be a signing error. |
|||
opid = self.nodes[1].z_sendmany(taddr, |
|||
[{'address': zaddr1, 'amount': 1}]) |
|||
wait_and_assert_operationid_status(self.nodes[1], opid) |
|||
|
|||
if __name__ == '__main__': |
|||
RegtestSignrawtransactionTest().main() |
@ -0,0 +1,168 @@ |
|||
#!/usr/bin/env python2 |
|||
# Copyright (c) 2018 The Zcash developers |
|||
# Distributed under the MIT software license, see the accompanying |
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|||
|
|||
from test_framework.test_framework import BitcoinTestFramework |
|||
from test_framework.util import assert_equal, start_nodes, wait_and_assert_operationid_status |
|||
|
|||
from decimal import Decimal |
|||
|
|||
# Test wallet z_listunspent behaviour across network upgrades |
|||
class WalletListNotes(BitcoinTestFramework): |
|||
|
|||
def setup_nodes(self): |
|||
return start_nodes(4, self.options.tmpdir, [[ |
|||
'-nuparams=5ba81b19:202', # Overwinter |
|||
'-nuparams=76b809bb:204', # Sapling |
|||
]] * 4) |
|||
|
|||
def run_test(self): |
|||
# Current height = 200 -> Sprout |
|||
assert_equal(200, self.nodes[0].getblockcount()) |
|||
sproutzaddr = self.nodes[0].z_getnewaddress('sprout') |
|||
|
|||
# test that we can create a sapling zaddr before sapling activates |
|||
saplingzaddr = self.nodes[0].z_getnewaddress('sapling') |
|||
|
|||
# we've got lots of coinbase (taddr) but no shielded funds yet |
|||
assert_equal(0, Decimal(self.nodes[0].z_gettotalbalance()['private'])) |
|||
|
|||
# Set current height to 201 -> Sprout |
|||
self.nodes[0].generate(1) |
|||
self.sync_all() |
|||
assert_equal(201, self.nodes[0].getblockcount()) |
|||
|
|||
mining_addr = self.nodes[0].listunspent()[0]['address'] |
|||
|
|||
# Shield coinbase funds (must be a multiple of 10, no change allowed pre-sapling) |
|||
receive_amount_10 = Decimal('10.0') - Decimal('0.0001') |
|||
recipients = [{"address":sproutzaddr, "amount":receive_amount_10}] |
|||
myopid = self.nodes[0].z_sendmany(mining_addr, recipients) |
|||
txid_1 = wait_and_assert_operationid_status(self.nodes[0], myopid) |
|||
self.sync_all() |
|||
|
|||
# No funds (with (default) one or more confirmations) in sproutzaddr yet |
|||
assert_equal(0, len(self.nodes[0].z_listunspent())) |
|||
assert_equal(0, len(self.nodes[0].z_listunspent(1))) |
|||
|
|||
# no private balance because no confirmations yet |
|||
assert_equal(0, Decimal(self.nodes[0].z_gettotalbalance()['private'])) |
|||
|
|||
# list private unspent, this time allowing 0 confirmations |
|||
unspent_cb = self.nodes[0].z_listunspent(0) |
|||
assert_equal(1, len(unspent_cb)) |
|||
assert_equal(False, unspent_cb[0]['change']) |
|||
assert_equal(txid_1, unspent_cb[0]['txid']) |
|||
assert_equal(True, unspent_cb[0]['spendable']) |
|||
assert_equal(sproutzaddr, unspent_cb[0]['address']) |
|||
assert_equal(receive_amount_10, unspent_cb[0]['amount']) |
|||
|
|||
# list unspent, filtering by address, should produce same result |
|||
unspent_cb_filter = self.nodes[0].z_listunspent(0, 9999, False, [sproutzaddr]) |
|||
assert_equal(unspent_cb, unspent_cb_filter) |
|||
|
|||
# Generate a block to confirm shield coinbase tx |
|||
self.nodes[0].generate(1) |
|||
self.sync_all() |
|||
|
|||
# Current height = 202 -> Overwinter. Default address type remains Sprout |
|||
assert_equal(202, self.nodes[0].getblockcount()) |
|||
|
|||
# Send 1.0 (actually 0.9999) from sproutzaddr to a new zaddr |
|||
sproutzaddr2 = self.nodes[0].z_getnewaddress() |
|||
receive_amount_1 = Decimal('1.0') - Decimal('0.0001') |
|||
change_amount_9 = receive_amount_10 - Decimal('1.0') |
|||
assert_equal('sprout', self.nodes[0].z_validateaddress(sproutzaddr2)['type']) |
|||
recipients = [{"address": sproutzaddr2, "amount":receive_amount_1}] |
|||
myopid = self.nodes[0].z_sendmany(sproutzaddr, recipients) |
|||
txid_2 = wait_and_assert_operationid_status(self.nodes[0], myopid) |
|||
self.sync_all() |
|||
|
|||
# list unspent, allowing 0conf txs |
|||
unspent_tx = self.nodes[0].z_listunspent(0) |
|||
assert_equal(len(unspent_tx), 2) |
|||
# sort low-to-high by amount (order of returned entries is not guaranteed) |
|||
unspent_tx = sorted(unspent_tx, key=lambda k: k['amount']) |
|||
assert_equal(False, unspent_tx[0]['change']) |
|||
assert_equal(txid_2, unspent_tx[0]['txid']) |
|||
assert_equal(True, unspent_tx[0]['spendable']) |
|||
assert_equal(sproutzaddr2, unspent_tx[0]['address']) |
|||
assert_equal(receive_amount_1, unspent_tx[0]['amount']) |
|||
|
|||
assert_equal(True, unspent_tx[1]['change']) |
|||
assert_equal(txid_2, unspent_tx[1]['txid']) |
|||
assert_equal(True, unspent_tx[1]['spendable']) |
|||
assert_equal(sproutzaddr, unspent_tx[1]['address']) |
|||
assert_equal(change_amount_9, unspent_tx[1]['amount']) |
|||
|
|||
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, [sproutzaddr2]) |
|||
assert_equal(1, len(unspent_tx_filter)) |
|||
assert_equal(unspent_tx[0], unspent_tx_filter[0]) |
|||
|
|||
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, [sproutzaddr]) |
|||
assert_equal(1, len(unspent_tx_filter)) |
|||
assert_equal(unspent_tx[1], unspent_tx_filter[0]) |
|||
|
|||
# Set current height to 204 -> Sapling |
|||
self.nodes[0].generate(2) |
|||
self.sync_all() |
|||
assert_equal(204, self.nodes[0].getblockcount()) |
|||
|
|||
# No funds in saplingzaddr yet |
|||
assert_equal(0, len(self.nodes[0].z_listunspent(0, 9999, False, [saplingzaddr]))) |
|||
|
|||
# Send 0.9999 to our sapling zaddr |
|||
# (sending from a sprout zaddr to a sapling zaddr is disallowed, |
|||
# so send from coin base) |
|||
receive_amount_2 = Decimal('2.0') - Decimal('0.0001') |
|||
recipients = [{"address": saplingzaddr, "amount":receive_amount_2}] |
|||
myopid = self.nodes[0].z_sendmany(mining_addr, recipients) |
|||
txid_3 = wait_and_assert_operationid_status(self.nodes[0], myopid) |
|||
self.sync_all() |
|||
unspent_tx = self.nodes[0].z_listunspent(0) |
|||
assert_equal(3, len(unspent_tx)) |
|||
|
|||
# low-to-high in amount |
|||
unspent_tx = sorted(unspent_tx, key=lambda k: k['amount']) |
|||
|
|||
assert_equal(False, unspent_tx[0]['change']) |
|||
assert_equal(txid_2, unspent_tx[0]['txid']) |
|||
assert_equal(True, unspent_tx[0]['spendable']) |
|||
assert_equal(sproutzaddr2, unspent_tx[0]['address']) |
|||
assert_equal(receive_amount_1, unspent_tx[0]['amount']) |
|||
|
|||
assert_equal(False, unspent_tx[1]['change']) |
|||
assert_equal(txid_3, unspent_tx[1]['txid']) |
|||
assert_equal(True, unspent_tx[1]['spendable']) |
|||
assert_equal(saplingzaddr, unspent_tx[1]['address']) |
|||
assert_equal(receive_amount_2, unspent_tx[1]['amount']) |
|||
|
|||
assert_equal(True, unspent_tx[2]['change']) |
|||
assert_equal(txid_2, unspent_tx[2]['txid']) |
|||
assert_equal(True, unspent_tx[2]['spendable']) |
|||
assert_equal(sproutzaddr, unspent_tx[2]['address']) |
|||
assert_equal(change_amount_9, unspent_tx[2]['amount']) |
|||
|
|||
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, [saplingzaddr]) |
|||
assert_equal(1, len(unspent_tx_filter)) |
|||
assert_equal(unspent_tx[1], unspent_tx_filter[0]) |
|||
|
|||
# test that pre- and post-sapling can be filtered in a single call |
|||
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, |
|||
[sproutzaddr, saplingzaddr]) |
|||
assert_equal(2, len(unspent_tx_filter)) |
|||
unspent_tx_filter = sorted(unspent_tx_filter, key=lambda k: k['amount']) |
|||
assert_equal(unspent_tx[1], unspent_tx_filter[0]) |
|||
assert_equal(unspent_tx[2], unspent_tx_filter[1]) |
|||
|
|||
# so far, this node has no watchonly addresses, so results are the same |
|||
unspent_tx_watchonly = self.nodes[0].z_listunspent(0, 9999, True) |
|||
unspent_tx_watchonly = sorted(unspent_tx_watchonly, key=lambda k: k['amount']) |
|||
assert_equal(unspent_tx, unspent_tx_watchonly) |
|||
|
|||
# TODO: use z_exportviewingkey, z_importviewingkey to test includeWatchonly |
|||
# but this requires Sapling support for those RPCs |
|||
|
|||
if __name__ == '__main__': |
|||
WalletListNotes().main() |
@ -0,0 +1,101 @@ |
|||
#!/usr/bin/env python2 |
|||
# Copyright (c) 2018 The Zcash developers |
|||
# Distributed under the MIT software license, see the accompanying |
|||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|||
|
|||
from test_framework.test_framework import BitcoinTestFramework |
|||
from test_framework.util import assert_equal, assert_true, assert_false |
|||
from test_framework.util import start_nodes, wait_and_assert_operationid_status |
|||
from decimal import Decimal |
|||
|
|||
my_memo = 'c0ffee' # stay awake |
|||
my_memo = my_memo + '0'*(1024-len(my_memo)) |
|||
|
|||
no_memo = 'f6' + ('0'*1022) # see section 5.5 of the protocol spec |
|||
# sapling generates zero_memo, but this may be fixed soon (to no_memo) |
|||
# then this test can be simplified |
|||
zero_memo = '0'*1024 |
|||
|
|||
fee = Decimal('0.0001') |
|||
|
|||
class ListReceivedTest (BitcoinTestFramework): |
|||
|
|||
def setup_nodes(self): |
|||
return start_nodes(4, self.options.tmpdir, [[ |
|||
"-nuparams=5ba81b19:201", # Overwinter |
|||
"-nuparams=76b809bb:204", # Sapling |
|||
]] * 4) |
|||
|
|||
def generate_and_sync(self, new_height): |
|||
self.nodes[0].generate(1) |
|||
self.sync_all() |
|||
assert_equal(new_height, self.nodes[0].getblockcount()) |
|||
|
|||
def run_test_release(self, release, expected_memo, height): |
|||
self.generate_and_sync(height+1) |
|||
taddr = self.nodes[1].getnewaddress() |
|||
zaddr1 = self.nodes[1].z_getnewaddress(release) |
|||
|
|||
self.nodes[0].sendtoaddress(taddr, 2.0) |
|||
self.generate_and_sync(height+2) |
|||
|
|||
# Send 1 ZEC to zaddr1 |
|||
opid = self.nodes[1].z_sendmany(taddr, |
|||
[{'address': zaddr1, 'amount': 1, 'memo': my_memo}]) |
|||
txid = wait_and_assert_operationid_status(self.nodes[1], opid) |
|||
self.sync_all() |
|||
r = self.nodes[1].z_listreceivedbyaddress(zaddr1) |
|||
assert_equal(0, len(r), "Should have received no confirmed note") |
|||
|
|||
# No confirmation required, one note should be present |
|||
r = self.nodes[1].z_listreceivedbyaddress(zaddr1, 0) |
|||
assert_equal(1, len(r), "Should have received one (unconfirmed) note") |
|||
assert_equal(txid, r[0]['txid']) |
|||
assert_equal(1, r[0]['amount']) |
|||
assert_false(r[0]['change'], "Note should not be change") |
|||
assert_equal(my_memo, r[0]['memo']) |
|||
|
|||
# Confirm transaction (1 ZEC from taddr to zaddr1) |
|||
self.generate_and_sync(height+3) |
|||
|
|||
# Require one confirmation, note should be present |
|||
assert_equal(r, self.nodes[1].z_listreceivedbyaddress(zaddr1)) |
|||
|
|||
# Generate some change by sending part of zaddr1 to zaddr2 |
|||
zaddr2 = self.nodes[1].z_getnewaddress(release) |
|||
opid = self.nodes[1].z_sendmany(zaddr1, |
|||
[{'address': zaddr2, 'amount': 0.6, 'memo': my_memo}]) |
|||
txid = wait_and_assert_operationid_status(self.nodes[1], opid) |
|||
self.sync_all() |
|||
self.generate_and_sync(height+4) |
|||
|
|||
# zaddr1 should have a note with change |
|||
r = self.nodes[1].z_listreceivedbyaddress(zaddr1, 0) |
|||
r = sorted(r, key = lambda received: received['amount']) |
|||
assert_equal(2, len(r), "zaddr1 Should have received 2 notes") |
|||
|
|||
assert_equal(txid, r[0]['txid']) |
|||
assert_equal(Decimal('0.4')-fee, r[0]['amount']) |
|||
assert_true(r[0]['change'], "Note valued at (0.4-fee) should be change") |
|||
assert_equal(expected_memo, r[0]['memo']) |
|||
|
|||
# The old note still exists (it's immutable), even though it is spent |
|||
assert_equal(Decimal('1.0'), r[1]['amount']) |
|||
assert_false(r[1]['change'], "Note valued at 1.0 should not be change") |
|||
assert_equal(expected_memo, r[0]['memo']) |
|||
|
|||
# zaddr2 should not have change |
|||
r = self.nodes[1].z_listreceivedbyaddress(zaddr2, 0) |
|||
r = sorted(r, key = lambda received: received['amount']) |
|||
assert_equal(1, len(r), "zaddr2 Should have received 1 notes") |
|||
assert_equal(txid, r[0]['txid']) |
|||
assert_equal(Decimal('0.6'), r[0]['amount']) |
|||
assert_false(r[0]['change'], "Note valued at 0.6 should not be change") |
|||
assert_equal(my_memo, r[0]['memo']) |
|||
|
|||
def run_test(self): |
|||
self.run_test_release('sprout', no_memo, 200) |
|||
self.run_test_release('sapling', zero_memo, 204) |
|||
|
|||
if __name__ == '__main__': |
|||
ListReceivedTest().main() |
Loading…
Reference in new issue