From e3c764edddb2a9fe71678b19a36921200d9e5ca6 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Fri, 6 Sep 2024 15:19:12 +0200 Subject: [PATCH 1/8] feat: :sparkles: add explicitSignerData for simulation methods --- .../src/signingcosmwasmclient.spec.ts | 26 ++++++++++++++++++ .../src/signingcosmwasmclient.ts | 11 +++++++- .../src/signingstargateclient.spec.ts | 27 +++++++++++++++++++ .../stargate/src/signingstargateclient.ts | 11 +++++++- 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts index 90f6c7a3a0..ae5bbde101 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts @@ -102,6 +102,32 @@ describe("SigningCosmWasmClient", () => { expect(gasUsed).toBeLessThanOrEqual(140_000); client.disconnect(); }); + it("works with explicitSignerData", async () => { + pendingWithoutWasmd(); + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(alice.mnemonic, { prefix: wasmd.prefix }); + const client = await SigningCosmWasmClient.connectWithSigner( + wasmd.endpoint, + wallet, + defaultSigningClientOptions, + ); + + const executeContractMsg: MsgExecuteContractEncodeObject = { + typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + value: MsgExecuteContract.fromPartial({ + sender: alice.address0, + contract: deployedHackatom.instances[0].address, + msg: toUtf8(`{"release":{}}`), + funds: [], + }), + }; + const memo = "Go go go"; + const { sequence } = await client.getSequence(alice.address0) + + const gasUsed = await client.simulate(alice.address0, [executeContractMsg], memo, { sequence }); + expect(gasUsed).toBeGreaterThanOrEqual(70_000); + expect(gasUsed).toBeLessThanOrEqual(140_000); + client.disconnect(); + }); }); describe("upload", () => { diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index bce739bbf2..dfa192d183 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -274,6 +274,7 @@ export class SigningCosmWasmClient extends CosmWasmClient { signerAddress: string, messages: readonly EncodeObject[], memo: string | undefined, + explicitSignerData?: Partial, ): Promise { const anyMsgs = messages.map((m) => this.registry.encodeAsAny(m)); const accountFromSigner = (await this.signer.getAccounts()).find( @@ -283,7 +284,15 @@ export class SigningCosmWasmClient extends CosmWasmClient { throw new Error("Failed to retrieve account from signer"); } const pubkey = encodeSecp256k1Pubkey(accountFromSigner.pubkey); - const { sequence } = await this.getSequence(signerAddress); + + let sequence: number + + if (explicitSignerData?.sequence !== undefined) { + sequence = explicitSignerData.sequence; + } else { + sequence = (await this.getSequence(signerAddress)).sequence; + } + const { gasInfo } = await this.forceGetQueryClient().tx.simulate(anyMsgs, memo, pubkey, sequence); assertDefined(gasInfo); return Uint53.fromString(gasInfo.gasUsed.toString()).toNumber(); diff --git a/packages/stargate/src/signingstargateclient.spec.ts b/packages/stargate/src/signingstargateclient.spec.ts index e8d7f8aedd..c631192105 100644 --- a/packages/stargate/src/signingstargateclient.spec.ts +++ b/packages/stargate/src/signingstargateclient.spec.ts @@ -86,6 +86,33 @@ describe("SigningStargateClient", () => { expect(gasUsed).toBeGreaterThanOrEqual(101_000); expect(gasUsed).toBeLessThanOrEqual(200_000); + client.disconnect(); + }); + it("works with explicitSignerData", async () => { + pendingWithoutSimapp(); + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic); + const client = await SigningStargateClient.connectWithSigner( + simapp.tendermintUrlHttp, + wallet, + defaultSigningClientOptions, + ); + + const msg = MsgDelegate.fromPartial({ + delegatorAddress: faucet.address0, + validatorAddress: validator.validatorAddress, + amount: coin(1234, "ustake"), + }); + const msgAny: MsgDelegateEncodeObject = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: msg, + }; + const memo = "Use your power wisely"; + + const { sequence } = await client.getSequence(faucet.address0) + const gasUsed = await client.simulate(faucet.address0, [msgAny], memo, { sequence }); + expect(gasUsed).toBeGreaterThanOrEqual(101_000); + expect(gasUsed).toBeLessThanOrEqual(200_000); + client.disconnect(); }); }); diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index bb9e9715c2..8612f45e93 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -179,6 +179,7 @@ export class SigningStargateClient extends StargateClient { signerAddress: string, messages: readonly EncodeObject[], memo: string | undefined, + explicitSignerData?: Partial, ): Promise { const anyMsgs = messages.map((m) => this.registry.encodeAsAny(m)); const accountFromSigner = (await this.signer.getAccounts()).find( @@ -188,7 +189,15 @@ export class SigningStargateClient extends StargateClient { throw new Error("Failed to retrieve account from signer"); } const pubkey = encodeSecp256k1Pubkey(accountFromSigner.pubkey); - const { sequence } = await this.getSequence(signerAddress); + + let sequence: number + + if (explicitSignerData?.sequence !== undefined) { + sequence = explicitSignerData.sequence; + } else { + sequence = (await this.getSequence(signerAddress)).sequence; + } + const { gasInfo } = await this.forceGetQueryClient().tx.simulate(anyMsgs, memo, pubkey, sequence); assertDefined(gasInfo); return Uint53.fromString(gasInfo.gasUsed.toString()).toNumber(); From efd062d00a2cd662be7ae2d87f0830fa9eaded71 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Fri, 6 Sep 2024 15:51:10 +0200 Subject: [PATCH 2/8] feat: :sparkles: reduce network request for signAndBroadcast reduced the number of network request for signAndBroadcast, now fetch account info only once instead of two. --- .../src/signingcosmwasmclient.ts | 16 ++++++++++++++-- packages/stargate/src/signingstargateclient.ts | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index dfa192d183..9736cc53d0 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -623,15 +623,27 @@ export class SigningCosmWasmClient extends CosmWasmClient { timeoutHeight?: bigint, ): Promise { let usedFee: StdFee; + + const { accountNumber, sequence } = await this.getSequence(signerAddress); + if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); - const gasEstimation = await this.simulate(signerAddress, messages, memo); + const gasEstimation = await this.simulate(signerAddress, messages, memo, { sequence }); const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier; usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice); } else { usedFee = fee; } - const txRaw = await this.sign(signerAddress, messages, usedFee, memo, undefined, timeoutHeight); + + const chainId = await this.getChainId(); + + const signerData: SignerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + + const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); return this.broadcastTx(txBytes, this.broadcastTimeoutMs, this.broadcastPollIntervalMs); } diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index 8612f45e93..7bf42195a6 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -317,15 +317,27 @@ export class SigningStargateClient extends StargateClient { timeoutHeight?: bigint, ): Promise { let usedFee: StdFee; + + const { accountNumber, sequence } = await this.getSequence(signerAddress); + if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); - const gasEstimation = await this.simulate(signerAddress, messages, memo); + const gasEstimation = await this.simulate(signerAddress, messages, memo, { sequence }); const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier; usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice); } else { usedFee = fee; } - const txRaw = await this.sign(signerAddress, messages, usedFee, memo, undefined, timeoutHeight); + + const chainId = await this.getChainId(); + + const signerData: SignerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + + const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); return this.broadcastTx(txBytes, this.broadcastTimeoutMs, this.broadcastPollIntervalMs); } From a8e12106c4b2fa2dbb2e34332290388f1f864534 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Fri, 6 Sep 2024 16:09:04 +0200 Subject: [PATCH 3/8] feat: :sparkles: add param explicitSignerData to signAndBroadcast method --- .../src/signingcosmwasmclient.ts | 18 ++++++++++------- .../stargate/src/signingstargateclient.ts | 20 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index 9736cc53d0..f2e7416c44 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -621,10 +621,12 @@ export class SigningCosmWasmClient extends CosmWasmClient { fee: StdFee | "auto" | number, memo = "", timeoutHeight?: bigint, + explicitSignerData?: SignerData, ): Promise { let usedFee: StdFee; - const { accountNumber, sequence } = await this.getSequence(signerAddress); + let signerData: SignerData | undefined = explicitSignerData + const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); @@ -635,13 +637,15 @@ export class SigningCosmWasmClient extends CosmWasmClient { usedFee = fee; } - const chainId = await this.getChainId(); + if (!signerData) { + const chainId = await this.getChainId(); - const signerData: SignerData = { - accountNumber: accountNumber, - sequence: sequence, - chainId: chainId, - }; + signerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + } const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index 7bf42195a6..27e8964168 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -50,7 +50,7 @@ import { createStakingAminoConverters, createVestingAminoConverters, } from "./modules"; -import { DeliverTxResponse, StargateClient, StargateClientOptions } from "./stargateclient"; +import { DeliverTxResponse, SequenceResponse, StargateClient, StargateClientOptions } from "./stargateclient"; export const defaultRegistryTypes: ReadonlyArray<[string, GeneratedType]> = [ ["/cosmos.base.v1beta1.Coin", Coin], @@ -315,10 +315,12 @@ export class SigningStargateClient extends StargateClient { fee: StdFee | "auto" | number, memo = "", timeoutHeight?: bigint, + explicitSignerData?: SignerData, ): Promise { let usedFee: StdFee; - const { accountNumber, sequence } = await this.getSequence(signerAddress); + let signerData: SignerData | undefined = explicitSignerData + const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); @@ -329,13 +331,15 @@ export class SigningStargateClient extends StargateClient { usedFee = fee; } - const chainId = await this.getChainId(); + if (!signerData) { + const chainId = await this.getChainId(); - const signerData: SignerData = { - accountNumber: accountNumber, - sequence: sequence, - chainId: chainId, - }; + signerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + } const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); From febc36bbd341a39130d05abdd5f695a85f1b197f Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Fri, 6 Sep 2024 16:14:15 +0200 Subject: [PATCH 4/8] fix: :rotating_light: address CodeQL suggestions --- .../cosmwasm-stargate/src/signingcosmwasmclient.spec.ts | 2 +- packages/cosmwasm-stargate/src/signingcosmwasmclient.ts | 4 ++-- packages/stargate/src/signingstargateclient.spec.ts | 2 +- packages/stargate/src/signingstargateclient.ts | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts index ae5bbde101..9ad835db53 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.spec.ts @@ -121,7 +121,7 @@ describe("SigningCosmWasmClient", () => { }), }; const memo = "Go go go"; - const { sequence } = await client.getSequence(alice.address0) + const { sequence } = await client.getSequence(alice.address0); const gasUsed = await client.simulate(alice.address0, [executeContractMsg], memo, { sequence }); expect(gasUsed).toBeGreaterThanOrEqual(70_000); diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index f2e7416c44..de335e53da 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -285,7 +285,7 @@ export class SigningCosmWasmClient extends CosmWasmClient { } const pubkey = encodeSecp256k1Pubkey(accountFromSigner.pubkey); - let sequence: number + let sequence: number; if (explicitSignerData?.sequence !== undefined) { sequence = explicitSignerData.sequence; @@ -625,7 +625,7 @@ export class SigningCosmWasmClient extends CosmWasmClient { ): Promise { let usedFee: StdFee; - let signerData: SignerData | undefined = explicitSignerData + let signerData: SignerData | undefined = explicitSignerData; const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); if (fee == "auto" || typeof fee === "number") { diff --git a/packages/stargate/src/signingstargateclient.spec.ts b/packages/stargate/src/signingstargateclient.spec.ts index c631192105..4760b7ee5e 100644 --- a/packages/stargate/src/signingstargateclient.spec.ts +++ b/packages/stargate/src/signingstargateclient.spec.ts @@ -108,7 +108,7 @@ describe("SigningStargateClient", () => { }; const memo = "Use your power wisely"; - const { sequence } = await client.getSequence(faucet.address0) + const { sequence } = await client.getSequence(faucet.address0); const gasUsed = await client.simulate(faucet.address0, [msgAny], memo, { sequence }); expect(gasUsed).toBeGreaterThanOrEqual(101_000); expect(gasUsed).toBeLessThanOrEqual(200_000); diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index 27e8964168..f8915189da 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -50,7 +50,7 @@ import { createStakingAminoConverters, createVestingAminoConverters, } from "./modules"; -import { DeliverTxResponse, SequenceResponse, StargateClient, StargateClientOptions } from "./stargateclient"; +import { DeliverTxResponse, StargateClient, StargateClientOptions } from "./stargateclient"; export const defaultRegistryTypes: ReadonlyArray<[string, GeneratedType]> = [ ["/cosmos.base.v1beta1.Coin", Coin], @@ -190,7 +190,7 @@ export class SigningStargateClient extends StargateClient { } const pubkey = encodeSecp256k1Pubkey(accountFromSigner.pubkey); - let sequence: number + let sequence: number; if (explicitSignerData?.sequence !== undefined) { sequence = explicitSignerData.sequence; @@ -319,7 +319,7 @@ export class SigningStargateClient extends StargateClient { ): Promise { let usedFee: StdFee; - let signerData: SignerData | undefined = explicitSignerData + let signerData: SignerData | undefined = explicitSignerData; const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); if (fee == "auto" || typeof fee === "number") { From 0825351c85f1165488d75ee3ee68440a4a7ae145 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Fri, 6 Sep 2024 16:24:12 +0200 Subject: [PATCH 5/8] fix: :rotating_light: fix linter errors --- packages/cosmwasm-stargate/src/signingcosmwasmclient.ts | 4 +++- packages/stargate/src/signingstargateclient.ts | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index de335e53da..6a1947c794 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -626,7 +626,9 @@ export class SigningCosmWasmClient extends CosmWasmClient { let usedFee: StdFee; let signerData: SignerData | undefined = explicitSignerData; - const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); + const { sequence, accountNumber } = explicitSignerData + ? explicitSignerData + : await this.getSequence(signerAddress); if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index f8915189da..c34a3defbc 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -320,8 +320,10 @@ export class SigningStargateClient extends StargateClient { let usedFee: StdFee; let signerData: SignerData | undefined = explicitSignerData; - const { sequence, accountNumber } = explicitSignerData ? explicitSignerData : await this.getSequence(signerAddress); - + const { sequence, accountNumber } = explicitSignerData + ? explicitSignerData + : await this.getSequence(signerAddress); + if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); const gasEstimation = await this.simulate(signerAddress, messages, memo, { sequence }); From 4e4a2659f5c928ef0fa32e9b47277aca57424c47 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Wed, 22 Jan 2025 19:55:40 +0100 Subject: [PATCH 6/8] feat: :sparkles: add explicitSignerData support for signAndBroadcastSync --- .../src/signingcosmwasmclient.ts | 20 ++++++++++++++++- .../stargate/src/signingstargateclient.ts | 22 +++++++++++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index 6a1947c794..e1c89408a3 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -675,8 +675,15 @@ export class SigningCosmWasmClient extends CosmWasmClient { fee: StdFee | "auto" | number, memo = "", timeoutHeight?: bigint, + explicitSignerData?: SignerData, ): Promise { let usedFee: StdFee; + + let signerData: SignerData | undefined = explicitSignerData; + const { sequence, accountNumber } = explicitSignerData + ? explicitSignerData + : await this.getSequence(signerAddress); + if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); const gasEstimation = await this.simulate(signerAddress, messages, memo); @@ -685,7 +692,18 @@ export class SigningCosmWasmClient extends CosmWasmClient { } else { usedFee = fee; } - const txRaw = await this.sign(signerAddress, messages, usedFee, memo, undefined, timeoutHeight); + + if (!signerData) { + const chainId = await this.getChainId(); + + signerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + } + + const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); return this.broadcastTxSync(txBytes); } diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index c34a3defbc..3fdc0974fe 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -360,17 +360,35 @@ export class SigningStargateClient extends StargateClient { fee: StdFee | "auto" | number, memo = "", timeoutHeight?: bigint, + explicitSignerData?: SignerData, ): Promise { let usedFee: StdFee; + + let signerData: SignerData | undefined = explicitSignerData; + const { sequence, accountNumber } = explicitSignerData + ? explicitSignerData + : await this.getSequence(signerAddress); + if (fee == "auto" || typeof fee === "number") { assertDefined(this.gasPrice, "Gas price must be set in the client options when auto gas is used."); - const gasEstimation = await this.simulate(signerAddress, messages, memo); + const gasEstimation = await this.simulate(signerAddress, messages, memo, { sequence }); const multiplier = typeof fee === "number" ? fee : this.defaultGasMultiplier; usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice); } else { usedFee = fee; } - const txRaw = await this.sign(signerAddress, messages, usedFee, memo, undefined, timeoutHeight); + + if (!signerData) { + const chainId = await this.getChainId(); + + signerData = { + accountNumber: accountNumber, + sequence: sequence, + chainId: chainId, + }; + } + + const txRaw = await this.sign(signerAddress, messages, usedFee, memo, signerData, timeoutHeight); const txBytes = TxRaw.encode(txRaw).finish(); return this.broadcastTxSync(txBytes); } From b9cd6c48ab4ad11ea3aefbe0b66b5a3957cb7f15 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Wed, 22 Jan 2025 20:01:14 +0100 Subject: [PATCH 7/8] test: :white_check_mark: add test for syncAndBroadcastSync with explicitSignerData --- .../src/signingstargateclient.spec.ts | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/stargate/src/signingstargateclient.spec.ts b/packages/stargate/src/signingstargateclient.spec.ts index 4760b7ee5e..211f92c55f 100644 --- a/packages/stargate/src/signingstargateclient.spec.ts +++ b/packages/stargate/src/signingstargateclient.spec.ts @@ -766,6 +766,43 @@ describe("SigningStargateClient", () => { await sleep(simapp.blockTime * 1.5); }); + it("works with explicitSignerData", async () => { + pendingWithoutSimapp(); + const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic); + const client = await SigningStargateClient.connectWithSigner( + simapp.tendermintUrlHttp, + wallet, + defaultSigningClientOptions, + ); + + const msgSend: MsgSend = { + fromAddress: faucet.address0, + toAddress: makeRandomAddress(), + amount: coins(1234, "ucosm"), + }; + + const msgAny: MsgSendEncodeObject = { + typeUrl: "/cosmos.bank.v1beta1.MsgSend", + value: msgSend, + }; + const fee = { + amount: coins(2000, "ucosm"), + gas: "222000", // 222k + }; + const memo = "Use your power wisely"; + const { sequence, accountNumber } = await client.getSequence(faucet.address0); + const explicitSignerData = { + chainId: simapp.chainId, + sequence, + accountNumber + } + const transactionHash = await client.signAndBroadcastSync(faucet.address0, [msgAny], fee, memo, undefined, explicitSignerData); + + expect(transactionHash).toMatch(/^[0-9A-F]{64}$/); + + await sleep(simapp.blockTime * 1.5); + }); + it("works with auto gas", async () => { pendingWithoutSimapp(); const wallet = await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic); From 14bb5eda786180c4511e84531eba38f90e7895a5 Mon Sep 17 00:00:00 2001 From: Davide Segullo Date: Wed, 22 Jan 2025 20:10:38 +0100 Subject: [PATCH 8/8] fix: :rotating_light: fix lint errors --- .../cosmwasm-stargate/src/signingcosmwasmclient.ts | 2 +- packages/stargate/src/signingstargateclient.spec.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index e1c89408a3..2f2eb32c58 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -692,7 +692,7 @@ export class SigningCosmWasmClient extends CosmWasmClient { } else { usedFee = fee; } - + if (!signerData) { const chainId = await this.getChainId(); diff --git a/packages/stargate/src/signingstargateclient.spec.ts b/packages/stargate/src/signingstargateclient.spec.ts index 211f92c55f..a6a7cd3215 100644 --- a/packages/stargate/src/signingstargateclient.spec.ts +++ b/packages/stargate/src/signingstargateclient.spec.ts @@ -794,9 +794,16 @@ describe("SigningStargateClient", () => { const explicitSignerData = { chainId: simapp.chainId, sequence, - accountNumber - } - const transactionHash = await client.signAndBroadcastSync(faucet.address0, [msgAny], fee, memo, undefined, explicitSignerData); + accountNumber, + }; + const transactionHash = await client.signAndBroadcastSync( + faucet.address0, + [msgAny], + fee, + memo, + undefined, + explicitSignerData, + ); expect(transactionHash).toMatch(/^[0-9A-F]{64}$/);