From 7b005b4244e33aa53e223a09007f4e7fc7ba79f1 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 16 Sep 2020 12:44:48 +0200 Subject: [PATCH] launchpad-ledger: Fully support multiple accounts --- .../launchpad-ledger/src/launchpadledger.ts | 6 +++++- packages/launchpad-ledger/src/ledgersigner.ts | 18 +++++++++++++++--- .../launchpad-ledger/types/ledgersigner.d.ts | 7 ++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/packages/launchpad-ledger/src/launchpadledger.ts b/packages/launchpad-ledger/src/launchpadledger.ts index efecf95b..4d027ce0 100644 --- a/packages/launchpad-ledger/src/launchpadledger.ts +++ b/packages/launchpad-ledger/src/launchpadledger.ts @@ -122,7 +122,11 @@ export class LaunchpadLedger { } async getPubkeys(): Promise { - return Promise.all(this.hdPaths.map(async (hdPath) => this.getPubkey(hdPath))); + return this.hdPaths.reduce( + (promise: Promise, hdPath) => + promise.then(async (pubkeys) => [...pubkeys, await this.getPubkey(hdPath)]), + Promise.resolve([]), + ); } async getCosmosAddress(pubkey?: Uint8Array): Promise { diff --git a/packages/launchpad-ledger/src/ledgersigner.ts b/packages/launchpad-ledger/src/ledgersigner.ts index 836c7480..fadf36d3 100644 --- a/packages/launchpad-ledger/src/ledgersigner.ts +++ b/packages/launchpad-ledger/src/ledgersigner.ts @@ -1,4 +1,10 @@ -import { AccountData, encodeSecp256k1Signature, OfflineSigner, StdSignature } from "@cosmjs/launchpad"; +import { + AccountData, + encodeSecp256k1Signature, + makeCosmoshubPath, + OfflineSigner, + StdSignature, +} from "@cosmjs/launchpad"; import { LaunchpadLedger, LaunchpadLedgerOptions } from "./launchpadledger"; @@ -27,7 +33,12 @@ export class LedgerSigner implements OfflineSigner { return this.accounts; } - public async sign(address: string, message: Uint8Array): Promise { + public async sign( + address: string, + message: Uint8Array, + _prehashType?: "sha256" | "sha512" | null, + accountNumber = 0, + ): Promise { await this.ledger.connect(); const accounts = this.accounts || (await this.getAccounts()); @@ -37,7 +48,8 @@ export class LedgerSigner implements OfflineSigner { throw new Error(`Address ${address} not found in wallet`); } - const signature = await this.ledger.sign(message); + const hdPath = makeCosmoshubPath(accountNumber); + const signature = await this.ledger.sign(message, hdPath); return encodeSecp256k1Signature(accountForAddress.pubkey, signature); } } diff --git a/packages/launchpad-ledger/types/ledgersigner.d.ts b/packages/launchpad-ledger/types/ledgersigner.d.ts index dc4c4e49..e504db61 100644 --- a/packages/launchpad-ledger/types/ledgersigner.d.ts +++ b/packages/launchpad-ledger/types/ledgersigner.d.ts @@ -5,5 +5,10 @@ export declare class LedgerSigner implements OfflineSigner { private accounts?; constructor(options?: LaunchpadLedgerOptions); getAccounts(): Promise; - sign(address: string, message: Uint8Array): Promise; + sign( + address: string, + message: Uint8Array, + _prehashType?: "sha256" | "sha512" | null, + accountNumber?: number, + ): Promise; }