From cdaadd4ed09158558c810ea80760d40c08117979 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Wed, 5 May 2021 23:20:58 +0200 Subject: [PATCH 1/8] Fix hdPaths runtime error with proper defaultOptions and options merging --- packages/proto-signing/src/directsecp256k1hdwallet.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/proto-signing/src/directsecp256k1hdwallet.ts b/packages/proto-signing/src/directsecp256k1hdwallet.ts index e6c993ab..51d06ef5 100644 --- a/packages/proto-signing/src/directsecp256k1hdwallet.ts +++ b/packages/proto-signing/src/directsecp256k1hdwallet.ts @@ -91,7 +91,11 @@ export class DirectSecp256k1HdWallet implements OfflineDirectSigner { private readonly accounts: readonly Secp256k1Derivation[]; protected constructor(mnemonic: EnglishMnemonic, options: DirectSecp256k1HdWalletConstructorOptions) { - const { seed, hdPaths, prefix } = { ...defaultOptions, ...options }; + const { seed, hdPaths, prefix } = { + seed: options.seed, + prefix: options.prefix ?? defaultOptions.prefix, + hdPaths: options.hdPaths ?? defaultOptions.hdPaths, + }; this.secret = mnemonic; this.seed = seed; this.accounts = hdPaths.map((hdPath) => ({ From df01734ba29d243cf0cd9030428d6e79e6fd5386 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 00:12:44 +0200 Subject: [PATCH 2/8] Remove object destructuring for hdPaths, prefix and seed --- packages/proto-signing/src/directsecp256k1hdwallet.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/proto-signing/src/directsecp256k1hdwallet.ts b/packages/proto-signing/src/directsecp256k1hdwallet.ts index 51d06ef5..b1e23a82 100644 --- a/packages/proto-signing/src/directsecp256k1hdwallet.ts +++ b/packages/proto-signing/src/directsecp256k1hdwallet.ts @@ -91,13 +91,10 @@ export class DirectSecp256k1HdWallet implements OfflineDirectSigner { private readonly accounts: readonly Secp256k1Derivation[]; protected constructor(mnemonic: EnglishMnemonic, options: DirectSecp256k1HdWalletConstructorOptions) { - const { seed, hdPaths, prefix } = { - seed: options.seed, - prefix: options.prefix ?? defaultOptions.prefix, - hdPaths: options.hdPaths ?? defaultOptions.hdPaths, - }; + const prefix = options.prefix ?? defaultOptions.prefix; + const hdPaths = options.hdPaths ?? defaultOptions.hdPaths; this.secret = mnemonic; - this.seed = seed; + this.seed = options.seed; this.accounts = hdPaths.map((hdPath) => ({ hdPath: hdPath, prefix: prefix, From 71a1df7aa7c36bc67c0d620376088da924721464 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 00:23:53 +0200 Subject: [PATCH 3/8] Add test for explicitly undefined options --- .../src/directsecp256k1hdwallet.spec.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/proto-signing/src/directsecp256k1hdwallet.spec.ts b/packages/proto-signing/src/directsecp256k1hdwallet.spec.ts index fe580c00..537b9bc9 100644 --- a/packages/proto-signing/src/directsecp256k1hdwallet.spec.ts +++ b/packages/proto-signing/src/directsecp256k1hdwallet.spec.ts @@ -31,6 +31,18 @@ describe("DirectSecp256k1HdWallet", () => { expect(pubkey).not.toEqual(defaultPubkey); expect(address.slice(0, 4)).toEqual("yolo"); }); + + it("works with explicitly undefined options", async () => { + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(defaultMnemonic, { + bip39Password: undefined, + hdPaths: undefined, + prefix: undefined, + }); + expect(wallet.mnemonic).toEqual(defaultMnemonic); + const [{ pubkey, address }] = await wallet.getAccounts(); + expect(pubkey).toEqual(defaultPubkey); + expect(address).toEqual(defaultAddress); + }); }); describe("generate", () => { From 84ee1216016564fb916085d9a1e085f9d9ac1b18 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 12:37:21 +0200 Subject: [PATCH 4/8] Fix default options merging in LaunchpadLedger constructor --- packages/ledger-amino/src/launchpadledger.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/ledger-amino/src/launchpadledger.ts b/packages/ledger-amino/src/launchpadledger.ts index 01eb512a..35b4e88e 100644 --- a/packages/ledger-amino/src/launchpadledger.ts +++ b/packages/ledger-amino/src/launchpadledger.ts @@ -44,13 +44,10 @@ export class LaunchpadLedger { prefix: cosmosBech32Prefix, testModeAllowed: false, }; - const { hdPaths, prefix, testModeAllowed } = { - ...defaultOptions, - ...options, - }; - this.testModeAllowed = testModeAllowed; - this.hdPaths = hdPaths; - this.prefix = prefix; + + this.testModeAllowed = options.testModeAllowed ?? defaultOptions.testModeAllowed; + this.hdPaths = options.hdPaths ?? defaultOptions.hdPaths; + this.prefix = options.prefix ?? cosmosBech32Prefix; this.app = new CosmosApp(transport); } From 47220aa12fa98e0375b56968bb1f68a02597732a Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 12:42:52 +0200 Subject: [PATCH 5/8] Fix default options merging in Secp256k1HdWallet --- packages/amino/src/secp256k1hdwallet.spec.ts | 12 ++++++++++++ packages/amino/src/secp256k1hdwallet.ts | 7 ++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/amino/src/secp256k1hdwallet.spec.ts b/packages/amino/src/secp256k1hdwallet.spec.ts index 92aa78a9..c55085d1 100644 --- a/packages/amino/src/secp256k1hdwallet.spec.ts +++ b/packages/amino/src/secp256k1hdwallet.spec.ts @@ -33,6 +33,18 @@ describe("Secp256k1HdWallet", () => { expect(account.pubkey).not.toEqual(defaultPubkey); expect(account.address.slice(0, 4)).toEqual("yolo"); }); + + it("works with explicitly undefined options", async () => { + const wallet = await Secp256k1HdWallet.fromMnemonic(defaultMnemonic, { + bip39Password: undefined, + hdPaths: undefined, + prefix: undefined, + }); + expect(wallet.mnemonic).toEqual(defaultMnemonic); + const [account] = await wallet.getAccounts(); + expect(account.pubkey).toEqual(defaultPubkey); + expect(account.address).toEqual(defaultAddress); + }); }); describe("generate", () => { diff --git a/packages/amino/src/secp256k1hdwallet.ts b/packages/amino/src/secp256k1hdwallet.ts index 56a65f23..2c224e31 100644 --- a/packages/amino/src/secp256k1hdwallet.ts +++ b/packages/amino/src/secp256k1hdwallet.ts @@ -246,12 +246,13 @@ export class Secp256k1HdWallet implements OfflineAminoSigner { private readonly accounts: readonly DerivationInfo[]; protected constructor(mnemonic: EnglishMnemonic, options: Secp256k1HdWalletConstructorOptions) { - const { seed, hdPaths, prefix } = { ...defaultOptions, ...options }; + const hdPaths = options.hdPaths ?? defaultOptions.hdPaths; + const prefix = options.prefix ?? defaultOptions.prefix; this.secret = mnemonic; - this.seed = seed; + this.seed = options.seed; this.accounts = hdPaths.map((hdPath) => ({ hdPath: hdPath, - prefix: prefix, + prefix, })); } From 36d3fbbca64e9067d78c7d0d10efc7aa9f8943f1 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 12:45:31 +0200 Subject: [PATCH 6/8] Fix default options merging in helpers/connect --- packages/cli/examples/helpers.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/cli/examples/helpers.ts b/packages/cli/examples/helpers.ts index 8b229e7f..29652aad 100644 --- a/packages/cli/examples/helpers.ts +++ b/packages/cli/examples/helpers.ts @@ -30,7 +30,13 @@ const connect = async ( client: SigningCosmWasmClient; address: string; }> => { - const options: Options = { ...defaultOptions, ...opts }; + const options: Options = { + bech32prefix: opts.bech32prefix ?? defaultOptions.bech32prefix, + feeToken: opts.feeToken ?? defaultOptions.feeToken, + gasPrice: opts.gasPrice ?? defaultOptions.gasPrice, + httpUrl: opts.httpUrl ?? defaultOptions.httpUrl, + networkId: opts.networkId ?? defaultOptions.networkId, + }; const gasPrice = GasPrice.fromString(`${options.gasPrice}${options.feeToken}`); const wallet = await Secp256k1HdWallet.fromMnemonic(mnemonic); const [{ address }] = await wallet.getAccounts(); From 032565b79d023bc1c0344ae8df54839d595e4432 Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 13:22:40 +0200 Subject: [PATCH 7/8] Use prefix from defaultOptions object --- packages/ledger-amino/src/launchpadledger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ledger-amino/src/launchpadledger.ts b/packages/ledger-amino/src/launchpadledger.ts index 35b4e88e..0e58bd40 100644 --- a/packages/ledger-amino/src/launchpadledger.ts +++ b/packages/ledger-amino/src/launchpadledger.ts @@ -47,7 +47,7 @@ export class LaunchpadLedger { this.testModeAllowed = options.testModeAllowed ?? defaultOptions.testModeAllowed; this.hdPaths = options.hdPaths ?? defaultOptions.hdPaths; - this.prefix = options.prefix ?? cosmosBech32Prefix; + this.prefix = options.prefix ?? defaultOptions.prefix; this.app = new CosmosApp(transport); } From eb967e60fbfbb806a923bd51d25fa92fd401f11f Mon Sep 17 00:00:00 2001 From: bartmacbartek Date: Thu, 6 May 2021 13:38:24 +0200 Subject: [PATCH 8/8] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 875719fe..0536d683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,8 @@ and this project adheres to - @cosmjs/cosmwasm-stargate: Use `CosmWasmFeeTable` instead of `CosmosFeeTable` in `SigningCosmWasmClientOptions`; export type `CosmWasmFeeTable`. +- @cosmjs/amino, @cosmjs/cli, @cosmjs/ledger-amino, @cosmjs/proto-signing: Fix + runtime error caused by passing explicitly undefined options. ## [0.25.0] - 2021-05-05