Exemplo n.º 1
0
    def make_txt(self, fp, addr, wif, privkey, qr_addr=None, qr_wif=None):
        # Generate the "simple" text file version, includes private key.
        from ubinascii import hexlify as b2a_hex
        from descriptor import append_checksum
        import ujson

        fp.write('Coldcard Generated Paper Wallet\n\n')

        fp.write('Deposit address:\n\n  %s\n\n' % addr)
        fp.write('Private key (WIF=Wallet Import Format):\n\n  %s\n\n' % wif)
        fp.write('Private key (Hex, 32 bytes):\n\n  %s\n\n' % b2a_hex(privkey).decode('ascii'))
        fp.write('Bitcoin Core command:\n\n')

        # new hotness: output descriptors
        desc = ('wpkh(%s)' if self.is_segwit else 'pkh(%s)') % wif
        multi = ujson.dumps(dict(timestamp=FEATURE_RELEASE_TIME, desc=append_checksum(desc)))
        fp.write("  bitcoin-cli importmulti '[%s]'\n\n" % multi)
        fp.write('# OR (more compatible, but slower)\n\n  bitcoin-cli importprivkey "%s"\n\n' % wif)

        if qr_addr and qr_wif:
            fp.write('\n\n--- QR Codes ---   (requires UTF-8, unicode, white background)\n\n\n\n')

            for idx, (qr, val) in enumerate([(qr_addr, addr), (qr_wif, wif)]):
                fp.write(('Private key' if idx else 'Deposit address') + ':\n\n')

                w = qr.width()
                for y in range(w):
                    fp.write('        ')
                    ln = ''.join('\u2588\u2588' if qr.get(x,y) else '  ' for x in range(w))
                    fp.write(ln)
                    fp.write('\n')

                fp.write('\n        %s\n\n\n\n' % val)

        fp.write('\n\n\n')
Exemplo n.º 2
0
def generate_bitcoin_core_wallet(example_addrs, account_num):
    # Generate the data for an RPC command to import keys into Bitcoin Core
    # - yields dicts for json purposes
    from descriptor import append_checksum
    from main import settings
    import ustruct

    from public_constants import AF_P2WPKH

    chain = chains.current_chain()

    derive = "84'/{coin_type}'/{account}'".format(account=account_num,
                                                  coin_type=chain.b44_cointype)

    with stash.SensitiveValues() as sv:
        prefix = sv.derive_path(derive)
        xpub = chain.serialize_public(prefix)

        for i in range(3):
            sp = '0/%d' % i
            node = sv.derive_path(sp, master=prefix)
            a = chain.address(node, AF_P2WPKH)
            example_addrs.append(('m/%s/%s' % (derive, sp), a))

    xfp = settings.get('xfp')
    txt_xfp = xfp2str(xfp).lower()

    chain = chains.current_chain()

    _, vers, _ = version.get_mpy_version()

    for internal in [False, True]:
        desc = "wpkh([{fingerprint}/{derive}]{xpub}/{change}/*)".format(
            derive=derive.replace("'", "h"),
            fingerprint=txt_xfp,
            coin_type=chain.b44_cointype,
            account=0,
            xpub=xpub,
            change=(1 if internal else 0))

        yield {
            'desc': append_checksum(desc),
            'range': [0, 1000],
            'timestamp': 'now',
            'internal': internal,
            'keypool': True,
            'watchonly': True
        }