From befb2400097f0abb5b7e587fb8ddf62efe1fd846 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Tue, 26 Jul 2022 06:47:06 +0100 Subject: [PATCH 01/10] add gas-related parameters to client config; pending tests --- client/config/cmd.go | 12 +++++ client/config/config.go | 44 +++++++++++++++++- client/config/toml.go | 6 +++ client/context.go | 21 +++++++++ client/flags/flags.go | 41 +---------------- client/gas.go | 49 +++++++++++++++++++++ client/{flags/flags_test.go => gas_test.go} | 15 ++++--- client/tx/factory.go | 29 +++++++++--- 8 files changed, 163 insertions(+), 54 deletions(-) create mode 100644 client/gas.go rename client/{flags/flags_test.go => gas_test.go} (53%) diff --git a/client/config/cmd.go b/client/config/cmd.go index 1da8afdaef8c..6f74d840ca4c 100644 --- a/client/config/cmd.go +++ b/client/config/cmd.go @@ -58,6 +58,12 @@ func runConfigCmd(cmd *cobra.Command, args []string) error { cmd.Println(conf.Node) case flags.FlagBroadcastMode: cmd.Println(conf.BroadcastMode) + case flags.FlagGas: + cmd.Println(conf.Gas) + case flags.FlagGasAdjustment: + cmd.Println(conf.GasAdjustment) + case flags.FlagGasPrices: + cmd.Println(conf.GasPrices) default: err := errUnknownConfigKey(key) return fmt.Errorf("couldn't get the value for the key: %v, error: %v", key, err) @@ -78,6 +84,12 @@ func runConfigCmd(cmd *cobra.Command, args []string) error { conf.SetNode(value) case flags.FlagBroadcastMode: conf.SetBroadcastMode(value) + case flags.FlagGas: + conf.SetGas(value) + case flags.FlagGasAdjustment: + conf.SetGasAdjustment(value) + case flags.FlagGasPrices: + conf.SetGasPrices(value) default: return errUnknownConfigKey(key) } diff --git a/client/config/config.go b/client/config/config.go index f9e48c989d88..307aaeb982a6 100644 --- a/client/config/config.go +++ b/client/config/config.go @@ -4,8 +4,10 @@ import ( "fmt" "os" "path/filepath" + "strconv" "github.com/cosmos/cosmos-sdk/client" + sdk "github.com/cosmos/cosmos-sdk/types" ) // Default constants @@ -15,6 +17,9 @@ const ( output = "text" node = "tcp://localhost:26657" broadcastMode = "sync" + gas = "200000" + gasAdjustment = "1" + gasPrices = "" ) type ClientConfig struct { @@ -23,11 +28,14 @@ type ClientConfig struct { Output string `mapstructure:"output" json:"output"` Node string `mapstructure:"node" json:"node"` BroadcastMode string `mapstructure:"broadcast-mode" json:"broadcast-mode"` + Gas string `mapstructure:"gas" json:"gas"` + GasAdjustment string `mapstructure:"gas-adjustment" json:"gas-adjustment"` + GasPrices string `mapstructure:"gas-prices" json:"gas-prices"` } // defaultClientConfig returns the reference to ClientConfig with default values. func defaultClientConfig() *ClientConfig { - return &ClientConfig{chainID, keyringBackend, output, node, broadcastMode} + return &ClientConfig{chainID, keyringBackend, output, node, broadcastMode, gas, gasAdjustment, gasPrices} } func (c *ClientConfig) SetChainID(chainID string) { @@ -50,6 +58,18 @@ func (c *ClientConfig) SetBroadcastMode(broadcastMode string) { c.BroadcastMode = broadcastMode } +func (c *ClientConfig) SetGas(gas string) { + c.Gas = gas +} + +func (c *ClientConfig) SetGasAdjustment(gasAdj string) { + c.GasAdjustment = gasAdj +} + +func (c *ClientConfig) SetGasPrices(gasPrices string) { + c.GasPrices = gasPrices +} + // ReadFromClientConfig reads values from client.toml file and updates them in client Context func ReadFromClientConfig(ctx client.Context) (client.Context, error) { configPath := filepath.Join(ctx.HomeDir, "config") @@ -75,6 +95,28 @@ func ReadFromClientConfig(ctx client.Context) (client.Context, error) { if err != nil { return ctx, fmt.Errorf("couldn't get client config: %v", err) } + + gasSetting, err := client.ParseGasSetting(conf.Gas) + if err != nil { + return ctx, fmt.Errorf("couldn't get gas setting from client config: %v", err) + } + + ctx = ctx.WithGasSetting(gasSetting) + + gasAdj, err := strconv.ParseFloat(conf.GasAdjustment, 64) + if err != nil { + return ctx, fmt.Errorf("couldn't get gas adjustment from client config: %v", err) + } + + ctx = ctx.WithGasAdjustment(gasAdj) + + gasPrices, err := sdk.ParseDecCoins(conf.GasPrices) + if err != nil { + return ctx, fmt.Errorf("couldn't get gas prices from client config: %v", err) + } + + ctx = ctx.WithGasPrices(gasPrices) + // we need to update KeyringDir field on Client Context first cause it is used in NewKeyringFromBackend ctx = ctx.WithOutputFormat(conf.Output). WithChainID(conf.ChainID). diff --git a/client/config/toml.go b/client/config/toml.go index 97c8b00b42c5..0c69426dce90 100644 --- a/client/config/toml.go +++ b/client/config/toml.go @@ -25,6 +25,12 @@ output = "{{ .Output }}" node = "{{ .Node }}" # Transaction broadcasting mode (sync|async|block) broadcast-mode = "{{ .BroadcastMode }}" +# Gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically +gas = "{{ .Gas }}" +# Adjustment factor to be multiplied against the estimate returned by the tx simulation +gas-adjustment = "{{ .GasAdjustment }}" +# Gas prices in decimal format to determine the transaction fee +gas-prices = "{{ .GasPrices }}" ` // writeConfigToFile parses defaultConfigTemplate, renders config using the template and writes it to diff --git a/client/context.go b/client/context.go index be5c84af6070..a1abbc808c03 100644 --- a/client/context.go +++ b/client/context.go @@ -54,6 +54,9 @@ type Context struct { FeePayer sdk.AccAddress FeeGranter sdk.AccAddress Viper *viper.Viper + GasSetting GasSetting + GasAdjustment float64 + GasPrices sdk.DecCoins // IsAux is true when the signer is an auxiliary signer (e.g. the tipper). IsAux bool @@ -260,6 +263,24 @@ func (ctx Context) WithViper(prefix string) Context { return ctx } +// WithInterfaceRegistry returns the context with an updated Gas +func (ctx Context) WithGasSetting(gasSetting GasSetting) Context { + ctx.GasSetting = gasSetting + return ctx +} + +// WithInterfaceRegistry returns the context with an updated GasAdjustment +func (ctx Context) WithGasAdjustment(gasAdj float64) Context { + ctx.GasAdjustment = gasAdj + return ctx +} + +// WithInterfaceRegistry returns the context with an updated GasPrices +func (ctx Context) WithGasPrices(gasPrices sdk.DecCoins) Context { + ctx.GasPrices = gasPrices + return ctx +} + // WithAux returns a copy of the context with an updated IsAux value. func (ctx Context) WithAux(isAux bool) Context { ctx.IsAux = isAux diff --git a/client/flags/flags.go b/client/flags/flags.go index 12bd7fd24cf4..ff5007dca063 100644 --- a/client/flags/flags.go +++ b/client/flags/flags.go @@ -2,7 +2,6 @@ package flags import ( "fmt" - "strconv" "github.com/spf13/cobra" tmcli "github.com/tendermint/tendermint/libs/cli" @@ -112,7 +111,7 @@ func AddTxFlagsToCmd(cmd *cobra.Command) { cmd.Flags().String(FlagGasPrices, "", "Gas prices in decimal format to determine the transaction fee (e.g. 0.1uatom)") cmd.Flags().String(FlagNode, "tcp://localhost:26657", ": to tendermint rpc interface for this chain") cmd.Flags().Bool(FlagUseLedger, false, "Use a connected Ledger device") - cmd.Flags().Float64(FlagGasAdjustment, DefaultGasAdjustment, "adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored ") + cmd.Flags().Float64(FlagGasAdjustment, 0, "adjustment factor to be multiplied against the estimate returned by the tx simulation; if the gas limit is set manually this flag is ignored ") cmd.Flags().StringP(FlagBroadcastMode, "b", BroadcastSync, "Transaction broadcasting mode (sync|async|block)") cmd.Flags().Bool(FlagDryRun, false, "ignore the --gas flag and perform a simulation of a transaction, but don't broadcast it (when enabled, the local Keybase is not accessible)") cmd.Flags().Bool(FlagGenerateOnly, false, "Build an unsigned transaction and write it to STDOUT (when enabled, the local Keybase only accessed when providing a key name)") @@ -127,7 +126,7 @@ func AddTxFlagsToCmd(cmd *cobra.Command) { cmd.Flags().Bool(FlagAux, false, "Generate aux signer data instead of sending a tx") // --gas can accept integers and "auto" - cmd.Flags().String(FlagGas, "", fmt.Sprintf("gas limit to set per-transaction; set to %q to calculate sufficient gas automatically (default %d)", GasFlagAuto, DefaultGasLimit)) + cmd.Flags().String(FlagGas, "", fmt.Sprintf("gas limit to set per-transaction; set to %q to calculate sufficient gas automatically", GasFlagAuto)) } // AddPaginationFlagsToCmd adds common pagination flags to cmd @@ -139,39 +138,3 @@ func AddPaginationFlagsToCmd(cmd *cobra.Command, query string) { cmd.Flags().Bool(FlagCountTotal, false, fmt.Sprintf("count total number of records in %s to query for", query)) cmd.Flags().Bool(FlagReverse, false, "results are sorted in descending order") } - -// GasSetting encapsulates the possible values passed through the --gas flag. -type GasSetting struct { - Simulate bool - Gas uint64 -} - -func (v *GasSetting) String() string { - if v.Simulate { - return GasFlagAuto - } - - return strconv.FormatUint(v.Gas, 10) -} - -// ParseGasSetting parses a string gas value. The value may either be 'auto', -// which indicates a transaction should be executed in simulate mode to -// automatically find a sufficient gas value, or a string integer. It returns an -// error if a string integer is provided which cannot be parsed. -func ParseGasSetting(gasStr string) (GasSetting, error) { - switch gasStr { - case "": - return GasSetting{false, DefaultGasLimit}, nil - - case GasFlagAuto: - return GasSetting{true, 0}, nil - - default: - gas, err := strconv.ParseUint(gasStr, 10, 64) - if err != nil { - return GasSetting{}, fmt.Errorf("gas must be either integer or %s", GasFlagAuto) - } - - return GasSetting{false, gas}, nil - } -} diff --git a/client/gas.go b/client/gas.go new file mode 100644 index 000000000000..a07e485a43d3 --- /dev/null +++ b/client/gas.go @@ -0,0 +1,49 @@ +package client + +import ( + "fmt" + "strconv" + + "github.com/cosmos/cosmos-sdk/client/flags" +) + +// GasSetting encapsulates the possible values passed through the --gas flag. +type GasSetting struct { + Simulate bool + Gas uint64 +} + +func (v *GasSetting) String() string { + if v.Simulate { + return flags.GasFlagAuto + } + + return strconv.FormatUint(v.Gas, 10) +} + +// DefaultGasSetting returns the default gas setting +func DefaultGasSetting() GasSetting { + return GasSetting{false, flags.DefaultGasLimit} +} + +// ParseGasSetting parses a string gas value. The value may either be 'auto', +// which indicates a transaction should be executed in simulate mode to +// automatically find a sufficient gas value, or a string integer. It returns an +// error if a string integer is provided which cannot be parsed. +func ParseGasSetting(gasStr string) (GasSetting, error) { + switch gasStr { + case "": + return DefaultGasSetting(), nil + + case flags.GasFlagAuto: + return GasSetting{true, 0}, nil + + default: + gas, err := strconv.ParseUint(gasStr, 10, 64) + if err != nil { + return GasSetting{}, fmt.Errorf("gas must be either integer or %s", flags.GasFlagAuto) + } + + return GasSetting{false, gas}, nil + } +} diff --git a/client/flags/flags_test.go b/client/gas_test.go similarity index 53% rename from client/flags/flags_test.go rename to client/gas_test.go index 5cc591bebbe7..db350729b5d5 100644 --- a/client/flags/flags_test.go +++ b/client/gas_test.go @@ -1,10 +1,11 @@ -package flags_test +package client_test import ( "testing" "github.com/stretchr/testify/require" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" ) @@ -12,20 +13,20 @@ func TestParseGasSetting(t *testing.T) { testCases := []struct { name string input string - expected flags.GasSetting + expected client.GasSetting expectErr bool }{ - {"empty input", "", flags.GasSetting{false, flags.DefaultGasLimit}, false}, - {"auto", flags.GasFlagAuto, flags.GasSetting{true, 0}, false}, - {"valid custom gas", "73800", flags.GasSetting{false, 73800}, false}, - {"invalid custom gas", "-73800", flags.GasSetting{false, 0}, true}, + {"empty input", "", client.DefaultGasSetting(), false}, + {"auto", flags.GasFlagAuto, client.GasSetting{true, 0}, false}, + {"valid custom gas", "73800", client.GasSetting{false, 73800}, false}, + {"invalid custom gas", "-73800", client.GasSetting{false, 0}, true}, } for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { - gs, err := flags.ParseGasSetting(tc.input) + gs, err := client.ParseGasSetting(tc.input) if tc.expectErr { require.Error(t, err) diff --git a/client/tx/factory.go b/client/tx/factory.go index 47ad7febb08d..9ad083fcf014 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -57,15 +57,32 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { signMode = signing.SignMode_SIGN_MODE_EIP_191 } + gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment) + if err != nil { + gasAdj = clientCtx.GasAdjustment + } + + var gasSetting client.GasSetting + gasStr, err := flagSet.GetString(flags.FlagGas) + if err != nil { + gasSetting = clientCtx.GasSetting + } else { + gasSetting, _ = client.ParseGasSetting(gasStr) + } + + var gasPrices sdk.DecCoins + gasPricesStr, _ := flagSet.GetString(flags.FlagGasPrices) + if err != nil { + gasPrices = clientCtx.GasPrices + } else { + gasPrices, _ = sdk.ParseDecCoins(gasPricesStr) + } + accNum, _ := flagSet.GetUint64(flags.FlagAccountNumber) accSeq, _ := flagSet.GetUint64(flags.FlagSequence) - gasAdj, _ := flagSet.GetFloat64(flags.FlagGasAdjustment) memo, _ := flagSet.GetString(flags.FlagNote) timeoutHeight, _ := flagSet.GetUint64(flags.FlagTimeoutHeight) - gasStr, _ := flagSet.GetString(flags.FlagGas) - gasSetting, _ := flags.ParseGasSetting(gasStr) - f := Factory{ txConfig: clientCtx.TxConfig, accountRetriever: clientCtx.AccountRetriever, @@ -83,6 +100,7 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { signMode: signMode, feeGranter: clientCtx.FeeGranter, feePayer: clientCtx.FeePayer, + gasPrices: gasPrices, } feesStr, _ := flagSet.GetString(flags.FlagFees) @@ -93,9 +111,6 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { // the from address. f = f.WithTips(tipsStr, clientCtx.FromAddress.String()) - gasPricesStr, _ := flagSet.GetString(flags.FlagGasPrices) - f = f.WithGasPrices(gasPricesStr) - return f } From c08b5947869be77558b0e881ed406d6e511b7b26 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Thu, 28 Jul 2022 12:14:48 +0100 Subject: [PATCH 02/10] print warnings if gas parameters are not specified by CLI --- client/tx/factory.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/client/tx/factory.go b/client/tx/factory.go index 9ad083fcf014..e76efde688b0 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -57,22 +57,25 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { signMode = signing.SignMode_SIGN_MODE_EIP_191 } - gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment) - if err != nil { - gasAdj = clientCtx.GasAdjustment - } - var gasSetting client.GasSetting gasStr, err := flagSet.GetString(flags.FlagGas) if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "gas setting is not specified! using default value from client config: %s\n", clientCtx.GasSetting.String()) gasSetting = clientCtx.GasSetting } else { gasSetting, _ = client.ParseGasSetting(gasStr) } + gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment) + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "gas adjustment is not specified! using default value from client config: %f\n", clientCtx.GasAdjustment) + gasAdj = clientCtx.GasAdjustment + } + var gasPrices sdk.DecCoins gasPricesStr, _ := flagSet.GetString(flags.FlagGasPrices) if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "gas prices is not specified! using default value from client config: %s\n", clientCtx.GasPrices.String()) gasPrices = clientCtx.GasPrices } else { gasPrices, _ = sdk.ParseDecCoins(gasPricesStr) From 53accfb9154cf4c17ab1ce6d3fd2ce95341fe7f5 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Thu, 28 Jul 2022 13:22:40 +0100 Subject: [PATCH 03/10] update rosetta test data --- contrib/rosetta/rosetta-ci/data.tar.gz | Bin 46427 -> 46889 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contrib/rosetta/rosetta-ci/data.tar.gz b/contrib/rosetta/rosetta-ci/data.tar.gz index 07bf564364bbf8cba1b174f1da13039a269dbf62..79ea48be3b8896938b736e0f30903bcb3d02e41c 100644 GIT binary patch literal 46889 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�Qf{;N!M+M&Z+8dT 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 BpI-m~ From 5c245bd3f1458dc0b098bcb37983046abf245ee2 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 29 Jul 2022 01:10:25 +0100 Subject: [PATCH 04/10] update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 940c70f6376f..3fd2b2ec9f0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -93,7 +93,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### CLI Breaking Changes -* / +* (client) [#12723](https://github.com/cosmos/cosmos-sdk/pull/12723) The client config now includes default values for several gas-related parameters, which previously needed to be provided by `--gas`, `--gas-adjustment`, and `--gas-prices` flags. + These default values can be configured with the `simd config` command or by editing `.simapp/config/client.toml`. + When submitting a tx, if any of these flags is not specified, the value in the client config will be used. ### Bug Fixes From 5566bb320dfefa558a69d683b1ef0138dfc17b60 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 29 Jul 2022 03:53:09 +0100 Subject: [PATCH 05/10] handle errors when parsing CLI input; add comments --- client/tx/factory.go | 122 +++++++++++++++++------------ core/appconfig/debug_container.dot | 3 + 2 files changed, 74 insertions(+), 51 deletions(-) create mode 100644 core/appconfig/debug_container.dot diff --git a/client/tx/factory.go b/client/tx/factory.go index e76efde688b0..0597f1e9b703 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -57,53 +57,56 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { signMode = signing.SignMode_SIGN_MODE_EIP_191 } - var gasSetting client.GasSetting - gasStr, err := flagSet.GetString(flags.FlagGas) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "gas setting is not specified! using default value from client config: %s\n", clientCtx.GasSetting.String()) - gasSetting = clientCtx.GasSetting - } else { - gasSetting, _ = client.ParseGasSetting(gasStr) - } + accNum, _ := flagSet.GetUint64(flags.FlagAccountNumber) + accSeq, _ := flagSet.GetUint64(flags.FlagSequence) + memo, _ := flagSet.GetString(flags.FlagNote) + timeoutHeight, _ := flagSet.GetUint64(flags.FlagTimeoutHeight) - gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "gas adjustment is not specified! using default value from client config: %f\n", clientCtx.GasAdjustment) - gasAdj = clientCtx.GasAdjustment + f := Factory{ + txConfig: clientCtx.TxConfig, + accountRetriever: clientCtx.AccountRetriever, + keybase: clientCtx.Keyring, + chainID: clientCtx.ChainID, + offline: clientCtx.Offline, + generateOnly: clientCtx.GenerateOnly, + accountNumber: accNum, + sequence: accSeq, + timeoutHeight: timeoutHeight, + memo: memo, + signMode: signMode, + feeGranter: clientCtx.FeeGranter, + feePayer: clientCtx.FeePayer, } - var gasPrices sdk.DecCoins - gasPricesStr, _ := flagSet.GetString(flags.FlagGasPrices) - if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "gas prices is not specified! using default value from client config: %s\n", clientCtx.GasPrices.String()) - gasPrices = clientCtx.GasPrices + // Add gas-related parameters to factory. These include: + // + // - gas + // - simulateAndExecute + // - gasAdjustment + // - gasPrices + // + // If specified by the CLI flags, parse the input, and panic on errors. + // + // If not, use values stored in client config as default, and print warning messages. + if gasStr, err := flagSet.GetString(flags.FlagGas); err == nil { + f = f.WithGasStr(gasStr) } else { - gasPrices, _ = sdk.ParseDecCoins(gasPricesStr) + f = f.WithGas(clientCtx.GasSetting.Gas).WithSimulateAndExecute(clientCtx.GasSetting.Simulate) + _, _ = fmt.Fprintf(os.Stderr, "gas setting is not specified! using default value from client config: %s\n", clientCtx.GasSetting.String()) } - accNum, _ := flagSet.GetUint64(flags.FlagAccountNumber) - accSeq, _ := flagSet.GetUint64(flags.FlagSequence) - memo, _ := flagSet.GetString(flags.FlagNote) - timeoutHeight, _ := flagSet.GetUint64(flags.FlagTimeoutHeight) + if gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment); err == nil { + f = f.WithGasAdjustment(gasAdj) + } else { + f = f.WithGasAdjustment(clientCtx.GasAdjustment) + _, _ = fmt.Fprintf(os.Stderr, "gas adjustment is not specified! using default value from client config: %f\n", clientCtx.GasAdjustment) + } - f := Factory{ - txConfig: clientCtx.TxConfig, - accountRetriever: clientCtx.AccountRetriever, - keybase: clientCtx.Keyring, - chainID: clientCtx.ChainID, - offline: clientCtx.Offline, - generateOnly: clientCtx.GenerateOnly, - gas: gasSetting.Gas, - simulateAndExecute: gasSetting.Simulate, - accountNumber: accNum, - sequence: accSeq, - timeoutHeight: timeoutHeight, - gasAdjustment: gasAdj, - memo: memo, - signMode: signMode, - feeGranter: clientCtx.FeeGranter, - feePayer: clientCtx.FeePayer, - gasPrices: gasPrices, + if gasPricesStr, err := flagSet.GetString(flags.FlagGasPrices); err == nil { + f = f.WithGasPricesStr(gasPricesStr) + } else { + f = f.WithGasPrices(clientCtx.GasPrices) + _, _ = fmt.Fprintf(os.Stderr, "gas prices is not specified! using default value from client config: %s\n", clientCtx.GasPrices.String()) } feesStr, _ := flagSet.GetString(flags.FlagFees) @@ -157,6 +160,34 @@ func (f Factory) WithGas(gas uint64) Factory { return f } +// WithGasStr returns a copy of the Factory with updated gas setting, given the +// stringified gas setting. +func (f Factory) WithGasStr(gasStr string) Factory { + gasSetting, err := client.ParseGasSetting(gasStr) + if err != nil { + panic(err) + } + + return f.WithGas(gasSetting.Gas).WithSimulateAndExecute(gasSetting.Simulate) +} + +// WithGasPrices returns a copy of the Factory with updated gas prices +func (f Factory) WithGasPrices(gasPrices sdk.DecCoins) Factory { + f.gasPrices = gasPrices + return f +} + +// WithGasPricesStr returns a copy of the Factory with updated gas prices, given the +// stringified gas prices. +func (f Factory) WithGasPricesStr(gasPricesStr string) Factory { + gasPrices, err := sdk.ParseDecCoins(gasPricesStr) + if err != nil { + panic(err) + } + + return f.WithGasPrices(gasPrices) +} + // WithFees returns a copy of the Factory with an updated fee. func (f Factory) WithFees(fees string) Factory { parsedFees, err := sdk.ParseCoinsNormalized(fees) @@ -182,17 +213,6 @@ func (f Factory) WithTips(tip string, tipper string) Factory { return f } -// WithGasPrices returns a copy of the Factory with updated gas prices. -func (f Factory) WithGasPrices(gasPrices string) Factory { - parsedGasPrices, err := sdk.ParseDecCoins(gasPrices) - if err != nil { - panic(err) - } - - f.gasPrices = parsedGasPrices - return f -} - // WithKeybase returns a copy of the Factory with updated Keybase. func (f Factory) WithKeybase(keybase keyring.Keyring) Factory { f.keybase = keybase diff --git a/core/appconfig/debug_container.dot b/core/appconfig/debug_container.dot new file mode 100644 index 000000000000..f246d9aba416 --- /dev/null +++ b/core/appconfig/debug_container.dot @@ -0,0 +1,3 @@ +digraph "" { +} + From 182587d8c9c1ac89dbebd5736337c894f2bb81d6 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 29 Jul 2022 04:01:18 +0100 Subject: [PATCH 06/10] Delete debug_container.dot --- core/appconfig/debug_container.dot | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 core/appconfig/debug_container.dot diff --git a/core/appconfig/debug_container.dot b/core/appconfig/debug_container.dot deleted file mode 100644 index f246d9aba416..000000000000 --- a/core/appconfig/debug_container.dot +++ /dev/null @@ -1,3 +0,0 @@ -digraph "" { -} - From 5f59f6e3e195f37be79bbcb7a3ad83e412a28814 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 29 Jul 2022 04:07:06 +0100 Subject: [PATCH 07/10] fix comments --- client/context.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/context.go b/client/context.go index a1abbc808c03..0feb03bcd3f2 100644 --- a/client/context.go +++ b/client/context.go @@ -263,19 +263,19 @@ func (ctx Context) WithViper(prefix string) Context { return ctx } -// WithInterfaceRegistry returns the context with an updated Gas +// WithGasSetting returns the context with an updated GasSetting func (ctx Context) WithGasSetting(gasSetting GasSetting) Context { ctx.GasSetting = gasSetting return ctx } -// WithInterfaceRegistry returns the context with an updated GasAdjustment +// WithGasAdjustment returns the context with an updated GasAdjustment func (ctx Context) WithGasAdjustment(gasAdj float64) Context { ctx.GasAdjustment = gasAdj return ctx } -// WithInterfaceRegistry returns the context with an updated GasPrices +// WithGasPrices returns the context with an updated GasPrices func (ctx Context) WithGasPrices(gasPrices sdk.DecCoins) Context { ctx.GasPrices = gasPrices return ctx From 7c099f81b93c27f2750da6dc6ea2cef094669b37 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Fri, 29 Jul 2022 12:38:48 +0100 Subject: [PATCH 08/10] update `UPGRADING.md` --- UPGRADING.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index 2af7041ee495..10c19109e4a3 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -8,8 +8,6 @@ This guide provides instructions for upgrading to specific versions of Cosmos SD Remove `Querier`, `Route` and `LegacyQuerier` from the app module interface. This removes and fully deprecates all legacy queriers. All modules no longer support the REST API previously known as the LCD, and the `sdk.Msg#Route` method won't be used anymore. - - ### SimApp SimApp's `app.go` is using App Wiring, the dependency injection framework of the Cosmos SDK. @@ -26,6 +24,21 @@ The constructor, `NewSimApp` has been simplified: `simapp.MakeTestEncodingConfig()` was deprecated and has been removed. Instead you can use the `TestEncodingConfig` from the `types/module/testutil` package. This means you can replace your usage of `simapp.MakeTestEncodingConfig` in tests to `moduletestutil.MakeTestEncodingConfig`, which takes a series of relevant `AppModuleBasic` as input (the module being tested and any potential dependencies). +### Client Configuration + +Several gas-related parameters have been added to the client config. Using SimApp as an example, the client config is recorded in the file `~/.simapp/config/client.toml`. If you have this file generated by a previous version of the Cosmos SDK, it is necessary to add the following lines: + +```toml +# Gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically +gas = "200000" +# Adjustment factor to be multiplied against the estimate returned by the tx simulation +gas-adjustment = "1" +# Gas prices in decimal format to determine the transaction fee +gas-prices = "" +``` + +This can be done either by re-running `simd init`, or by manually editing the file using a text editor. + ## [v0.46.x](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.0) ### Client Changes From eca07a7d75e18258f29083638a68229181e31d9c Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Sat, 30 Jul 2022 03:51:08 +0100 Subject: [PATCH 09/10] fix handling of CLI flags --- client/tx/factory.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/tx/factory.go b/client/tx/factory.go index 0597f1e9b703..5db3c8039969 100644 --- a/client/tx/factory.go +++ b/client/tx/factory.go @@ -88,21 +88,21 @@ func NewFactoryCLI(clientCtx client.Context, flagSet *pflag.FlagSet) Factory { // If specified by the CLI flags, parse the input, and panic on errors. // // If not, use values stored in client config as default, and print warning messages. - if gasStr, err := flagSet.GetString(flags.FlagGas); err == nil { + if gasStr, _ := flagSet.GetString(flags.FlagGas); gasStr != "" { f = f.WithGasStr(gasStr) } else { f = f.WithGas(clientCtx.GasSetting.Gas).WithSimulateAndExecute(clientCtx.GasSetting.Simulate) _, _ = fmt.Fprintf(os.Stderr, "gas setting is not specified! using default value from client config: %s\n", clientCtx.GasSetting.String()) } - if gasAdj, err := flagSet.GetFloat64(flags.FlagGasAdjustment); err == nil { + if gasAdj, _ := flagSet.GetFloat64(flags.FlagGasAdjustment); gasAdj != 0 { f = f.WithGasAdjustment(gasAdj) } else { f = f.WithGasAdjustment(clientCtx.GasAdjustment) _, _ = fmt.Fprintf(os.Stderr, "gas adjustment is not specified! using default value from client config: %f\n", clientCtx.GasAdjustment) } - if gasPricesStr, err := flagSet.GetString(flags.FlagGasPrices); err == nil { + if gasPricesStr, _ := flagSet.GetString(flags.FlagGasPrices); gasPricesStr != "" { f = f.WithGasPricesStr(gasPricesStr) } else { f = f.WithGasPrices(clientCtx.GasPrices) From 75faaf5cdead457b29077d2db046a9b139687519 Mon Sep 17 00:00:00 2001 From: larry <26318510+larry0x@users.noreply.github.com> Date: Sat, 30 Jul 2022 04:31:32 +0100 Subject: [PATCH 10/10] make the gas parameters in `client.toml` optional --- UPGRADING.md | 4 ++-- client/config/config.go | 6 +++--- client/gas.go | 15 +++++++++------ client/gas_test.go | 2 +- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/UPGRADING.md b/UPGRADING.md index 10c19109e4a3..fbec547a2785 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -26,7 +26,7 @@ This means you can replace your usage of `simapp.MakeTestEncodingConfig` in test ### Client Configuration -Several gas-related parameters have been added to the client config. Using SimApp as an example, the client config is recorded in the file `~/.simapp/config/client.toml`. If you have this file generated by a previous version of the Cosmos SDK, it is necessary to add the following lines: +Several gas-related parameters have been added to the client config. Using SimApp as an example, to utilize this feature, add the following lines to `~/.simapp/config/client.toml`: ```toml # Gas limit to set per-transaction; set to "auto" to calculate sufficient gas automatically @@ -37,7 +37,7 @@ gas-adjustment = "1" gas-prices = "" ``` -This can be done either by re-running `simd init`, or by manually editing the file using a text editor. +These parameters are optional. If not specified, default values (same as with previous Cosmos SDK versions) will be used. ## [v0.46.x](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.0) diff --git a/client/config/config.go b/client/config/config.go index 307aaeb982a6..080ebcef6936 100644 --- a/client/config/config.go +++ b/client/config/config.go @@ -98,21 +98,21 @@ func ReadFromClientConfig(ctx client.Context) (client.Context, error) { gasSetting, err := client.ParseGasSetting(conf.Gas) if err != nil { - return ctx, fmt.Errorf("couldn't get gas setting from client config: %v", err) + gasSetting = client.DefaultGasSetting } ctx = ctx.WithGasSetting(gasSetting) gasAdj, err := strconv.ParseFloat(conf.GasAdjustment, 64) if err != nil { - return ctx, fmt.Errorf("couldn't get gas adjustment from client config: %v", err) + gasAdj = client.DefaultGasAdjustment } ctx = ctx.WithGasAdjustment(gasAdj) gasPrices, err := sdk.ParseDecCoins(conf.GasPrices) if err != nil { - return ctx, fmt.Errorf("couldn't get gas prices from client config: %v", err) + gasPrices = client.DefaultGasPrices } ctx = ctx.WithGasPrices(gasPrices) diff --git a/client/gas.go b/client/gas.go index a07e485a43d3..a145e2e824cf 100644 --- a/client/gas.go +++ b/client/gas.go @@ -5,6 +5,14 @@ import ( "strconv" "github.com/cosmos/cosmos-sdk/client/flags" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// Default gas parameters +var ( + DefaultGasSetting = GasSetting{false, flags.DefaultGasLimit} + DefaultGasAdjustment float64 = 1 + DefaultGasPrices = sdk.NewDecCoins() ) // GasSetting encapsulates the possible values passed through the --gas flag. @@ -21,11 +29,6 @@ func (v *GasSetting) String() string { return strconv.FormatUint(v.Gas, 10) } -// DefaultGasSetting returns the default gas setting -func DefaultGasSetting() GasSetting { - return GasSetting{false, flags.DefaultGasLimit} -} - // ParseGasSetting parses a string gas value. The value may either be 'auto', // which indicates a transaction should be executed in simulate mode to // automatically find a sufficient gas value, or a string integer. It returns an @@ -33,7 +36,7 @@ func DefaultGasSetting() GasSetting { func ParseGasSetting(gasStr string) (GasSetting, error) { switch gasStr { case "": - return DefaultGasSetting(), nil + return DefaultGasSetting, nil case flags.GasFlagAuto: return GasSetting{true, 0}, nil diff --git a/client/gas_test.go b/client/gas_test.go index db350729b5d5..a4f582c9d281 100644 --- a/client/gas_test.go +++ b/client/gas_test.go @@ -16,7 +16,7 @@ func TestParseGasSetting(t *testing.T) { expected client.GasSetting expectErr bool }{ - {"empty input", "", client.DefaultGasSetting(), false}, + {"empty input", "", client.DefaultGasSetting, false}, {"auto", flags.GasFlagAuto, client.GasSetting{true, 0}, false}, {"valid custom gas", "73800", client.GasSetting{false, 73800}, false}, {"invalid custom gas", "-73800", client.GasSetting{false, 0}, true},