def test_bad_key(self): with pytest.raises(ValueError): XPublicKey.from_hex( '034339a901d8526c4d733c8ea7c861f1a6324f37f6b86f838725820e0c5fc1957000') with pytest.raises(AssertionError): XPublicKey.from_hex( 'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb' 'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa1201000a' )
def test_xpubkey(self): xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w' 'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA') xpubkey_hex =( 'ff0488b21e000000000000000000f79d7a4d3ea07099f09fbf35c3103908cbb4b1f30e8602a06ffbdb' 'b213d0025602e9aa22cc7106abab85e4c41f18f030c370213769c18d6754f3d0584e69a7fa12') # The 1-depth case falls back to the old 2 byte 2 byte parsing. assert XPublicKey.from_hex( xpubkey_hex + '01000a00').bip32_extended_key_and_path() == (xpub, (1, 10)) # Derivation path size must be multiples of 16 bit. with pytest.raises(AssertionError): assert XPublicKey.from_hex(xpubkey_hex + '0a').bip32_extended_key_and_path()
def test_tx_unsigned(self): tx = Transaction.from_extended_bytes(bytes.fromhex(unsigned_blob)) assert tx.version == 1 assert len(tx.inputs) == 1 txin = tx.inputs[0] assert txin.prev_hash.hex( ) == '49f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed' assert txin.prev_idx == 1 assert txin.script_sig.to_hex( ) == '01ff4c53ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300' assert txin.sequence == 4294967294 assert txin.value == 20112600 assert txin.signatures == [NO_SIGNATURE] assert txin.x_pubkeys == [ XPublicKey.from_hex( 'ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300' ) ] assert txin.threshold == 1 assert (tx.outputs[0].value == 20112408 and tx.outputs[0].script_pubkey == \ address_from_string('1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script()) assert tx.locktime == 507231 assert json.dumps( tx.to_dict() ) == '{"version": 1, "hex": "010000000149f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed010000002401ff2103b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166feffffff0118e43201000000001976a914e158fb15c888037fdc40fb9133b4c1c3c688706488ac5fbd0700", "complete": false, "inputs": [{"script_type": 2, "threshold": 1, "value": 20112600, "signatures": ["ff"], "x_pubkeys": [{"bip32_xpub": "xpub661MyMwAqRbcFL6WFqND2XM2w1EfpBwFfhsSUcw9xDR3nH8eYLv4z4HAhxv5zkqjHojWsPYK1ZSK7yCr8fZ9iWU6D361G2ryv5UgsKjbeDq", "derivation_path": [0, 35]}]}]}'
def sign_tx(self, unsigned_tx_hex, priv_keys): keypairs = {XPublicKey.from_hex(priv_key.public_key.to_hex()): (priv_key.to_bytes(), priv_key.is_compressed()) for priv_key in priv_keys} tx = Transaction.from_extended_bytes(bytes.fromhex(unsigned_tx_hex)) tx.sign(keypairs) return tx
def test_is_signature_candidate(self): mpk_hex = ("08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a688" "63b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d0") keystore = from_master_key(mpk_hex) assert keystore.is_signature_candidate(XPublicKey.from_hex( 'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68' '863b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d000000400' )) assert keystore.is_signature_candidate(XPublicKey.from_hex( 'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d' 'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301' )) with pytest.raises(ValueError): keystore.is_signature_candidate(XPublicKey.from_hex( 'fe18863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d' 'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301' ))
def test_hex_master_public_key(self): # An uncompressed public key in hex form without the 04 prefix mpk_hex = ("08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a688" "63b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d0") keystore = from_master_key(mpk_hex) assert isinstance(keystore, Old_KeyStore) assert keystore.get_master_public_key() == mpk_hex assert keystore.to_derivation_data() == {'mpk': mpk_hex, 'subpaths':[]} assert keystore.is_watching_only() assert keystore.get_xpubkey((0, 4)) == XPublicKey.from_hex( 'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68' '863b37df75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d000000400' ) assert keystore.get_xpubkey((1, 259)) == XPublicKey.from_hex( 'fe08863ac1de668decc6406880c4c8d9a74e9986a5e8d9f2be262ac4af8a68863b37d' 'f75ac48afcbb68bdd6a00f58a648bda9e5eb5e73bd51ef130a6e72dc698d001000301' )
def test_raw_public_keys(self, raw_hex, coin): public_key = PublicKey.from_hex(raw_hex) x_pubkey = XPublicKey.from_hex(raw_hex) # assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex) # assert x_pubkey.to_hex() == raw_hex assert not x_pubkey.is_bip32_key() assert x_pubkey.to_public_key() == public_key assert x_pubkey.to_address() == public_key.to_address(coin=coin) assert x_pubkey.to_address().coin() is coin
def test_old_keystore(self, raw_hex, public_key_hex, coin): public_key = PublicKey.from_hex(public_key_hex) assert public_key.is_compressed() is False x_pubkey = XPublicKey.from_hex(raw_hex) # assert x_pubkey.to_bytes() == bytes.fromhex(raw_hex) # assert x_pubkey.to_hex() == raw_hex assert not x_pubkey.is_bip32_key() assert x_pubkey.to_public_key() == public_key assert x_pubkey.to_public_key().is_compressed() is False assert x_pubkey.to_address() == public_key.to_address(coin=coin) assert x_pubkey.to_address().coin() is coin
def test_is_signature_candidate(self): x_pubkey_1 = XPublicKey.from_hex( '04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae' '863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095') assert imported_keystore.is_signature_candidate(x_pubkey_1) x_pubkey_2 = XPublicKey.from_hex( '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c') assert imported_keystore.is_signature_candidate(x_pubkey_2) assert not imported_keystore.is_signature_candidate(XPublicKey.from_hex( '02c113be5c752294f8b0be2727bbf7f1bf71e6bba5c9e9141f611610707bbce4db' )) with pytest.raises(ValueError): imported_keystore.is_signature_candidate(XPublicKey.from_hex( 'fd76a914d9351dcbad5b8f3b8bfa2f2cdc85c28118ca932688ac' )) with pytest.raises(ValueError): imported_keystore.is_signature_candidate(XPublicKey.from_hex( 'fd76a914753e5cd1dd15a7028daa03fe5e47389297ac227a88ac' ))
def test_tx_signed(self): # This is testing the extended parsing for a signed transaction. tx = Transaction.from_extended_bytes(bytes.fromhex(signed_blob)) assert tx.version == 1 assert len(tx.inputs) == 1 txin = tx.inputs[0] assert txin.prev_hash.hex() == '49f35e43fefd22d8bb9e4b3ff294c6286154c25712baf6ab77b646e5074d6aed' assert txin.prev_idx == 1 assert txin.script_sig.to_hex() == '473044022025bdc804c6fe30966f6822dc25086bc6bb0366016e68e880cf6efd2468921f3202200e665db0404f6d6d9f86f73838306ac55bb0d0f6040ac6047d4e820f24f46885412103b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166' assert txin.sequence == 4294967294 assert txin.signatures == [bytes.fromhex('3044022025bdc804c6fe30966f6822dc25086bc6bb0366016e68e880cf6efd2468921f3202200e665db0404f6d6d9f86f73838306ac55bb0d0f6040ac6047d4e820f24f4688541')] assert txin.x_pubkeys == [XPublicKey.from_hex('03b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166')] assert txin.threshold == 1 assert (tx.outputs[0].value == 20112408 and tx.outputs[0].script_pubkey == \ address_from_string('1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script()) assert tx.locktime == 507231 assert tx.to_dict() == {'hex': signed_blob, 'complete': True, 'version': 1} assert tx.serialize() == signed_blob tx.update_signatures(signed_blob) assert tx.estimated_size() == 192
def test_parse_xpub(self): res = XPublicKey.from_hex( 'fe4e13b0f311a55b8a5db9a32e959da9f011b131019d4cebe6141b9e2c93edcbfc0954c358b062a9f94111548e50bde5847a3096b8b7872dcffadb0e9579b9017b01000200' ).to_address() assert res == address_from_string('19h943e4diLc68GXW7G75QNe2KWuMu7BaJ')
def test_derive_pubkey(self, for_change, n, pubkey_hex): xpub = ('xpub661MyMwAqRbcH1RHYeZc1zgwYLJ1dNozE8npCe81pnNYtN6e5KsF6cmt17Fv8w' 'GvJrRiv6Kewm8ggBG6N3XajhoioH3stUmLRi53tk46CiA') keystore = BIP32_KeyStore({'xpub': xpub}) pubkey = keystore.derive_pubkey((for_change, n)) assert pubkey == XPublicKey.from_hex(pubkey_hex).to_public_key()