Ejemplo n.º 1
0
    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'))
Ejemplo n.º 2
0
    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}
Ejemplo n.º 3
0
    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'))
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
    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'))
Ejemplo n.º 6
0
    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]}]}]}'
Ejemplo n.º 7
0
    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'))
Ejemplo n.º 8
0
    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'))
Ejemplo n.º 9
0
 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)
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
def address_to_script(addr):
    return address_from_string(addr).to_script_bytes().hex()
Ejemplo n.º 15
0
#!/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))
Ejemplo n.º 16
0
 def _parse_address(self, line):
     address = self._parse_address_text(line)
     return address_from_string(address)
Ejemplo n.º 17
0
 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
Ejemplo n.º 18
0
 def test_get_addresses(self):
     assert imported_keystore.get_addresses() == [
         address_from_string(addr)
         for addr in ('1KXf5PUHNaV42jE9NbJFPKhGGN1fSSGJNK',
                      '1LoVGDgRs9hTfTNJNuXKSpywcbdvwRXpmK')
     ]
Ejemplo n.º 19
0
            "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),
})
Ejemplo n.º 20
0
 def test_parse_xpub(self):
     res = XPublicKey.from_hex(
         'fe4e13b0f311a55b8a5db9a32e959da9f011b131019d4cebe6141b9e2c93edcbfc0954c358b062a9f94111548e50bde5847a3096b8b7872dcffadb0e9579b9017b01000200'
     ).to_address()
     assert res == address_from_string('19h943e4diLc68GXW7G75QNe2KWuMu7BaJ')
Ejemplo n.º 21
0
 def import_addr(addr):
     address = address_from_string(addr)
     if wallet.import_address(address):
         return address
     return None
Ejemplo n.º 22
0
#!/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')))