|
11 | 11 | assert_greater_than,
|
12 | 12 | assert_raises_rpc_error,
|
13 | 13 | bytes_to_hex_str,
|
| 14 | + hex_str_to_bytes |
14 | 15 | )
|
15 |
| - |
| 16 | +from test_framework.script import ( |
| 17 | + CScript, |
| 18 | + OP_0, |
| 19 | + hash160 |
| 20 | +) |
| 21 | +from test_framework.messages import sha256 |
16 | 22 |
|
17 | 23 | class ImportMultiTest(BitcoinTestFramework):
|
18 | 24 | def set_test_params(self):
|
@@ -90,6 +96,19 @@ def run_test (self):
|
90 | 96 | assert_equal(address_assert['ismine'], False)
|
91 | 97 | assert_equal(address_assert['timestamp'], timestamp)
|
92 | 98 |
|
| 99 | + # ScriptPubKey + internal + label |
| 100 | + self.log.info("Should not allow a label to be specified when internal is true") |
| 101 | + address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress()) |
| 102 | + result = self.nodes[1].importmulti([{ |
| 103 | + "scriptPubKey": address['scriptPubKey'], |
| 104 | + "timestamp": "now", |
| 105 | + "internal": True, |
| 106 | + "label": "Example label" |
| 107 | + }]) |
| 108 | + assert_equal(result[0]['success'], False) |
| 109 | + assert_equal(result[0]['error']['code'], -8) |
| 110 | + assert_equal(result[0]['error']['message'], 'Internal addresses should not have a label') |
| 111 | + |
93 | 112 | # Nonstandard scriptPubKey + !internal
|
94 | 113 | self.log.info("Should not import a nonstandard scriptPubKey without internal flag")
|
95 | 114 | nonstandardScriptPubKey = address['scriptPubKey'] + bytes_to_hex_str(script.CScript([script.OP_NOP]))
|
@@ -458,6 +477,147 @@ def run_test (self):
|
458 | 477 | "timestamp": "",
|
459 | 478 | }])
|
460 | 479 |
|
| 480 | + # Import P2WPKH address as watch only |
| 481 | + self.log.info("Should import a P2WPKH address as watch only") |
| 482 | + address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32")) |
| 483 | + result = self.nodes[1].importmulti([{ |
| 484 | + "scriptPubKey": { |
| 485 | + "address": address['address'] |
| 486 | + }, |
| 487 | + "timestamp": "now", |
| 488 | + }]) |
| 489 | + assert_equal(result[0]['success'], True) |
| 490 | + address_assert = self.nodes[1].getaddressinfo(address['address']) |
| 491 | + assert_equal(address_assert['iswatchonly'], True) |
| 492 | + assert_equal(address_assert['solvable'], False) |
| 493 | + |
| 494 | + # Import P2WPKH address with public key but no private key |
| 495 | + self.log.info("Should import a P2WPKH address and public key as solvable but not spendable") |
| 496 | + address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32")) |
| 497 | + result = self.nodes[1].importmulti([{ |
| 498 | + "scriptPubKey": { |
| 499 | + "address": address['address'] |
| 500 | + }, |
| 501 | + "timestamp": "now", |
| 502 | + "pubkeys": [ address['pubkey'] ] |
| 503 | + }]) |
| 504 | + assert_equal(result[0]['success'], True) |
| 505 | + address_assert = self.nodes[1].getaddressinfo(address['address']) |
| 506 | + assert_equal(address_assert['ismine'], False) |
| 507 | + assert_equal(address_assert['solvable'], True) |
| 508 | + |
| 509 | + # Import P2WPKH address with key and check it is spendable |
| 510 | + self.log.info("Should import a P2WPKH address with key") |
| 511 | + address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32")) |
| 512 | + result = self.nodes[1].importmulti([{ |
| 513 | + "scriptPubKey": { |
| 514 | + "address": address['address'] |
| 515 | + }, |
| 516 | + "timestamp": "now", |
| 517 | + "keys": [self.nodes[0].dumpprivkey(address['address'])] |
| 518 | + }]) |
| 519 | + assert_equal(result[0]['success'], True) |
| 520 | + address_assert = self.nodes[1].getaddressinfo(address['address']) |
| 521 | + assert_equal(address_assert['iswatchonly'], False) |
| 522 | + assert_equal(address_assert['ismine'], True) |
| 523 | + |
| 524 | + # P2WSH multisig address without scripts or keys |
| 525 | + sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress()) |
| 526 | + sig_address_2 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress()) |
| 527 | + multi_sig_script = self.nodes[0].addmultisigaddress(2, [sig_address_1['pubkey'], sig_address_2['pubkey']], "", "bech32") |
| 528 | + self.log.info("Should import a p2wsh multisig as watch only without respective redeem script and private keys") |
| 529 | + result = self.nodes[1].importmulti([{ |
| 530 | + "scriptPubKey": { |
| 531 | + "address": multi_sig_script['address'] |
| 532 | + }, |
| 533 | + "timestamp": "now" |
| 534 | + }]) |
| 535 | + assert_equal(result[0]['success'], True) |
| 536 | + address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address']) |
| 537 | + assert_equal(address_assert['solvable'], False) |
| 538 | + |
| 539 | + # Same P2WSH multisig address as above, but now with witnessscript + private keys |
| 540 | + self.log.info("Should import a p2wsh with respective redeem script and private keys") |
| 541 | + result = self.nodes[1].importmulti([{ |
| 542 | + "scriptPubKey": { |
| 543 | + "address": multi_sig_script['address'] |
| 544 | + }, |
| 545 | + "timestamp": "now", |
| 546 | + "witnessscript": multi_sig_script['redeemScript'], |
| 547 | + "keys": [ self.nodes[0].dumpprivkey(sig_address_1['address']), self.nodes[0].dumpprivkey(sig_address_2['address']) ] |
| 548 | + }]) |
| 549 | + assert_equal(result[0]['success'], True) |
| 550 | + address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address']) |
| 551 | + assert_equal(address_assert['solvable'], True) |
| 552 | + assert_equal(address_assert['ismine'], True) |
| 553 | + assert_equal(address_assert['sigsrequired'], 2) |
| 554 | + |
| 555 | + # P2SH-P2WPKH address with no redeemscript or public or private key |
| 556 | + sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="p2sh-segwit")) |
| 557 | + pubkeyhash = hash160(hex_str_to_bytes(sig_address_1['pubkey'])) |
| 558 | + pkscript = CScript([OP_0, pubkeyhash]) |
| 559 | + self.log.info("Should import a p2sh-p2wpkh without redeem script or keys") |
| 560 | + result = self.nodes[1].importmulti([{ |
| 561 | + "scriptPubKey": { |
| 562 | + "address": sig_address_1['address'] |
| 563 | + }, |
| 564 | + "timestamp": "now" |
| 565 | + }]) |
| 566 | + assert_equal(result[0]['success'], True) |
| 567 | + address_assert = self.nodes[1].getaddressinfo(sig_address_1['address']) |
| 568 | + assert_equal(address_assert['solvable'], False) |
| 569 | + assert_equal(address_assert['ismine'], False) |
| 570 | + |
| 571 | + # P2SH-P2WPKH address + redeemscript + public key with no private key |
| 572 | + self.log.info("Should import a p2sh-p2wpkh with respective redeem script and pubkey as solvable") |
| 573 | + result = self.nodes[1].importmulti([{ |
| 574 | + "scriptPubKey": { |
| 575 | + "address": sig_address_1['address'] |
| 576 | + }, |
| 577 | + "timestamp": "now", |
| 578 | + "redeemscript": bytes_to_hex_str(pkscript), |
| 579 | + "pubkeys": [ sig_address_1['pubkey'] ] |
| 580 | + }]) |
| 581 | + assert_equal(result[0]['success'], True) |
| 582 | + address_assert = self.nodes[1].getaddressinfo(sig_address_1['address']) |
| 583 | + assert_equal(address_assert['solvable'], True) |
| 584 | + assert_equal(address_assert['ismine'], False) |
| 585 | + |
| 586 | + # P2SH-P2WPKH address + redeemscript + private key |
| 587 | + sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="p2sh-segwit")) |
| 588 | + pubkeyhash = hash160(hex_str_to_bytes(sig_address_1['pubkey'])) |
| 589 | + pkscript = CScript([OP_0, pubkeyhash]) |
| 590 | + self.log.info("Should import a p2sh-p2wpkh with respective redeem script and private keys") |
| 591 | + result = self.nodes[1].importmulti([{ |
| 592 | + "scriptPubKey": { |
| 593 | + "address": sig_address_1['address'] |
| 594 | + }, |
| 595 | + "timestamp": "now", |
| 596 | + "redeemscript": bytes_to_hex_str(pkscript), |
| 597 | + "keys": [ self.nodes[0].dumpprivkey(sig_address_1['address'])] |
| 598 | + }]) |
| 599 | + assert_equal(result[0]['success'], True) |
| 600 | + address_assert = self.nodes[1].getaddressinfo(sig_address_1['address']) |
| 601 | + assert_equal(address_assert['solvable'], True) |
| 602 | + assert_equal(address_assert['ismine'], True) |
| 603 | + |
| 604 | + # P2SH-P2WSH 1-of-1 multisig + redeemscript with no private key |
| 605 | + sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress()) |
| 606 | + multi_sig_script = self.nodes[0].addmultisigaddress(1, [sig_address_1['pubkey']], "", "p2sh-segwit") |
| 607 | + scripthash = sha256(hex_str_to_bytes(multi_sig_script['redeemScript'])) |
| 608 | + redeem_script = CScript([OP_0, scripthash]) |
| 609 | + self.log.info("Should import a p2sh-p2wsh with respective redeem script but no private key") |
| 610 | + result = self.nodes[1].importmulti([{ |
| 611 | + "scriptPubKey": { |
| 612 | + "address": multi_sig_script['address'] |
| 613 | + }, |
| 614 | + "timestamp": "now", |
| 615 | + "redeemscript": bytes_to_hex_str(redeem_script), |
| 616 | + "witnessscript": multi_sig_script['redeemScript'] |
| 617 | + }]) |
| 618 | + assert_equal(result[0]['success'], True) |
| 619 | + address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address']) |
| 620 | + assert_equal(address_assert['solvable'], True) |
461 | 621 |
|
462 | 622 | if __name__ == '__main__':
|
463 | 623 | ImportMultiTest ().main ()
|
0 commit comments