def get_pubkey_at_path(self, path): if not check_keypath(path): raise BadArgumentError("Invalid keypath") path = path[2:] path = path.replace("h", "'") path = path.replace("H", "'") # This call returns raw uncompressed pubkey, chaincode pubkey = self.app.getWalletPublicKey(path) if path != "": parent_path = "" for ind in path.split("/")[:-1]: parent_path += ind + "/" parent_path = parent_path[:-1] # Get parent key fingerprint parent = self.app.getWalletPublicKey(parent_path) fpr = hash160(compress_public_key(parent["publicKey"]))[:4] # Compute child info childstr = path.split("/")[-1] hard = 0 if childstr[-1] == "'" or childstr[-1] == "h" or childstr[ -1] == "H": childstr = childstr[:-1] hard = 0x80000000 child = struct.pack(">I", int(childstr) + hard) # Special case for m else: child = bytearray.fromhex("00000000") fpr = child chainCode = pubkey["chainCode"] publicKey = compress_public_key(pubkey["publicKey"]) depth = len(path.split("/")) if len(path) > 0 else 0 depth = struct.pack("B", depth) if self.is_testnet: version = bytearray.fromhex("043587CF") else: version = bytearray.fromhex("0488B21E") extkey = version + depth + fpr + child + chainCode + publicKey checksum = hash256(extkey)[:4] xpub = base58.encode(extkey + checksum) result = {"xpub": xpub} if self.expert: xpub_obj = ExtendedKey() xpub_obj.deserialize(xpub) result.update(xpub_obj.get_printable_dict()) return result
def get_pubkey_at_path(self, path): self._check_unlocked() try: expanded_path = tools.parse_path(path) except ValueError as e: raise BadArgumentError(str(e)) output = btc.get_public_node(self.client, expanded_path, coin_name=self.coin_name) if self.is_testnet: result = {'xpub': xpub_main_2_test(output.xpub)} else: result = {'xpub': output.xpub} if self.expert: xpub_obj = ExtendedKey() xpub_obj.deserialize(output.xpub) result.update(xpub_obj.get_printable_dict()) return result