From 7eb53ea17c2bc450a7ef875122e7dd3a8ebc948d Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Wed, 24 Mar 2021 10:11:35 +0100 Subject: [PATCH] Support explicit signer data in SigningStargateClient.sign --- .../signingstargateclient.multisig.spec.ts | 10 +++---- .../stargate/src/signingstargateclient.ts | 26 +++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/packages/stargate/src/signingstargateclient.multisig.spec.ts b/packages/stargate/src/signingstargateclient.multisig.spec.ts index 70b6d660..117ea680 100644 --- a/packages/stargate/src/signingstargateclient.multisig.spec.ts +++ b/packages/stargate/src/signingstargateclient.multisig.spec.ts @@ -127,19 +127,19 @@ describe("SigningStargateClient multisig", () => { const { bodyBytes, signatures: [signature0], - } = await client0.signAmino(faucet.address0, [msg], fee, memo, signerData); + } = await client0.sign(faucet.address0, [msg], fee, memo, signerData); const { signatures: [signature1], - } = await client1.signAmino(faucet.address1, [msg], fee, memo, signerData); + } = await client1.sign(faucet.address1, [msg], fee, memo, signerData); const { signatures: [signature2], - } = await client2.signAmino(faucet.address2, [msg], fee, memo, signerData); + } = await client2.sign(faucet.address2, [msg], fee, memo, signerData); const { signatures: [signature3], - } = await client3.signAmino(faucet.address3, [msg], fee, memo, signerData); + } = await client3.sign(faucet.address3, [msg], fee, memo, signerData); const { signatures: [signature4], - } = await client4.signAmino(faucet.address4, [msg], fee, memo, signerData); + } = await client4.sign(faucet.address4, [msg], fee, memo, signerData); const signatures = new Map([ [address0, signature0], diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index 1c66ba19..c505b1f9 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -190,27 +190,37 @@ export class SigningStargateClient extends StargateClient { * creates a single signature and assembles the signed transaction. * * The sign mode (SIGN_MODE_DIRECT or SIGN_MODE_LEGACY_AMINO_JSON) is determined by this client's signer. + * + * You can pass signer data (account number, sequence and chain ID) explicitly instead of querying them + * from the chain. This is needed when signing for a multisig account, but it also allows for offline signing + * (which probably fails right now because in other places SigningStargateClient assumes you are online). */ public async sign( signerAddress: string, messages: readonly EncodeObject[], fee: StdFee, memo: string, + explicitSignerData?: SignerData, ): Promise { - const accountFromChain = await this.getAccountUnverified(signerAddress); - if (!accountFromChain) { - throw new Error("Account not found"); + let signerData: SignerData; + if (explicitSignerData) { + signerData = explicitSignerData; + } else { + const accountFromChain = await this.getAccountUnverified(signerAddress); + if (!accountFromChain) { + throw new Error("Account not found"); + } + const { accountNumber, sequence } = accountFromChain; + const chainId = await this.getChainId(); + signerData = { accountNumber, sequence, chainId }; } - const { accountNumber, sequence } = accountFromChain; - const chainId = await this.getChainId(); - const signerData: SignerData = { accountNumber, sequence, chainId }; return isOfflineDirectSigner(this.signer) ? this.signDirect(signerAddress, messages, fee, memo, signerData) : this.signAmino(signerAddress, messages, fee, memo, signerData); } - public async signAmino( + private async signAmino( signerAddress: string, messages: readonly EncodeObject[], fee: StdFee, @@ -253,7 +263,7 @@ export class SigningStargateClient extends StargateClient { }); } - public async signDirect( + private async signDirect( signerAddress: string, messages: readonly EncodeObject[], fee: StdFee,