diff --git a/.pending/bugfixes/sdk/3915-Remove-delimiting-support-from-ParseDecCoins b/.pending/bugfixes/sdk/3915-Remove-delimiting-support-from-ParseDecCoins new file mode 100644 index 0000000000..343d1a79e0 --- /dev/null +++ b/.pending/bugfixes/sdk/3915-Remove-delimiting-support-from-ParseDecCoins @@ -0,0 +1 @@ +#3915 Remove ';' delimiting support from ParseDecCoins diff --git a/server/config/config.go b/server/config/config.go index 6afde66f07..11ff534885 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -2,6 +2,7 @@ package config import ( "fmt" + "strings" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -14,7 +15,7 @@ const ( type BaseConfig struct { // The minimum gas prices a validator is willing to accept for processing a // transaction. A transaction's fees must meet the minimum of any denomination - // specified in this config (e.g. 0.01photino;0.0001stake). + // specified in this config (e.g. 0.25token1;0.0001token2). MinGasPrices string `mapstructure:"minimum-gas-prices"` } @@ -31,9 +32,20 @@ func (c *Config) SetMinGasPrices(gasPrices sdk.DecCoins) { // GetMinGasPrices returns the validator's minimum gas prices based on the set // configuration. func (c *Config) GetMinGasPrices() sdk.DecCoins { - gasPrices, err := sdk.ParseDecCoins(c.MinGasPrices) - if err != nil { - panic(fmt.Sprintf("invalid minimum gas prices: %v", err)) + if c.MinGasPrices == "" { + return sdk.DecCoins{} + } + + gasPricesStr := strings.Split(c.MinGasPrices, ";") + gasPrices := make(sdk.DecCoins, len(gasPricesStr)) + + for i, s := range gasPricesStr { + gasPrice, err := sdk.ParseDecCoin(s) + if err != nil { + panic(fmt.Errorf("failed to parse minimum gas price coin (%s): %s", s, err)) + } + + gasPrices[i] = gasPrice } return gasPrices diff --git a/server/config/toml.go b/server/config/toml.go index 1841393ab5..31e6ea9bcf 100644 --- a/server/config/toml.go +++ b/server/config/toml.go @@ -15,7 +15,7 @@ const defaultConfigTemplate = `# This is a TOML config file. # The minimum gas prices a validator is willing to accept for processing a # transaction. A transaction's fees must meet the minimum of any denomination -# specified in this config (e.g. 0.01photino;0.0001stake). +# specified in this config (e.g. 0.25token1;0.0001token2). minimum-gas-prices = "{{ .BaseConfig.MinGasPrices }}" ` diff --git a/types/coin.go b/types/coin.go index d2e76d750a..4c6ef53f7f 100644 --- a/types/coin.go +++ b/types/coin.go @@ -589,25 +589,27 @@ func ParseCoin(coinStr string) (coin Coin, err error) { // ParseCoins will parse out a list of coins separated by commas. // If nothing is provided, it returns nil Coins. // Returned coins are sorted. -func ParseCoins(coinsStr string) (coins Coins, err error) { +func ParseCoins(coinsStr string) (Coins, error) { coinsStr = strings.TrimSpace(coinsStr) if len(coinsStr) == 0 { return nil, nil } coinStrs := strings.Split(coinsStr, ",") - for _, coinStr := range coinStrs { + coins := make(Coins, len(coinStrs)) + for i, coinStr := range coinStrs { coin, err := ParseCoin(coinStr) if err != nil { return nil, err } - coins = append(coins, coin) + + coins[i] = coin } - // Sort coins for determinism. + // sort coins for determinism coins.Sort() - // Validate coins before returning. + // validate coins before returning if !coins.IsValid() { return nil, fmt.Errorf("parseCoins invalid: %#v", coins) } diff --git a/types/dec_coin.go b/types/dec_coin.go index 5986275f44..d9116c323e 100644 --- a/types/dec_coin.go +++ b/types/dec_coin.go @@ -2,7 +2,6 @@ package types import ( "fmt" - "regexp" "sort" "strings" @@ -545,21 +544,21 @@ func ParseDecCoin(coinStr string) (coin DecCoin, err error) { // ParseDecCoins will parse out a list of decimal coins separated by commas. // If nothing is provided, it returns nil DecCoins. Returned decimal coins are // sorted. -func ParseDecCoins(coinsStr string) (coins DecCoins, err error) { +func ParseDecCoins(coinsStr string) (DecCoins, error) { coinsStr = strings.TrimSpace(coinsStr) if len(coinsStr) == 0 { return nil, nil } - splitRe := regexp.MustCompile(",|;") - coinStrs := splitRe.Split(coinsStr, -1) - for _, coinStr := range coinStrs { + coinStrs := strings.Split(coinsStr, ",") + coins := make(DecCoins, len(coinStrs)) + for i, coinStr := range coinStrs { coin, err := ParseDecCoin(coinStr) if err != nil { return nil, err } - coins = append(coins, coin) + coins[i] = coin } // sort coins for determinism