async def get_address(ctx, msg, keychain): coin_name = msg.coin_name or "Bitcoin" coin = coins.by_name(coin_name) await validate_path( ctx, addresses.validate_full_path, keychain, msg.address_n, coin.curve_name, coin=coin, script_type=msg.script_type, ) node = keychain.derive(msg.address_n, coin.curve_name) address = addresses.get_address(msg.script_type, coin, node, msg.multisig) address_short = addresses.address_short(coin, address) if msg.script_type == InputScriptType.SPENDWITNESS: address_qr = address.upper() # bech32 address else: address_qr = address # base58 address if msg.show_display: if msg.multisig: desc = "Multisig %d of %d" % (msg.multisig.m, len(msg.multisig.pubkeys)) else: desc = address_n_to_str(msg.address_n) while True: if await show_address(ctx, address_short, desc=desc): break if await show_qr(ctx, address_qr, desc=desc): break return Address(address=address)
async def sign_message(ctx, msg): message = msg.message address_n = msg.address_n coin_name = msg.coin_name or 'Bitcoin' script_type = msg.script_type or 0 coin = coins.by_name(coin_name) await require_confirm_sign_message(ctx, message) node = await seed.derive_node(ctx, address_n) seckey = node.private_key() address = get_address(script_type, coin, node) digest = message_digest(coin, message) signature = secp256k1.sign(seckey, digest) if script_type == SPENDADDRESS: pass elif script_type == SPENDP2SHWITNESS: signature = bytes([signature[0] + 4]) + signature[1:] elif script_type == SPENDWITNESS: signature = bytes([signature[0] + 8]) + signature[1:] else: raise wire.ProcessError('Unsupported script type') return MessageSignature(address=address, signature=signature)
async def sign_message(ctx, msg, keychain): message = msg.message address_n = msg.address_n coin_name = msg.coin_name or "Bitcoin" script_type = msg.script_type or 0 coin = coins.by_name(coin_name) await require_confirm_sign_message(ctx, message) await validate_path( ctx, validate_full_path, keychain, msg.address_n, coin=coin, script_type=msg.script_type, validate_script_type=False, ) node = keychain.derive(address_n, coin.curve_name) seckey = node.private_key() address = get_address(script_type, coin, node) digest = message_digest(coin, message) signature = secp256k1.sign(seckey, digest) if script_type == SPENDADDRESS: pass elif script_type == SPENDP2SHWITNESS: signature = bytes([signature[0] + 4]) + signature[1:] elif script_type == SPENDWITNESS: signature = bytes([signature[0] + 8]) + signature[1:] else: raise wire.ProcessError("Unsupported script type") return MessageSignature(address=address, signature=signature)
async def get_address(ctx, msg): coin_name = msg.coin_name or "Bitcoin" coin = coins.by_name(coin_name) node = await seed.derive_node(ctx, msg.address_n, curve_name=coin.curve_name) address = addresses.get_address(msg.script_type, coin, node, msg.multisig) address_short = addresses.address_short(coin, address) if msg.show_display: if msg.multisig: desc = "Multisig %d of %d" % (msg.multisig.m, len(msg.multisig.pubkeys)) else: desc = address_n_to_str(msg.address_n) while True: if await show_address(ctx, address_short, desc=desc): break if await show_qr( ctx, address.upper() if msg.script_type == InputScriptType.SPENDWITNESS else address, desc=desc, ): break return Address(address=address)
def get_address_for_change( o: TxOutputType, coin: coininfo.CoinInfo, keychain: seed.Keychain ): try: input_script_type = helpers.CHANGE_OUTPUT_TO_INPUT_SCRIPT_TYPES[o.script_type] except KeyError: raise SigningError(FailureType.DataError, "Invalid script type") node = keychain.derive(o.address_n, coin.curve_name) return addresses.get_address(input_script_type, coin, node, o.multisig)
def get_address_for_change(o: TxOutputType, coin: coininfo.CoinInfo, keychain: seed.Keychain): if o.script_type == OutputScriptType.PAYTOADDRESS: input_script_type = InputScriptType.SPENDADDRESS elif o.script_type == OutputScriptType.PAYTOMULTISIG: input_script_type = InputScriptType.SPENDMULTISIG elif o.script_type == OutputScriptType.PAYTOWITNESS: input_script_type = InputScriptType.SPENDWITNESS elif o.script_type == OutputScriptType.PAYTOP2SHWITNESS: input_script_type = InputScriptType.SPENDP2SHWITNESS else: raise SigningError(FailureType.DataError, "Invalid script type") node = keychain.derive(o.address_n, coin.curve_name) return addresses.get_address(input_script_type, coin, node, o.multisig)
def output_derive_script(self, txo: TxOutputType) -> bytes: if txo.address_n: # change output try: input_script_type = helpers.CHANGE_OUTPUT_TO_INPUT_SCRIPT_TYPES[ txo.script_type] except KeyError: raise SigningError(FailureType.DataError, "Invalid script type") node = self.keychain.derive(txo.address_n) txo.address = addresses.get_address(input_script_type, self.coin, node, txo.multisig) return scripts.output_derive_script(txo, self.coin)
async def get_address(ctx, msg, keychain): coin_name = msg.coin_name or "Bitcoin" coin = coins.by_name(coin_name) await validate_path( ctx, addresses.validate_full_path, keychain, msg.address_n, coin.curve_name, coin=coin, script_type=msg.script_type, ) node = keychain.derive(msg.address_n, coin.curve_name) address = addresses.get_address(msg.script_type, coin, node, msg.multisig) address_short = addresses.address_short(coin, address) if msg.script_type == InputScriptType.SPENDWITNESS: address_qr = address.upper() # bech32 address elif coin.cashaddr_prefix is not None: address_qr = address.upper() # cashaddr address else: address_qr = address # base58 address if msg.show_display: if msg.multisig: if msg.multisig.nodes: pubnodes = msg.multisig.nodes else: pubnodes = [hd.node for hd in msg.multisig.pubkeys] multisig_index = multisig_pubkey_index(msg.multisig, node.public_key()) desc = "Multisig %d of %d" % (msg.multisig.m, len(pubnodes)) while True: if await show_address(ctx, address_short, desc=desc): break if await show_qr(ctx, address_qr, desc=desc, cancel="XPUBs"): break if await show_xpubs(ctx, coin, pubnodes, multisig_index): break else: desc = address_n_to_str(msg.address_n) while True: if await show_address(ctx, address_short, desc=desc): break if await show_qr(ctx, address_qr, desc=desc): break return Address(address=address)
async def get_address(ctx, msg): coin_name = msg.coin_name or 'Bitcoin' coin = coins.by_name(coin_name) node = await seed.derive_node(ctx, msg.address_n) address = addresses.get_address(msg.script_type, coin, node, msg.multisig) address_short = address[len(coin.cashaddr_prefix) + 1:] if coin.cashaddr_prefix is not None else address if msg.show_display: while True: if await _show_address(ctx, address_short): break if await _show_qr(ctx, address.upper() if msg.script_type == InputScriptType.SPENDWITNESS else address): break return Address(address=address)
async def get_address(ctx, msg): coin_name = msg.coin_name or "Bitcoin" coin = coins.by_name(coin_name) node = await seed.derive_node(ctx, msg.address_n, curve_name=coin.curve_name) address = addresses.get_address(msg.script_type, coin, node, msg.multisig) address_short = addresses.address_short(coin, address) if msg.show_display: while True: if await show_address(ctx, address_short): break if await show_qr( ctx, address.upper() if msg.script_type == InputScriptType.SPENDWITNESS else address, ): break return Address(address=address)