Some checks failed
Build SimApp / build (amd64) (push) Waiting to run
Build SimApp / build (arm64) (push) Waiting to run
CodeQL / Analyze (push) Waiting to run
Build & Push / build (push) Waiting to run
Run Gosec / Gosec (push) Waiting to run
Lint / golangci-lint (push) Waiting to run
Checks dependencies and mocks generation / Check go mod tidy (push) Waiting to run
Checks dependencies and mocks generation / Check up to date mocks (push) Waiting to run
System Tests / setup (push) Waiting to run
System Tests / test-system (push) Blocked by required conditions
System Tests / test-system-legacy (push) Blocked by required conditions
Tests / Code Coverage / split-test-files (push) Waiting to run
Tests / Code Coverage / tests (00) (push) Blocked by required conditions
Tests / Code Coverage / tests (01) (push) Blocked by required conditions
Tests / Code Coverage / tests (02) (push) Blocked by required conditions
Tests / Code Coverage / tests (03) (push) Blocked by required conditions
Tests / Code Coverage / test-integration (push) Waiting to run
Tests / Code Coverage / test-e2e (push) Waiting to run
Tests / Code Coverage / repo-analysis (push) Blocked by required conditions
Tests / Code Coverage / test-sim-nondeterminism (push) Waiting to run
Tests / Code Coverage / test-clientv2 (push) Waiting to run
Tests / Code Coverage / test-core (push) Waiting to run
Tests / Code Coverage / test-depinject (push) Waiting to run
Tests / Code Coverage / test-errors (push) Waiting to run
Tests / Code Coverage / test-math (push) Waiting to run
Tests / Code Coverage / test-schema (push) Waiting to run
Tests / Code Coverage / test-collections (push) Waiting to run
Tests / Code Coverage / test-cosmovisor (push) Waiting to run
Tests / Code Coverage / test-confix (push) Waiting to run
Tests / Code Coverage / test-store (push) Waiting to run
Tests / Code Coverage / test-log (push) Waiting to run
Tests / Code Coverage / test-x-tx (push) Waiting to run
Tests / Code Coverage / test-x-nft (push) Waiting to run
Tests / Code Coverage / test-x-circuit (push) Waiting to run
Tests / Code Coverage / test-x-feegrant (push) Waiting to run
Tests / Code Coverage / test-x-evidence (push) Waiting to run
Tests / Code Coverage / test-x-upgrade (push) Waiting to run
Tests / Code Coverage / test-tools-benchmark (push) Waiting to run
Build & Push SDK Proto Builder / build (push) Has been cancelled
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package cli
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/cosmos/cosmos-sdk/client/flags"
|
|
"github.com/cosmos/cosmos-sdk/client/tx"
|
|
authclient "github.com/cosmos/cosmos-sdk/x/auth/client"
|
|
)
|
|
|
|
// GetSimulateCmd returns a command that simulates whether a transaction will be
|
|
// successful.
|
|
func GetSimulateCmd() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "simulate /path/to/unsigned-tx.json --from keyname",
|
|
Short: "Simulate the gas usage of a transaction",
|
|
Long: strings.TrimSpace(`Simulate whether a transaction will be successful:
|
|
|
|
- if successful, the simulation result is printed, which includes the gas
|
|
consumption, message response data, and events emitted;
|
|
- if unsuccessful, the error message is printed.
|
|
|
|
The user must provide the path to a JSON-encoded unsigned transaction, typically
|
|
generated by any transaction command with the --generate-only flag. It should
|
|
look like below. Note that the "signer_infos" and "signatures" fields are left
|
|
empty; they will be auto-populated by dummy data for simulation purpose.
|
|
|
|
{
|
|
"body": {
|
|
"messages": [
|
|
{
|
|
"@type": "/cosmos.bank.v1beta1.MsgSend",
|
|
"from_address": "cosmos1...",
|
|
"to_address": "cosmos1...",
|
|
"amount": [
|
|
{
|
|
"denom": "utoken",
|
|
"amount": "12345"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"memo": "",
|
|
"timeout_height": "0",
|
|
"extension_options": [],
|
|
"non_critical_extension_options": []
|
|
},
|
|
"auth_info": {
|
|
"signer_infos": [],
|
|
"fee": {
|
|
"amount": [],
|
|
"gas_limit": "200000",
|
|
"payer": "",
|
|
"granter": ""
|
|
},
|
|
"tip": null
|
|
},
|
|
"signatures": []
|
|
}
|
|
|
|
The --from flag is mandatory, as the signer account's correct sequence number is
|
|
necessary for simulation.
|
|
`),
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
clientCtx, err := client.GetClientTxContext(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
txf, err := tx.NewFactoryCLI(clientCtx, cmd.Flags())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
txf, err = txf.Prepare(clientCtx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
stdTx, err := authclient.ReadTxFromFile(clientCtx, args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
simRes, _, err := tx.CalculateGas(clientCtx, txf, stdTx.GetMsgs()...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return clientCtx.PrintProto(simRes)
|
|
},
|
|
}
|
|
|
|
flags.AddTxFlagsToCmd(cmd)
|
|
|
|
return cmd
|
|
}
|