feat: Non-zero Default Fees (#9371)
<!-- < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < ☺ v ✰ Thanks for creating a PR! ✰ v Before smashing the submit button please review the checkboxes. v If a checkbox is n/a - please still include it but + a little note why ☺ > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > --> ## Description <!-- Add a description of the changes that this PR introduces and the files that are the most critical to review. --> closes: #9106 --- Before we can merge this PR, please make sure that all the following items have been checked off. If any of the checklist items are not applicable, please leave them but write a little note why. - [x] Targeted PR against correct branch (see [CONTRIBUTING.md](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] Linked to Github issue with discussion and accepted design OR link to spec that describes this work. - [ ] Code follows the [module structure standards](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules/structure.md). - [ ] Wrote unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] Updated relevant documentation (`docs/`) or specification (`x/<module>/spec/`) - [ ] Added relevant `godoc` [comments](https://blog.golang.org/godoc-documenting-go-code). - [ ] Added a relevant changelog entry to the `Unreleased` section in `CHANGELOG.md` - [ ] Re-reviewed `Files changed` in the Github PR explorer - [ ] Review `Codecov Report` in the comment section below once CI passes
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
||||
"github.com/cosmos/cosmos-sdk/telemetry"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -310,3 +311,12 @@ func GetConfig(v *viper.Viper) Config {
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// ValidateBasic returns an error if min-gas-prices field is empty in BaseConfig. Otherwise, it returns nil.
|
||||
func (c Config) ValidateBasic() error {
|
||||
if c.BaseConfig.MinGasPrices == "" {
|
||||
return sdkerrors.ErrAppConfig.Wrap("set min gas price in app.toml or flag or env variable")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
+5
-2
@@ -245,6 +245,11 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
|
||||
return err
|
||||
}
|
||||
|
||||
config := config.GetConfig(ctx.Viper)
|
||||
if err := config.ValidateBasic(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
app := appCreator(ctx.Logger, db, traceWriter, ctx.Viper)
|
||||
|
||||
nodeKey, err := p2p.LoadOrGenNodeKey(cfg.NodeKeyFile())
|
||||
@@ -273,8 +278,6 @@ func startInProcess(ctx *Context, clientCtx client.Context, appCreator types.App
|
||||
}
|
||||
ctx.Logger.Debug("initialization: tmNode started")
|
||||
|
||||
config := config.GetConfig(ctx.Viper)
|
||||
|
||||
// Add the tx service to the gRPC router. We only need to register this
|
||||
// service if API or gRPC is enabled, and avoid doing so in the general
|
||||
// case, because it spawns a new local tendermint RPC client.
|
||||
|
||||
+78
-40
@@ -1,4 +1,4 @@
|
||||
package server
|
||||
package server_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -11,35 +11,42 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/cosmos/cosmos-sdk/client"
|
||||
"github.com/cosmos/cosmos-sdk/client/flags"
|
||||
"github.com/cosmos/cosmos-sdk/server"
|
||||
"github.com/cosmos/cosmos-sdk/server/config"
|
||||
"github.com/cosmos/cosmos-sdk/simapp"
|
||||
genutilcli "github.com/cosmos/cosmos-sdk/x/genutil/client/cli"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
var CancelledInPreRun = errors.New("Canelled in prerun")
|
||||
var cancelledInPreRun = errors.New("Cancelled in prerun")
|
||||
|
||||
// Used in each test to run the function under test via Cobra
|
||||
// but to always halt the command
|
||||
func preRunETestImpl(cmd *cobra.Command, args []string) error {
|
||||
err := InterceptConfigsPreRunHandler(cmd, "", nil)
|
||||
err := server.InterceptConfigsPreRunHandler(cmd, "", nil)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return CancelledInPreRun
|
||||
return cancelledInPreRun
|
||||
}
|
||||
|
||||
func TestInterceptConfigsPreRunHandlerCreatesConfigFilesWhenMissing(t *testing.T) {
|
||||
tempDir := t.TempDir()
|
||||
cmd := StartCmd(nil, "/foobar")
|
||||
cmd := server.StartCmd(nil, "/foobar")
|
||||
if err := cmd.Flags().Set(flags.FlagHome, tempDir); err != nil {
|
||||
t.Fatalf("Could not set home flag [%T] %v", err, err)
|
||||
}
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
if err := cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
if err := cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -106,17 +113,17 @@ func TestInterceptConfigsPreRunHandlerReadsConfigToml(t *testing.T) {
|
||||
t.Fatalf("Failed closing config.toml: %v", err)
|
||||
}
|
||||
|
||||
cmd := StartCmd(nil, "/foobar")
|
||||
cmd := server.StartCmd(nil, "/foobar")
|
||||
if err := cmd.Flags().Set(flags.FlagHome, tempDir); err != nil {
|
||||
t.Fatalf("Could not set home flag [%T] %v", err, err)
|
||||
}
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -146,14 +153,14 @@ func TestInterceptConfigsPreRunHandlerReadsAppToml(t *testing.T) {
|
||||
if err := writer.Close(); err != nil {
|
||||
t.Fatalf("Failed closing app.toml: %v", err)
|
||||
}
|
||||
cmd := StartCmd(nil, tempDir)
|
||||
cmd := server.StartCmd(nil, tempDir)
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -165,7 +172,7 @@ func TestInterceptConfigsPreRunHandlerReadsAppToml(t *testing.T) {
|
||||
func TestInterceptConfigsPreRunHandlerReadsFlags(t *testing.T) {
|
||||
const testAddr = "tcp://127.1.2.3:12345"
|
||||
tempDir := t.TempDir()
|
||||
cmd := StartCmd(nil, "/foobar")
|
||||
cmd := server.StartCmd(nil, "/foobar")
|
||||
|
||||
if err := cmd.Flags().Set(flags.FlagHome, tempDir); err != nil {
|
||||
t.Fatalf("Could not set home flag [%T] %v", err, err)
|
||||
@@ -178,10 +185,10 @@ func TestInterceptConfigsPreRunHandlerReadsFlags(t *testing.T) {
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -193,7 +200,7 @@ func TestInterceptConfigsPreRunHandlerReadsFlags(t *testing.T) {
|
||||
func TestInterceptConfigsPreRunHandlerReadsEnvVars(t *testing.T) {
|
||||
const testAddr = "tcp://127.1.2.3:12345"
|
||||
tempDir := t.TempDir()
|
||||
cmd := StartCmd(nil, "/foobar")
|
||||
cmd := server.StartCmd(nil, "/foobar")
|
||||
if err := cmd.Flags().Set(flags.FlagHome, tempDir); err != nil {
|
||||
t.Fatalf("Could not set home flag [%T] %v", err, err)
|
||||
}
|
||||
@@ -213,10 +220,10 @@ func TestInterceptConfigsPreRunHandlerReadsEnvVars(t *testing.T) {
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -279,7 +286,7 @@ func newPrecedenceCommon(t *testing.T) precedenceCommon {
|
||||
})
|
||||
|
||||
// Set up the command object that is used in this test
|
||||
retval.cmd = StartCmd(nil, tempDir)
|
||||
retval.cmd = server.StartCmd(nil, tempDir)
|
||||
retval.cmd.PreRunE = preRunETestImpl
|
||||
|
||||
return retval
|
||||
@@ -317,10 +324,10 @@ func TestInterceptConfigsPreRunHandlerPrecedenceFlag(t *testing.T) {
|
||||
testCommon := newPrecedenceCommon(t)
|
||||
testCommon.setAll(t, &TestAddrExpected, &TestAddrNotExpected, &TestAddrNotExpected)
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -333,10 +340,10 @@ func TestInterceptConfigsPreRunHandlerPrecedenceEnvVar(t *testing.T) {
|
||||
testCommon := newPrecedenceCommon(t)
|
||||
testCommon.setAll(t, nil, &TestAddrExpected, &TestAddrNotExpected)
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -349,10 +356,10 @@ func TestInterceptConfigsPreRunHandlerPrecedenceConfigFile(t *testing.T) {
|
||||
testCommon := newPrecedenceCommon(t)
|
||||
testCommon.setAll(t, nil, nil, &TestAddrExpected)
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -365,10 +372,10 @@ func TestInterceptConfigsPreRunHandlerPrecedenceConfigDefault(t *testing.T) {
|
||||
testCommon := newPrecedenceCommon(t)
|
||||
// Do not set anything
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != CancelledInPreRun {
|
||||
if err := testCommon.cmd.ExecuteContext(ctx); err != cancelledInPreRun {
|
||||
t.Fatalf("function failed with [%T] %v", err, err)
|
||||
}
|
||||
|
||||
@@ -386,16 +393,47 @@ func TestInterceptConfigsWithBadPermissions(t *testing.T) {
|
||||
if err := os.Mkdir(subDir, 0600); err != nil {
|
||||
t.Fatalf("Failed to create sub directory: %v", err)
|
||||
}
|
||||
cmd := StartCmd(nil, "/foobar")
|
||||
cmd := server.StartCmd(nil, "/foobar")
|
||||
if err := cmd.Flags().Set(flags.FlagHome, subDir); err != nil {
|
||||
t.Fatalf("Could not set home flag [%T] %v", err, err)
|
||||
}
|
||||
|
||||
cmd.PreRunE = preRunETestImpl
|
||||
|
||||
serverCtx := &Context{}
|
||||
ctx := context.WithValue(context.Background(), ServerContextKey, serverCtx)
|
||||
serverCtx := &server.Context{}
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
if err := cmd.ExecuteContext(ctx); !os.IsPermission(err) {
|
||||
t.Fatalf("Failed to catch permissions error, got: [%T] %v", err, err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEmptyMinGasPrices(t *testing.T) {
|
||||
tempDir := t.TempDir()
|
||||
err := os.Mkdir(filepath.Join(tempDir, "config"), os.ModePerm)
|
||||
require.NoError(t, err)
|
||||
encCfg := simapp.MakeTestEncodingConfig()
|
||||
|
||||
// Run InitCmd to create necessary config files.
|
||||
clientCtx := client.Context{}.WithHomeDir(tempDir).WithJSONCodec(encCfg.Marshaler)
|
||||
serverCtx := server.NewDefaultContext()
|
||||
ctx := context.WithValue(context.Background(), server.ServerContextKey, serverCtx)
|
||||
ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx)
|
||||
cmd := genutilcli.InitCmd(simapp.ModuleBasics, tempDir)
|
||||
cmd.SetArgs([]string{"appnode-test"})
|
||||
err = cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Modify app.toml.
|
||||
appCfgTempFilePath := filepath.Join(tempDir, "config", "app.toml")
|
||||
appConf := config.DefaultConfig()
|
||||
appConf.BaseConfig.MinGasPrices = ""
|
||||
config.WriteConfigFile(appCfgTempFilePath, appConf)
|
||||
|
||||
// Run StartCmd.
|
||||
cmd = server.StartCmd(nil, tempDir)
|
||||
cmd.PreRunE = func(cmd *cobra.Command, _ []string) error {
|
||||
return server.InterceptConfigsPreRunHandler(cmd, "", nil)
|
||||
}
|
||||
err = cmd.ExecuteContext(ctx)
|
||||
require.Errorf(t, err, sdkerrors.ErrAppConfig.Error())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user