From 450480791bf9506484d40348ebb28a3261c6a019 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 26 Jan 2022 13:44:53 +0100 Subject: [PATCH] adding show address in ledgerSigner --- .gitignore | 1 + CHANGELOG.md | 1 + packages/ledger-amino/src/launchpadledger.ts | 11 +++++++++++ packages/ledger-amino/src/ledgersigner.ts | 19 +++++++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/.gitignore b/.gitignore index 89489961ca..b7c70c8fea 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ node_modules/ # IDE-specific .vscode/ +.idea/ # demo mnemonics from cli *.key diff --git a/CHANGELOG.md b/CHANGELOG.md index 9139b3a502..c620743fb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to JavaScript objects and the JSON representation of `cosmwasm_std::Binary` (base64). - @cosmjs/cosmwasm-stargate: Export `WasmExtension` and `setupWasmExtension`. +- @cosmjs/ledger-amino: Added `showAddress` in LedgerSigner. ### Changed diff --git a/packages/ledger-amino/src/launchpadledger.ts b/packages/ledger-amino/src/launchpadledger.ts index 37d2d0bf28..962d33695b 100644 --- a/packages/ledger-amino/src/launchpadledger.ts +++ b/packages/ledger-amino/src/launchpadledger.ts @@ -4,6 +4,7 @@ import { fromUtf8 } from "@cosmjs/encoding"; import { assert } from "@cosmjs/utils"; import Transport from "@ledgerhq/hw-transport"; import CosmosApp, { + AddressAndPublicKeyResponse, AppInfoResponse, PublicKeyResponse, SignResponse, @@ -166,6 +167,16 @@ export class LaunchpadLedger { await this.verifyCosmosAppIsOpen(); } + public async verifyAddress(hdPath?: HdPath): Promise { + await this.verifyDeviceIsReady(); + + const hdPathToUse = hdPath || this.hdPaths[0]; + // ledger-cosmos-js hardens the first three indices + const response = await this.app.showAddressAndPubKey(unharden(hdPathToUse), this.prefix); + this.handleLedgerErrors(response); + return response as AddressAndPublicKeyResponse; + } + private handleLedgerErrors( /* eslint-disable @typescript-eslint/naming-convention */ { diff --git a/packages/ledger-amino/src/ledgersigner.ts b/packages/ledger-amino/src/ledgersigner.ts index dc3cd0d874..1e1650202a 100644 --- a/packages/ledger-amino/src/ledgersigner.ts +++ b/packages/ledger-amino/src/ledgersigner.ts @@ -4,6 +4,7 @@ import { encodeSecp256k1Signature, makeCosmoshubPath, OfflineAminoSigner, + Secp256k1Pubkey, serializeSignDoc, StdSignDoc, } from "@cosmjs/amino"; @@ -12,6 +13,11 @@ import Transport from "@ledgerhq/hw-transport"; import { LaunchpadLedger, LaunchpadLedgerOptions } from "./launchpadledger"; +export interface AddressAndPubkey { + readonly address: string; + readonly pubkey: Secp256k1Pubkey; +} + export class LedgerSigner implements OfflineAminoSigner { private readonly ledger: LaunchpadLedger; private readonly hdPaths: readonly HdPath[]; @@ -37,6 +43,19 @@ export class LedgerSigner implements OfflineAminoSigner { return this.accounts; } + public async showAddress(path: HdPath): Promise { + const response = await this.ledger.verifyAddress(path); + + if (response.error_message) { + throw new Error(response.error_message); + } + + return { + address: response.address, + pubkey: response.compressed_pk, + }; + } + public async signAmino(signerAddress: string, signDoc: StdSignDoc): Promise { const accounts = this.accounts || (await this.getAccounts()); const accountIndex = accounts.findIndex((account) => account.address === signerAddress);