From 5d426ac35cd8c98f2e688a6396f75d05841fee22 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 16 Sep 2020 13:38:57 +0200 Subject: [PATCH] launchpad-ledger: Improve account number handling --- packages/launchpad-ledger/src/ledgersigner.ts | 34 +++++++++++-------- .../launchpad-ledger/types/ledgersigner.d.ts | 16 ++++----- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/packages/launchpad-ledger/src/ledgersigner.ts b/packages/launchpad-ledger/src/ledgersigner.ts index fadf36d3..3a1ac73b 100644 --- a/packages/launchpad-ledger/src/ledgersigner.ts +++ b/packages/launchpad-ledger/src/ledgersigner.ts @@ -6,19 +6,28 @@ import { StdSignature, } from "@cosmjs/launchpad"; -import { LaunchpadLedger, LaunchpadLedgerOptions } from "./launchpadledger"; +import { LaunchpadLedger } from "./launchpadledger"; + +export interface LedgerSignerOptions { + readonly accountNumbers?: readonly number[]; + readonly prefix?: string; + readonly testModeAllowed?: boolean; +} export class LedgerSigner implements OfflineSigner { private readonly ledger: LaunchpadLedger; + private readonly accountNumbers: readonly number[]; private accounts?: readonly AccountData[]; - constructor(options?: LaunchpadLedgerOptions) { - this.ledger = new LaunchpadLedger(options); + constructor({ accountNumbers = [0], ...restOptions }: LedgerSignerOptions = {}) { + this.accountNumbers = accountNumbers; + this.ledger = new LaunchpadLedger({ + ...restOptions, + hdPaths: accountNumbers.map(makeCosmoshubPath), + }); } public async getAccounts(): Promise { - await this.ledger.connect(); - if (!this.accounts) { const pubkeys = await this.ledger.getPubkeys(); this.accounts = await Promise.all( @@ -33,21 +42,16 @@ export class LedgerSigner implements OfflineSigner { return this.accounts; } - public async sign( - address: string, - message: Uint8Array, - _prehashType?: "sha256" | "sha512" | null, - accountNumber = 0, - ): Promise { - await this.ledger.connect(); - + public async sign(address: string, message: Uint8Array): Promise { const accounts = this.accounts || (await this.getAccounts()); - const accountForAddress = accounts.find((account) => account.address === address); + const accountIndex = accounts.findIndex((account) => account.address === address); - if (!accountForAddress) { + if (accountIndex === -1) { throw new Error(`Address ${address} not found in wallet`); } + const accountForAddress = accounts[accountIndex]; + const accountNumber = this.accountNumbers[accountIndex]; 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 e504db61..3b9e11ee 100644 --- a/packages/launchpad-ledger/types/ledgersigner.d.ts +++ b/packages/launchpad-ledger/types/ledgersigner.d.ts @@ -1,14 +1,14 @@ import { AccountData, OfflineSigner, StdSignature } from "@cosmjs/launchpad"; -import { LaunchpadLedgerOptions } from "./launchpadledger"; +export interface LedgerSignerOptions { + readonly accountNumbers?: readonly number[]; + readonly prefix?: string; + readonly testModeAllowed?: boolean; +} export declare class LedgerSigner implements OfflineSigner { private readonly ledger; + private readonly accountNumbers; private accounts?; - constructor(options?: LaunchpadLedgerOptions); + constructor({ accountNumbers, ...restOptions }?: LedgerSignerOptions); getAccounts(): Promise; - sign( - address: string, - message: Uint8Array, - _prehashType?: "sha256" | "sha512" | null, - accountNumber?: number, - ): Promise; + sign(address: string, message: Uint8Array): Promise; }