diff --git a/CHANGELOG.md b/CHANGELOG.md index 152e6db8f5..08c3c62ae2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,16 @@ and this project adheres to - @cosmjs/tendermint-rpc: Add missing `earliest_*` fields to `SyncInfo` record returned from the `/status` RPC endpoint ([#1448]). +### Changed + +- @cosmjs/stargate, @cosmjs/cosmwasm-stargate: Change default multiplier for gas + simulation from 1.3 to 1.4 to avoid out of case cases starting with Cosmos SDK + 0.47. +- @cosmjs/cosmwasm-stargate: Reduce default gas multiplier for + `SigningCosmWasmClient.upload` to 1.1. ([#1360]) + +[#1360]: https://github.com/cosmos/cosmjs/issues/1360 + ## [0.31.0] - 2023-06-22 ### Fixed diff --git a/packages/cli/examples/simulate.ts b/packages/cli/examples/simulate.ts index 2a5f3b74b7..255f44cd67 100644 --- a/packages/cli/examples/simulate.ts +++ b/packages/cli/examples/simulate.ts @@ -95,7 +95,7 @@ const client = await SigningStargateClient.connectWithSigner(rpcEndpoint, wallet }, }; const memo = "With simulate"; - const result = await client.signAndBroadcast(account.address, [sendMsg], 1.4, memo); + const result = await client.signAndBroadcast(account.address, [sendMsg], 1.55, memo); assertIsDeliverTxSuccess(result); console.log("Successfully broadcasted:", result); } diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index e21b66ed83..a5d8ca3772 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -297,7 +297,11 @@ export class SigningCosmWasmClient extends CosmWasmClient { }), }; - const result = await this.signAndBroadcast(senderAddress, [storeCodeMsg], fee, memo); + // When uploading a contract, the simulation is only 1-2% away from the actual gas usage. + // So we have a smaller default gas multiplier than signAndBroadcast. + const usedFee = fee == "auto" ? 1.1 : fee; + + const result = await this.signAndBroadcast(senderAddress, [storeCodeMsg], usedFee, memo); if (isDeliverTxFailure(result)) { throw new Error(createDeliverTxResponseErrorMessage(result)); } @@ -604,7 +608,9 @@ export class SigningCosmWasmClient extends CosmWasmClient { 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 multiplier = typeof fee === "number" ? fee : 1.3; + // Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore + // E.g. https://github.com/cosmos/cosmos-sdk/issues/16020 + const multiplier = typeof fee === "number" ? fee : 1.4; usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice); } else { usedFee = fee; diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index a255629c2c..a064d1649a 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -318,7 +318,9 @@ export class SigningStargateClient extends StargateClient { 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 multiplier = typeof fee === "number" ? fee : 1.3; + // Starting with Cosmos SDK 0.47, we see many cases in which 1.3 is not enough anymore + // E.g. https://github.com/cosmos/cosmos-sdk/issues/16020 + const multiplier = typeof fee === "number" ? fee : 1.4; usedFee = calculateFee(Math.round(gasEstimation * multiplier), this.gasPrice); } else { usedFee = fee;