|
|
@ -13,14 +13,15 @@ class RawTransactionsTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
def setup_chain(self): |
|
|
|
def setup_chain(self): |
|
|
|
print("Initializing test directory "+self.options.tmpdir) |
|
|
|
print("Initializing test directory "+self.options.tmpdir) |
|
|
|
initialize_chain_clean(self.options.tmpdir, 3) |
|
|
|
initialize_chain_clean(self.options.tmpdir, 4) |
|
|
|
|
|
|
|
|
|
|
|
def setup_network(self, split=False): |
|
|
|
def setup_network(self, split=False): |
|
|
|
self.nodes = start_nodes(3, self.options.tmpdir) |
|
|
|
self.nodes = start_nodes(4, self.options.tmpdir) |
|
|
|
|
|
|
|
|
|
|
|
connect_nodes_bi(self.nodes,0,1) |
|
|
|
connect_nodes_bi(self.nodes,0,1) |
|
|
|
connect_nodes_bi(self.nodes,1,2) |
|
|
|
connect_nodes_bi(self.nodes,1,2) |
|
|
|
connect_nodes_bi(self.nodes,0,2) |
|
|
|
connect_nodes_bi(self.nodes,0,2) |
|
|
|
|
|
|
|
connect_nodes_bi(self.nodes,0,3) |
|
|
|
|
|
|
|
|
|
|
|
self.is_network_split=False |
|
|
|
self.is_network_split=False |
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
@ -31,11 +32,20 @@ class RawTransactionsTest(BitcoinTestFramework): |
|
|
|
|
|
|
|
|
|
|
|
self.nodes[2].generate(1) |
|
|
|
self.nodes[2].generate(1) |
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
|
self.nodes[0].generate(101) |
|
|
|
self.nodes[0].generate(121) |
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
watchonly_address = self.nodes[0].getnewaddress() |
|
|
|
|
|
|
|
watchonly_pubkey = self.nodes[0].validateaddress(watchonly_address)["pubkey"] |
|
|
|
|
|
|
|
watchonly_amount = 200 |
|
|
|
|
|
|
|
self.nodes[3].importpubkey(watchonly_pubkey, "", True) |
|
|
|
|
|
|
|
watchonly_txid = self.nodes[0].sendtoaddress(watchonly_address, watchonly_amount) |
|
|
|
|
|
|
|
self.nodes[0].sendtoaddress(self.nodes[3].getnewaddress(), watchonly_amount / 10); |
|
|
|
|
|
|
|
|
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5); |
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5); |
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.0); |
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.0); |
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),5.0); |
|
|
|
self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),5.0); |
|
|
|
|
|
|
|
|
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
|
self.nodes[0].generate(1) |
|
|
|
self.nodes[0].generate(1) |
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
@ -428,11 +438,12 @@ class RawTransactionsTest(BitcoinTestFramework): |
|
|
|
stop_nodes(self.nodes) |
|
|
|
stop_nodes(self.nodes) |
|
|
|
wait_bitcoinds() |
|
|
|
wait_bitcoinds() |
|
|
|
|
|
|
|
|
|
|
|
self.nodes = start_nodes(3, self.options.tmpdir) |
|
|
|
self.nodes = start_nodes(4, self.options.tmpdir) |
|
|
|
|
|
|
|
|
|
|
|
connect_nodes_bi(self.nodes,0,1) |
|
|
|
connect_nodes_bi(self.nodes,0,1) |
|
|
|
connect_nodes_bi(self.nodes,1,2) |
|
|
|
connect_nodes_bi(self.nodes,1,2) |
|
|
|
connect_nodes_bi(self.nodes,0,2) |
|
|
|
connect_nodes_bi(self.nodes,0,2) |
|
|
|
|
|
|
|
connect_nodes_bi(self.nodes,0,3) |
|
|
|
self.is_network_split=False |
|
|
|
self.is_network_split=False |
|
|
|
self.sync_all() |
|
|
|
self.sync_all() |
|
|
|
|
|
|
|
|
|
|
@ -525,5 +536,45 @@ class RawTransactionsTest(BitcoinTestFramework): |
|
|
|
assert_equal(oldBalance+Decimal('50.19000000'), self.nodes[0].getbalance()) #0.19+block reward |
|
|
|
assert_equal(oldBalance+Decimal('50.19000000'), self.nodes[0].getbalance()) #0.19+block reward |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
################################################## |
|
|
|
|
|
|
|
# test a fundrawtransaction using only watchonly # |
|
|
|
|
|
|
|
################################################## |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inputs = [] |
|
|
|
|
|
|
|
outputs = {self.nodes[2].getnewaddress() : watchonly_amount / 2} |
|
|
|
|
|
|
|
rawtx = self.nodes[3].createrawtransaction(inputs, outputs) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result = self.nodes[3].fundrawtransaction(rawtx, True) |
|
|
|
|
|
|
|
res_dec = self.nodes[0].decoderawtransaction(result["hex"]) |
|
|
|
|
|
|
|
assert_equal(len(res_dec["vin"]), 1) |
|
|
|
|
|
|
|
assert_equal(res_dec["vin"][0]["txid"], watchonly_txid) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert_equal("fee" in result.keys(), True) |
|
|
|
|
|
|
|
assert_greater_than(result["changepos"], -1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
############################################################### |
|
|
|
|
|
|
|
# test fundrawtransaction using the entirety of watched funds # |
|
|
|
|
|
|
|
############################################################### |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inputs = [] |
|
|
|
|
|
|
|
outputs = {self.nodes[2].getnewaddress() : watchonly_amount} |
|
|
|
|
|
|
|
rawtx = self.nodes[3].createrawtransaction(inputs, outputs) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result = self.nodes[3].fundrawtransaction(rawtx, True) |
|
|
|
|
|
|
|
res_dec = self.nodes[0].decoderawtransaction(result["hex"]) |
|
|
|
|
|
|
|
assert_equal(len(res_dec["vin"]), 2) |
|
|
|
|
|
|
|
assert(res_dec["vin"][0]["txid"] == watchonly_txid or res_dec["vin"][1]["txid"] == watchonly_txid) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert_greater_than(result["fee"], 0) |
|
|
|
|
|
|
|
assert_greater_than(result["changepos"], -1) |
|
|
|
|
|
|
|
assert_equal(result["fee"] + res_dec["vout"][result["changepos"]]["value"], watchonly_amount / 10) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
signedtx = self.nodes[3].signrawtransaction(result["hex"]) |
|
|
|
|
|
|
|
assert(not signedtx["complete"]) |
|
|
|
|
|
|
|
signedtx = self.nodes[0].signrawtransaction(signedtx["hex"]) |
|
|
|
|
|
|
|
assert(signedtx["complete"]) |
|
|
|
|
|
|
|
self.nodes[0].sendrawtransaction(signedtx["hex"]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
if __name__ == '__main__': |
|
|
|
RawTransactionsTest().main() |
|
|
|
RawTransactionsTest().main() |
|
|
|