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')
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 }