def test_bip39_multisig_seed_bip45_standard(self): seed_words = 'treat dwarf wealth gasp brass outside high rent blood crowd make initial' self.assertEqual(keystore.bip39_is_checksum_valid(seed_words), (True, True)) ks1 = keystore.from_bip39_seed(seed_words, '', "m/45'/0") self.assertTrue(isinstance(ks1, keystore.BIP32_KeyStore)) self.assertEqual( ks1.xpub, 'xpub69xafV4YxC6o8Yiga5EiGLAtqR7rgNgNUGiYgw3S9g9pp6XYUne1KxdcfYtxwmA3eBrzMFuYcNQKfqsXCygCo4GxQFHfywxpUbKNfYvGJka' ) ks2 = keystore.from_xpub( 'xpub6Bco9vrgo8rNUSi8Bjomn8xLA41DwPXeuPcgJamNRhTTyGVHsp8fZXaGzp9ypHoei16J6X3pumMAP1u3Dy4jTSWjm4GZowL7Dcn9u4uZC9W' ) self._check_xpub_keystore_sanity(ks2) self.assertTrue(isinstance(ks2, keystore.BIP32_KeyStore)) w = self._create_multisig_wallet(ks1, ks2) self.assertEqual( w.get_receiving_addresses()[0], address_from_string('3H3iyACDTLJGD2RMjwKZcCwpdYZLwEZzKb')) self.assertEqual( w.get_change_addresses()[0], address_from_string('31hyfHrkhNjiPZp1t7oky5CGNYqSqDAVM9'))
def test_tx_unsigned(self): tx = Transaction.from_hex(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( 'ff0488b21e0000000000000000004f130d773e678a58366711837ec2e33ea601858262f8eaef246a7ebd19909c9a03c3b30e38ca7d797fee1223df1c9827b2a9f3379768f520910260220e0560014600002300' ) ] assert txin.address == address_from_string( '13Vp8Y3hD5Cb6sERfpxePz5vGJizXbWciN') assert txin.threshold == 1 assert tx.outputs == [ TxOutput( 20112408, address_from_string( '1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script()) ] assert tx.locktime == 507231 assert tx.as_dict() == {'hex': unsigned_blob, 'complete': False}
def test_electrum_multisig_seed_standard(self): seed_words = 'blast uniform dragon fiscal ensure vast young utility dinosaur abandon rookie sure' self.assertEqual(seed_type(seed_words), 'standard') ks1 = keystore.from_seed(seed_words, '', True) self._check_seeded_keystore_sanity(ks1) self.assertTrue(isinstance(ks1, keystore.BIP32_KeyStore)) self.assertEqual( ks1.xpub, 'xpub661MyMwAqRbcGNEPu3aJQqXTydqR9t49Tkwb4Esrj112kw8xLthv8uybxvaki4Ygt9xiwZUQGeFTG7T2TUzR3eA4Zp3aq5RXsABHFBUrq4c' ) ks2 = keystore.from_xpub( 'xpub661MyMwAqRbcGfCPEkkyo5WmcrhTq8mi3xuBS7VEZ3LYvsgY1cCFDbenT33bdD12axvrmXhuX3xkAbKci3yZY9ZEk8vhLic7KNhLjqdh5ec' ) self._check_xpub_keystore_sanity(ks2) self.assertTrue(isinstance(ks2, keystore.BIP32_KeyStore)) w = self._create_multisig_wallet(ks1, ks2) self.assertEqual( w.get_receiving_addresses()[0], address_from_string('32ji3QkAgXNz6oFoRfakyD3ys1XXiERQYN')) self.assertEqual( w.get_change_addresses()[0], address_from_string('36XWwEHrrVCLnhjK5MrVVGmUHghr9oWTN1'))
def test_address_to_pubkey(self): addr = address_from_string('1KXf5PUHNaV42jE9NbJFPKhGGN1fSSGJNK') pubkey = imported_keystore.address_to_pubkey(addr) assert pubkey.to_hex() == ( '04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae' '863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095') addr = address_from_string('1JYPZWn7YbJJ8LpNknU1EVxs3JXuVzc7Rd') assert imported_keystore.address_to_pubkey(addr) is None
def test_bip39_seed_bip44_standard(self): seed_words = 'treat dwarf wealth gasp brass outside high rent blood crowd make initial' self.assertEqual(keystore.bip39_is_checksum_valid(seed_words), (True, True)) ks = keystore.from_bip39_seed(seed_words, '', "m/44'/0'/0'") self.assertTrue(isinstance(ks, keystore.BIP32_KeyStore)) self.assertEqual(ks.xpub, 'xpub6DFh1smUsyqmYD4obDX6ngaxhd53Zx7aeFjoobebm7vbkT6f9awJWFuGzBT9FQJEWFBL7UyhMXtYzRcwDuVbcxtv9Ce2W9eMm4KXLdvdbjv') w = self._create_standard_wallet(ks) self.assertEqual(w.get_receiving_addresses()[0], address_from_string('16j7Dqk3Z9DdTdBtHcCVLaNQy9MTgywUUo')) self.assertEqual(w.get_change_addresses()[0], address_from_string('1GG5bVeWgAp5XW7JLCphse14QaC4qiHyWn'))
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 test_electrum_seed_old(self): seed_words = 'powerful random nobody notice nothing important anyway look away hidden message over' self.assertEqual(seed_type(seed_words), 'old') ks = keystore.from_seed(seed_words, '', False) self._check_seeded_keystore_sanity(ks) self.assertTrue(isinstance(ks, keystore.Old_KeyStore)) self.assertEqual(ks.mpk, 'e9d4b7866dd1e91c862aebf62a49548c7dbf7bcc6e4b7b8c9da820c7737968df9c09d5a3e271dc814a29981f81b3faaf2737b551ef5dcc6189cf0f8252c442b3') w = self._create_standard_wallet(ks) self.assertEqual(w.get_receiving_addresses()[0], address_from_string('1FJEEB8ihPMbzs2SkLmr37dHyRFzakqUmo')) self.assertEqual(w.get_change_addresses()[0], address_from_string('1KRW8pH6HFHZh889VDq6fEKvmrsmApwNfe'))
def test_electrum_seed_standard(self): seed_words = 'cycle rocket west magnet parrot shuffle foot correct salt library feed song' self.assertEqual(seed_type(seed_words), 'standard') ks = keystore.from_seed(seed_words, '', False) self._check_seeded_keystore_sanity(ks) self.assertTrue(isinstance(ks, keystore.BIP32_KeyStore)) self.assertEqual(ks.xpub, 'xpub661MyMwAqRbcFWohJWt7PHsFEJfZAvw9ZxwQoDa4SoMgsDDM1T7WK3u9E4edkC4ugRnZ8E4xDZRpk8Rnts3Nbt97dPwT52CwBdDWroaZf8U') w = self._create_standard_wallet(ks) self.assertEqual(w.get_receiving_addresses()[0], address_from_string('1NNkttn1YvVGdqBW4PR6zvc3Zx3H5owKRf')) self.assertEqual(w.get_change_addresses()[0], address_from_string('1KSezYMhAJMWqFbVFB2JshYg69UpmEXR4D'))
def test_pubkeys_to_address(self, tmp_storage, network): coin = network.COIN privkey = PrivateKey.from_random() WIF = privkey.to_WIF(coin=coin) parent_wallet = _TestableParentWallet.as_legacy_wallet_container( tmp_storage) wallet = ImportedPrivkeyWallet.from_text(parent_wallet, WIF) public_key = privkey.public_key pubkey_hex = public_key.to_hex() address = public_key.to_address(coin=coin).to_string() assert wallet.pubkeys_to_address(pubkey_hex) == address_from_string( address)
def update_labels(self, wallet: Abstract_Wallet, updates: Dict[str, str]) -> None: with self._update_lock: new_flags = EventFlags.ADDRESS_UPDATED | EventFlags.LABEL_UPDATE addresses = [] for label_key in updates.keys(): # Labels can be for both addresses and transactions. try: address = address_from_string(label_key) except ValueError: continue flags = self._pending_state.get(address, EventFlags.UNSET) self._pending_state[address] = flags | new_flags
def test_tx_signed(self): tx = Transaction.from_hex(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( '03b5bbebceeb33c1b61f649596b9c3611c6b2853a1f6b48bce05dd54f667fa2166' ) ] assert txin.address == address_from_string( '13Vp8Y3hD5Cb6sERfpxePz5vGJizXbWciN') assert txin.threshold == 1 assert tx.outputs == [ TxOutput( 20112408, address_from_string( '1MYXdf4moacvaEKZ57ozerpJ3t9xSeN6LK').to_script()) ] assert tx.locktime == 507231 assert tx.as_dict() == {'hex': signed_blob, 'complete': True} assert tx.serialize() == signed_blob tx.update_signatures(signed_blob) assert tx.estimated_size() == 192
def on_update(self): # hide receive tab if no receive requests available b = len(self.wallet.receive_requests) > 0 self.setVisible(b) self.parent.receive_requests_label.setVisible(b) if not b: self.parent.expires_label.hide() self.parent.expires_combo.show() # update the receive address if necessary current_address_string = self.parent.receive_address_e.text().strip() current_address = (address_from_string(current_address_string) if len(current_address_string) else None) domain = self.wallet.get_receiving_addresses() addr = self.wallet.get_unused_address() if not current_address in domain and addr: self.parent.set_receive_address(addr) self.parent.new_request_button.setEnabled(addr != current_address) wallet_id = self.wallet.get_id() # clear the list and fill it again self.clear() for req in self.wallet.get_sorted_requests(self.config): address = req['address'] if address not in domain: continue timestamp = req.get('time', 0) amount = req.get('amount') expiration = req.get('exp', None) message = req.get('memo', '') date = format_time(timestamp, _("Unknown")) status = req.get('status') amount_str = self.parent.format_amount(amount) if amount else "" item = QTreeWidgetItem([ date, address.to_string(), '', message, amount_str, pr_tooltips.get(status, '') ]) item.setData(0, Qt.UserRole, (wallet_id, address)) if status is not PR_UNKNOWN: item.setIcon(6, read_QIcon(pr_icons.get(status))) self.addTopLevelItem(item)
def test_address_to_scripthash(self): for priv_details in self.priv_pub_addr: sh = scripthash_hex(address_from_string(priv_details['address'])) self.assertEqual(priv_details['scripthash'], sh)
def address_to_script(addr): return address_from_string(addr).to_script_bytes().hex()
#!/usr/bin/env python3 import sys from electrumsv.network import Network from electrumsv.util import json_encode from electrumsv.bitcoin import address_from_string try: addr = sys.argv[1] except Exception: print("usage: get_history <bitcoin_address>") sys.exit(1) n = Network() n.start() sh = address_from_string(addr).to_scripthash_hex() h = n.synchronous_get(('blockchain.scripthash.get_history', [sh])) print(json_encode(h))
def _parse_address(self, line): address = self._parse_address_text(line) return address_from_string(address)
def import_addr(addr): address = address_from_string(addr) if account.import_address(address): return addr # Show duplicate addition same as good addition. return addr
def test_get_addresses(self): assert imported_keystore.get_addresses() == [ address_from_string(addr) for addr in ('1KXf5PUHNaV42jE9NbJFPKhGGN1fSSGJNK', '1LoVGDgRs9hTfTNJNuXKSpywcbdvwRXpmK') ]
"tx_hash": "3f5a1badfe1beb42b650f325b20935f09f3ab43a3c473c5be18f58308fc7eff1", "tx_pos": 3, }, ], } result_S = ([ UTXO(value=45318048, script_pubkey=Script.from_hex( '76a914cb3e86e38ce37d5add87d3da753adc04a04bf60c88ac'), tx_hash= '9f2c45a12db0144909b5db269415f7319179105982ac70ed80d76ea79d923ebf', out_index=0, height=437146, address=address_from_string('1KXf5PUHNaV42jE9NbJFPKhGGN1fSSGJNK'), is_coinbase=False) ], { XPublicKey('04e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c0128894ae863d086488e6773c4589be93a1793f685dd3f1e8a1f1b390b23470f7d1095'): (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ', False), XPublicKey('03e7dd15b4271f8308ff52ad3d3e472b652e78a2c5bc6ed10250a543d28c012889'): (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ', True), XPublicKey('fd76a914cb3e86e38ce37d5add87d3da753adc04a04bf60c88ac'): (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ', False), XPublicKey('fd76a9142af9bdc179471526aef15781b00ab6ebd162a45888ac'): (b'\x98\xe3\x15\xc3%j\x97\x17\xd4\xdd\xea0\xeb*\n-V\xa1d\x93yN\xb0SSf\xea"\xd8i\xa3 ', True), })
def test_parse_xpub(self): res = XPublicKey.from_hex( 'fe4e13b0f311a55b8a5db9a32e959da9f011b131019d4cebe6141b9e2c93edcbfc0954c358b062a9f94111548e50bde5847a3096b8b7872dcffadb0e9579b9017b01000200' ).to_address() assert res == address_from_string('19h943e4diLc68GXW7G75QNe2KWuMu7BaJ')
def import_addr(addr): address = address_from_string(addr) if wallet.import_address(address): return address return None
#!/usr/bin/env python3 import sys import time from electrumsv.simple_config import SimpleConfig from electrumsv.network import Network from electrumsv.util import json_encode from electrumsv.bitcoin import address_from_string try: addr = address_from_string(sys.argv[1]) except Exception: print("usage: watch_address <bitcoin_address>") sys.exit(1) # start network c = SimpleConfig() network = Network(c) network.start() # wait until connected while network.is_connecting(): time.sleep(0.1) if not network.is_connected(): print("daemon is not connected") sys.exit(1) # 2. send the subscription sh = addr.to_scripthash_hex() callback = lambda response: print(json_encode(response.get('result')))