def display_singlesig_address( self, keypath: str, addr_type: AddressType, ) -> str: self._check_unlocked() # Script type if addr_type == AddressType.SH_WIT: script_type = messages.InputScriptType.SPENDP2SHWITNESS elif addr_type == AddressType.WIT: script_type = messages.InputScriptType.SPENDWITNESS elif addr_type == AddressType.LEGACY: script_type = messages.InputScriptType.SPENDADDRESS else: raise BadArgumentError("Unknown address type") expanded_path = parse_path(keypath) try: address = btc.get_address( self.client, self.coin_name, expanded_path, show_display=True, script_type=script_type, multisig=None, ) assert isinstance(address, str) return address except Exception: pass raise BadArgumentError("No path supplied matched device keys")
def display_address(self, keypath, p2sh_p2wpkh, bech32, redeem_script=None): self._check_unlocked() # redeem_script means p2sh/multisig if redeem_script: # Get multisig object required by Trezor's get_address multisig = parse_multisig(bytes.fromhex(redeem_script)) if not multisig[0]: raise BadArgumentError( "The redeem script provided is not a multisig. Only multisig scripts can be displayed." ) multisig = multisig[1] else: multisig = None # Script type if p2sh_p2wpkh: script_type = proto.InputScriptType.SPENDP2SHWITNESS elif bech32: script_type = proto.InputScriptType.SPENDWITNESS elif redeem_script: script_type = proto.InputScriptType.SPENDMULTISIG else: script_type = proto.InputScriptType.SPENDADDRESS # convert device fingerprint to 'm' if exists in path keypath = keypath.replace(self.get_master_fingerprint_hex(), "m") for path in keypath.split(","): if len(path.split("/")[0]) == 8: path = path.split("/", 1)[1] expanded_path = tools.parse_path(path) try: address = btc.get_address( self.client, self.coin_name, expanded_path, show_display=True, script_type=script_type, multisig=multisig, ) return {"address": address} except: pass raise BadArgumentError("No path supplied matched device keys")
def display_multisig_address( self, addr_type: AddressType, multisig: MultisigDescriptor, ) -> str: self._check_unlocked() der_pks = list( zip([p.get_pubkey_bytes(0) for p in multisig.pubkeys], multisig.pubkeys) ) if multisig.is_sorted: der_pks = sorted(der_pks) pubkey_objs = [] for pk, p in der_pks: if p.extkey is not None: xpub = p.extkey hd_node = messages.HDNodeType( depth=xpub.depth, fingerprint=int.from_bytes(xpub.parent_fingerprint, "big"), child_num=xpub.child_num, chain_code=xpub.chaincode, public_key=xpub.pubkey, ) pubkey_objs.append( messages.HDNodePathType( node=hd_node, address_n=parse_path( "m" + p.deriv_path if p.deriv_path is not None else "" ), ) ) else: hd_node = messages.HDNodeType( depth=0, fingerprint=0, child_num=0, chain_code=b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", public_key=pk, ) pubkey_objs.append(messages.HDNodePathType(node=hd_node, address_n=[])) trezor_ms = messages.MultisigRedeemScriptType( m=multisig.thresh, signatures=[b""] * len(pubkey_objs), pubkeys=pubkey_objs ) # Script type if addr_type == AddressType.SH_WIT: script_type = messages.InputScriptType.SPENDP2SHWITNESS elif addr_type == AddressType.WIT: script_type = messages.InputScriptType.SPENDWITNESS elif addr_type == AddressType.LEGACY: script_type = messages.InputScriptType.SPENDMULTISIG else: raise BadArgumentError("Unknown address type") for p in multisig.pubkeys: keypath = p.origin.get_derivation_path() if p.origin is not None else "m/" keypath += p.deriv_path if p.deriv_path is not None else "" path = parse_path(keypath) try: address = btc.get_address( self.client, self.coin_name, path, show_display=True, script_type=script_type, multisig=trezor_ms, ) assert isinstance(address, str) return address except Exception: pass raise BadArgumentError("No path supplied matched device keys")
def display_address(self, keypath, p2sh_p2wpkh, bech32, redeem_script=None, descriptor=None): self._check_unlocked() # descriptor means multisig with xpubs if descriptor: pubkeys = [] xpub = ExtendedKey() for i in range(0, descriptor.multisig_N): xpub.deserialize(descriptor.base_key[i]) hd_node = proto.HDNodeType( depth=xpub.depth, fingerprint=int.from_bytes(xpub.parent_fingerprint, "big"), child_num=xpub.child_num, chain_code=xpub.chaincode, public_key=xpub.pubkey, ) pubkeys.append( proto.HDNodePathType( node=hd_node, address_n=tools.parse_path("m" + descriptor.path_suffix[i]), )) multisig = proto.MultisigRedeemScriptType( m=int(descriptor.multisig_M), signatures=[b""] * int(descriptor.multisig_N), pubkeys=pubkeys, ) # redeem_script means p2sh/multisig elif redeem_script: # Get multisig object required by Trezor's get_address multisig = parse_multisig(bytes.fromhex(redeem_script)) if not multisig[0]: raise BadArgumentError( "The redeem script provided is not a multisig. Only multisig scripts can be displayed." ) multisig = multisig[1] else: multisig = None # Script type if p2sh_p2wpkh: script_type = proto.InputScriptType.SPENDP2SHWITNESS elif bech32: script_type = proto.InputScriptType.SPENDWITNESS elif redeem_script: script_type = proto.InputScriptType.SPENDMULTISIG else: script_type = proto.InputScriptType.SPENDADDRESS # convert device fingerprint to 'm' if exists in path keypath = keypath.replace(self.get_master_fingerprint_hex(), "m") for path in keypath.split(","): if len(path.split("/")[0]) == 8: path = path.split("/", 1)[1] expanded_path = tools.parse_path(path) try: address = btc.get_address( self.client, self.coin_name, expanded_path, show_display=True, script_type=script_type, multisig=multisig, ) return {"address": address} except: pass raise BadArgumentError("No path supplied matched device keys")