From b9a791c58976abc85a7bec1abed6293c5db58a6a Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Tue, 25 Apr 2023 15:26:28 +0200 Subject: [PATCH 01/34] add fee check logic to DeliverTx --- x/globalfee/ante/antetest/fee_test.go | 29 ++++++++++++++ x/globalfee/ante/fee.go | 58 ++++++++++++++++++--------- x/globalfee/ante/fee_utils.go | 2 +- 3 files changed, 68 insertions(+), 21 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index cf144b1f616..c8846829a30 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -1,6 +1,7 @@ package antetest import ( + "fmt" "testing" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -746,3 +747,31 @@ func (s *IntegrationTestSuite) TestContainsOnlyBypassMinFeeMsgs() { }) } } + +func (s *IntegrationTestSuite) TestGetTxFeeRequired() { + // testCases := []struct { + // // feeTx sdk.Tx + // globalFee sdk.Coins + // minGasPrices sdk.Coins + // }{} + s.txBuilder = s.clientCtx.TxConfig.NewTxBuilder() + priv1, _, addr1 := testdata.KeyTestPubAddr() + privs, accNums, accSeqs := []cryptotypes.PrivKey{priv1}, []uint64{0}, []uint64{0} + + globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} + minGasPriceEmpty := []sdk.DecCoin{} + mfd, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceEmpty, globalfeeParamsEmpty) + + // set fee decorator to ante handler + + s.Require().NoError(s.txBuilder.SetMsgs(testdata.NewTestMsg(addr1))) + s.txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt()))) + s.txBuilder.SetGasLimit(uint64(1)) + tx, err := s.CreateTestTx(privs, accNums, accSeqs, s.ctx.ChainID()) + s.Require().NoError(err) + + fmt.Println(s.ctx.IsCheckTx()) + fmt.Println(s.ctx.WithIsCheckTx(false)) + + mfd.GetTxFeeRequired(s.ctx, tx) +} diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 909fac4a765..fc6607827f8 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -57,8 +57,8 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return ctx, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "Tx must implement the sdk.FeeTx interface") } - // Only check for minimum fees and global fee if the execution mode is CheckTx - if !ctx.IsCheckTx() || simulate { + // Do not check minimum and global fees during simulations + if simulate { return next(ctx, tx, simulate) } @@ -67,35 +67,25 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne gas := feeTx.GetGas() msgs := feeTx.GetMsgs() - // Get required Global Fee - requiredGlobalFees, err := mfd.GetGlobalFee(ctx, feeTx) + // Get the required fees according the Check or Deliver Tx mode + feeRequired, err := mfd.GetTxFeeRequired(ctx, feeTx) if err != nil { return ctx, err } - // Get local minimum-gas-prices - localFees := GetMinGasPrice(ctx, int64(feeTx.GetGas())) - - // CombinedFeeRequirement should never be empty since - // global fee is set to its default value, i.e. 0uatom, if empty - combinedFeeRequirement := CombinedFeeRequirement(requiredGlobalFees, localFees) - if len(combinedFeeRequirement) == 0 { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "required fees are not setup.") - } - - nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(combinedFeeRequirement) + nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired) - // feeCoinsNonZeroDenom contains non-zero denominations from the combinedFeeRequirement + // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequirement // // feeCoinsNoZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq - // when feeCoins does not contain zero coins' denoms in combinedFeeRequirement + // when feeCoins does not contain zero coins' denoms in feeRequirement feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq) // Check that the fees are in expected denominations. // if feeCoinsNoZeroDenom=[], DenomsSubsetOf returns true // if feeCoinsNoZeroDenom is not empty, but nonZeroCoinFeesReq empty, return false if !feeCoinsNonZeroDenom.DenomsSubsetOf(nonZeroCoinFeesReq) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "fee is not a subset of required fees; got %s, required: %s", feeCoins, combinedFeeRequirement) + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "fee is not a subset of required fees; got %s, required: %s", feeCoins, feeRequired) } // Accept zero fee transactions only if both of the following statements are true: @@ -116,7 +106,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // the expected amounts. // only check feeCoinsNoZeroDenom has coins IsAnyGTE than nonZeroCoinFeesReq - // when feeCoins does not contain denoms of zero denoms in combinedFeeRequirement + // when feeCoins does not contain denoms of zero denoms in feeRequirement if !allowedToBypassMinFee && len(feeCoinsZeroDenom) == 0 { // special case: when feeCoins=[] and there is zero coin in fee requirement if len(feeCoins) == 0 && len(zeroCoinFeesDenomReq) != 0 { @@ -132,13 +122,41 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // because when nonZeroCoinFeesReq empty, and DenomsSubsetOf check passed, // the tx should already passed before) if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins, combinedFeeRequirement) + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins, feeRequired) } } return next(ctx, tx, simulate) } +// GetTxFeeRequired returns the required fees for the given FeeTx. +// In case the FeeTx's mode is CheckTx, it returns the combined requirements +// of local min gas prices and global fees. Otherwise, in DeliverTx, it returns the global fee. +func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coins, error) { + // Get required Global Fee + globalFees, err := mfd.GetGlobalFee(ctx, tx) + if err != nil { + return sdk.Coins{}, err + } + + if !ctx.IsCheckTx() { + return globalFees, nil + } + + // In CheckTx get local min gas price and combined it with global fee. + // Get local minimum-gas-prices + localFees := GetMinGasPrice(ctx, int64(tx.GetGas())) + + // feeRequirement should never be empty since + // global fee is set to its default value, i.e. 0uatom, if empty + feeReq := CombinedFeeRequirement(globalFees, localFees) + if len(feeReq) == 0 { + return sdk.Coins{}, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "required fees are not setup.") + } + + return feeReq, nil +} + // GetGlobalFee returns the global fees for a given fee tx's gas // (might also return 0denom if globalMinGasPrice is 0) // sorted in ascending order. diff --git a/x/globalfee/ante/fee_utils.go b/x/globalfee/ante/fee_utils.go index b3d5e2c8e80..fcafcb25ed0 100644 --- a/x/globalfee/ante/fee_utils.go +++ b/x/globalfee/ante/fee_utils.go @@ -29,7 +29,7 @@ func CombinedFeeRequirement(globalFees, minGasPrices sdk.Coins) sdk.Coins { return globalFees } // empty global fee is not possible if we set default global fee - if len(globalFees) == 0 && len(minGasPrices) != 0 { + if len(globalFees) == 0 { return sdk.Coins{} } From 7b98d13589af7c7a63e45b46f573dd79d3ab00a3 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 26 Apr 2023 11:22:48 +0200 Subject: [PATCH 02/34] add uts --- x/globalfee/ante/antetest/fee_test.go | 50 +++++++++++++++++++-------- x/globalfee/ante/fee.go | 9 +++-- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index c8846829a30..95c666ae74c 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -7,6 +7,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" ibcchanneltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" @@ -749,29 +750,50 @@ func (s *IntegrationTestSuite) TestContainsOnlyBypassMinFeeMsgs() { } func (s *IntegrationTestSuite) TestGetTxFeeRequired() { - // testCases := []struct { - // // feeTx sdk.Tx - // globalFee sdk.Coins - // minGasPrices sdk.Coins - // }{} + globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} + // minGasPriceEmpty := []sdk.DecCoin{} + minGasPriceNonZero := []sdk.DecCoin{ + sdk.NewDecCoinFromDec("uatom", sdk.NewDec(1)), + } + + // setup decorator + feeDecorator, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceNonZero, globalfeeParamsEmpty) + + // reset decorator staking subspace + feeDecorator.StakingSubspace = paramtypes.Subspace{} + + // check error is returned + _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) + s.Require().Equal(err.Error(), "empty staking bond denomination") + + // define test cases for CheckTx and DeliverTx + feeDecorator, _ = s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceNonZero, globalfeeParamsEmpty) + + // mock tx data s.txBuilder = s.clientCtx.TxConfig.NewTxBuilder() priv1, _, addr1 := testdata.KeyTestPubAddr() privs, accNums, accSeqs := []cryptotypes.PrivKey{priv1}, []uint64{0}, []uint64{0} - globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} - minGasPriceEmpty := []sdk.DecCoin{} - mfd, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceEmpty, globalfeeParamsEmpty) - - // set fee decorator to ante handler - s.Require().NoError(s.txBuilder.SetMsgs(testdata.NewTestMsg(addr1))) s.txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt()))) s.txBuilder.SetGasLimit(uint64(1)) tx, err := s.CreateTestTx(privs, accNums, accSeqs, s.ctx.ChainID()) s.Require().NoError(err) - fmt.Println(s.ctx.IsCheckTx()) - fmt.Println(s.ctx.WithIsCheckTx(false)) + res, err := feeDecorator.GetTxFeeRequired(s.ctx, tx) + + s.Require().True(res.IsEqual(sdk.NewCoins(sdk.NewCoin(minGasPriceNonZero[0].Denom, sdk.NewInt(1))))) + s.Require().NoError(err) + + globalFee, err := feeDecorator.GetGlobalFee(s.ctx, tx) + s.Require().NoError(err) + fmt.Println(globalFee.String()) + + ctx := s.ctx.WithIsCheckTx(false) + + res, err = feeDecorator.GetTxFeeRequired(ctx, tx) + s.Require().NoError(err) - mfd.GetTxFeeRequired(s.ctx, tx) + fmt.Println(res.String()) + s.Require().True(res.IsEqual(globalFee)) } diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index fc6607827f8..94f49dd814f 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -199,11 +199,14 @@ func (mfd FeeDecorator) DefaultZeroGlobalFee(ctx sdk.Context) ([]sdk.DecCoin, er } func (mfd FeeDecorator) getBondDenom(ctx sdk.Context) string { - var bondDenom string - if mfd.StakingSubspace.Has(ctx, stakingtypes.KeyBondDenom) { - mfd.StakingSubspace.Get(ctx, stakingtypes.KeyBondDenom, &bondDenom) + // prevent panic if staking subspace isn't set + if !mfd.StakingSubspace.HasKeyTable() { + return "" } + var bondDenom string + mfd.StakingSubspace.Get(ctx, stakingtypes.KeyBondDenom, &bondDenom) + return bondDenom } From 1a7d9a408b3e044f90a1162b92093ee07a498e88 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 26 Apr 2023 11:45:57 +0200 Subject: [PATCH 03/34] refactor combinedFee --- x/globalfee/ante/fee.go | 6 +++--- x/globalfee/ante/fee_utils.go | 17 ++++++++++------- x/globalfee/ante/fee_utils_test.go | 14 +++++++------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 94f49dd814f..badc639ed45 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -149,9 +149,9 @@ func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coi // feeRequirement should never be empty since // global fee is set to its default value, i.e. 0uatom, if empty - feeReq := CombinedFeeRequirement(globalFees, localFees) - if len(feeReq) == 0 { - return sdk.Coins{}, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "required fees are not setup.") + feeReq, err := CombinedFeeRequirement(globalFees, localFees) + if err != nil { + return sdk.Coins{}, err } return feeReq, nil diff --git a/x/globalfee/ante/fee_utils.go b/x/globalfee/ante/fee_utils.go index fcafcb25ed0..073a635ac63 100644 --- a/x/globalfee/ante/fee_utils.go +++ b/x/globalfee/ante/fee_utils.go @@ -2,6 +2,7 @@ package ante import ( sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // ContainZeroCoins returns true if the given coins are empty or contain zero coins, @@ -23,14 +24,16 @@ func ContainZeroCoins(coins sdk.Coins) bool { // Both globalFees and minGasPrices must be valid, but CombinedFeeRequirement // does not validate them, so it may return 0denom. // if globalfee is empty, CombinedFeeRequirement return sdk.Coins{} -func CombinedFeeRequirement(globalFees, minGasPrices sdk.Coins) sdk.Coins { +func CombinedFeeRequirement(globalFees, minGasPrices sdk.Coins) (sdk.Coins, error) { + // global fees should never be since it has a zero default value + // using the staking bond denom + if len(globalFees) == 0 { + return sdk.Coins{}, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "global fee cannot be empty") + } + // empty min_gas_price if len(minGasPrices) == 0 { - return globalFees - } - // empty global fee is not possible if we set default global fee - if len(globalFees) == 0 { - return sdk.Coins{} + return globalFees, nil } // if min_gas_price denom is in globalfee, and the amount is higher than globalfee, add min_gas_price to allFees @@ -45,7 +48,7 @@ func CombinedFeeRequirement(globalFees, minGasPrices sdk.Coins) sdk.Coins { } } - return allFees.Sort() + return allFees.Sort(), nil } // Find replaces the functionality of Coins.Find from SDK v0.46.x diff --git a/x/globalfee/ante/fee_utils_test.go b/x/globalfee/ante/fee_utils_test.go index 9a702c52e07..cebe119055a 100644 --- a/x/globalfee/ante/fee_utils_test.go +++ b/x/globalfee/ante/fee_utils_test.go @@ -81,16 +81,11 @@ func TestCombinedFeeRequirement(t *testing.T) { c sdk.Coins combined sdk.Coins }{ - "global fee empty, min fee empty, combined fee empty": { + "global fee invalid, return combined fee empty and non nil error": { cGlobal: coinsEmpty, c: coinsEmpty, combined: coinsEmpty, }, - "global fee empty, min fee nonempty, combined fee empty": { - cGlobal: coinsEmpty, - c: coinsNonEmpty, - combined: coinsEmpty, - }, "global fee nonempty, min fee empty, combined fee = global fee": { cGlobal: coinsNonEmpty, c: coinsNonEmpty, @@ -155,7 +150,12 @@ func TestCombinedFeeRequirement(t *testing.T) { for name, test := range tests { t.Run(name, func(t *testing.T) { - allFees := CombinedFeeRequirement(test.cGlobal, test.c) + allFees, err := CombinedFeeRequirement(test.cGlobal, test.c) + if len(test.cGlobal) == 0 { + require.Error(t, err) + } else { + require.NoError(t, err) + } require.Equal(t, test.combined, allFees) }) } From 35230df86782ab497a9d1616b7c456f85d53b8e0 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 26 Apr 2023 12:02:37 +0200 Subject: [PATCH 04/34] update ut test --- x/globalfee/ante/antetest/fee_test.go | 32 +++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 95c666ae74c..02f5d566f8a 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -1,7 +1,6 @@ package antetest import ( - "fmt" "testing" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" @@ -750,24 +749,27 @@ func (s *IntegrationTestSuite) TestContainsOnlyBypassMinFeeMsgs() { } func (s *IntegrationTestSuite) TestGetTxFeeRequired() { + // set up default gloabal fee i.e. "0utaom" globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} - // minGasPriceEmpty := []sdk.DecCoin{} - minGasPriceNonZero := []sdk.DecCoin{ - sdk.NewDecCoinFromDec("uatom", sdk.NewDec(1)), - } // setup decorator - feeDecorator, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceNonZero, globalfeeParamsEmpty) + feeDecorator, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice([]sdk.DecCoin{}, globalfeeParamsEmpty) // reset decorator staking subspace feeDecorator.StakingSubspace = paramtypes.Subspace{} - // check error is returned + // check an error is returned when staking subspace isn't set _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) s.Require().Equal(err.Error(), "empty staking bond denomination") - // define test cases for CheckTx and DeliverTx - feeDecorator, _ = s.SetupTestGlobalFeeStoreAndMinGasPrice(minGasPriceNonZero, globalfeeParamsEmpty) + // set non-zero local min gas price + localMinGasPrices := sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(1))) + + // setup decorator + feeDecorator, _ = s.SetupTestGlobalFeeStoreAndMinGasPrice( + sdk.NewDecCoinsFromCoins(localMinGasPrices...), + globalfeeParamsEmpty, + ) // mock tx data s.txBuilder = s.clientCtx.TxConfig.NewTxBuilder() @@ -776,24 +778,26 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { s.Require().NoError(s.txBuilder.SetMsgs(testdata.NewTestMsg(addr1))) s.txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt()))) + s.txBuilder.SetGasLimit(uint64(1)) tx, err := s.CreateTestTx(privs, accNums, accSeqs, s.ctx.ChainID()) s.Require().NoError(err) + // check that in CheckTx the combined fee is returned + // i.e. local min gas prices as it has higher amount of uatom than global fee + s.Require().True(s.ctx.IsCheckTx()) res, err := feeDecorator.GetTxFeeRequired(s.ctx, tx) - s.Require().True(res.IsEqual(sdk.NewCoins(sdk.NewCoin(minGasPriceNonZero[0].Denom, sdk.NewInt(1))))) + s.Require().True(res.IsEqual(localMinGasPrices)) s.Require().NoError(err) + // check that in DeliverTx the global fee is returned globalFee, err := feeDecorator.GetGlobalFee(s.ctx, tx) s.Require().NoError(err) - fmt.Println(globalFee.String()) ctx := s.ctx.WithIsCheckTx(false) - res, err = feeDecorator.GetTxFeeRequired(ctx, tx) s.Require().NoError(err) - - fmt.Println(res.String()) s.Require().True(res.IsEqual(globalFee)) + } From 42e1c557fd717f65fdefb85d7529e38fcac566c8 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 26 Apr 2023 12:13:03 +0200 Subject: [PATCH 05/34] update uts --- x/globalfee/ante/antetest/fee_test.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 02f5d566f8a..611fbcfbf33 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -575,23 +575,32 @@ func (s *IntegrationTestSuite) TestGlobalFeeMinimumGasFeeAnteHandler() { txCheck: true, expErr: true, }, - "disable checkTx: no fee check. min_gas_price is low, global fee is low, tx fee is zero": { + "disable checkTx: no fee check. min_gas_price is med, global fee is low, tx fee is low": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, - gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt())), + gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", lowFeeAmt)), gasLimit: testGasLimit, txMsg: testdata.NewTestMsg(addr1), txCheck: false, expErr: false, }, - "disable checkTx: no fee check. min_gas_price is low, global fee is low, tx fee's denom is not in global fees denoms set": { + "disable checkTx: no fee check. min_gas_price is med, global fee is low, tx is zero": { + minGasPrice: minGasPrice, + globalFeeParams: globalfeeParamsLow, + gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt())), + gasLimit: testGasLimit, + txMsg: testdata.NewTestMsg(addr1), + txCheck: false, + expErr: true, + }, + "disable checkTx: min_gas_price is low, global fee is low, tx fee's denom is not in global fees denoms set": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, gasPrice: sdk.NewCoins(sdk.NewCoin("quark", sdk.ZeroInt())), gasLimit: testGasLimit, txMsg: testdata.NewTestMsg(addr1), txCheck: false, - expErr: false, + expErr: true, }, } for name, tc := range testCases { @@ -799,5 +808,4 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { res, err = feeDecorator.GetTxFeeRequired(ctx, tx) s.Require().NoError(err) s.Require().True(res.IsEqual(globalFee)) - } From f9698072328b6d2617b41c4169e3a7a782e657f3 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 26 Apr 2023 17:32:09 +0200 Subject: [PATCH 06/34] save --- tests/e2e/e2e_exec_test.go | 9 +- tests/e2e/e2e_setup_test.go | 6 +- tests/e2e/e2e_staking_test.go | 22 + tests/e2e/e2e_test.go | 22 +- tests/e2e/e2e_vesting_test.go | 16 + v9/config/addrbook.json | 4 + v9/config/app.toml | 238 +++++++++ v9/config/client.toml | 17 + v9/config/config.toml | 471 +++++++++++++++++ v9/config/genesis.json | 500 ++++++++++++++++++ ...f46580e0e745493e704ce155b2fd11b18e49d.json | 1 + v9/config/node_key.json | 1 + v9/config/priv_validator_key.json | 11 + v9/data/application.db/CURRENT | 1 + v9/data/application.db/LOCK | 0 v9/data/application.db/LOG | 6 + v9/data/application.db/MANIFEST-000000 | Bin 0 -> 54 bytes v9/data/blockstore.db/CURRENT | 1 + v9/data/blockstore.db/LOCK | 0 v9/data/blockstore.db/LOG | 8 + v9/data/blockstore.db/MANIFEST-000000 | Bin 0 -> 54 bytes v9/data/cs.wal/wal | Bin 0 -> 180893 bytes v9/data/evidence.db/CURRENT | 1 + v9/data/evidence.db/LOCK | 0 v9/data/evidence.db/LOG | 6 + v9/data/evidence.db/MANIFEST-000000 | Bin 0 -> 54 bytes v9/data/priv_validator_state.json | 7 + v9/data/snapshots/metadata.db/CURRENT | 1 + v9/data/snapshots/metadata.db/LOCK | 0 v9/data/snapshots/metadata.db/LOG | 6 + v9/data/snapshots/metadata.db/MANIFEST-000000 | Bin 0 -> 54 bytes v9/data/state.db/CURRENT | 1 + v9/data/state.db/LOCK | 0 v9/data/state.db/LOG | 8 + v9/data/state.db/MANIFEST-000000 | Bin 0 -> 54 bytes v9/data/tx_index.db/CURRENT | 1 + v9/data/tx_index.db/LOCK | 0 v9/data/tx_index.db/LOG | 6 + v9/data/tx_index.db/MANIFEST-000000 | Bin 0 -> 54 bytes ...97567a853c6e43917271b22058e07519cd.address | 1 + ...3e8765a2cdddd084efbc1f878c8a9f09aa.address | 1 + ...0bc2822ccd272a242fdca50cfefb88736a.address | 1 + ...37968ad958f980745aab8e721456578133.address | 1 + v9/keyring-test/alice.info | 1 + v9/keyring-test/bob.info | 1 + v9/keyring-test/charlie.info | 1 + ...a6524043feda8e01e2773c8d29d4815889.address | 1 + v9/keyring-test/rly0.info | 1 + v9/keyring-test/val1.info | 1 + 49 files changed, 1366 insertions(+), 15 deletions(-) create mode 100644 v9/config/addrbook.json create mode 100644 v9/config/app.toml create mode 100644 v9/config/client.toml create mode 100644 v9/config/config.toml create mode 100644 v9/config/genesis.json create mode 100644 v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json create mode 100644 v9/config/node_key.json create mode 100644 v9/config/priv_validator_key.json create mode 100644 v9/data/application.db/CURRENT create mode 100644 v9/data/application.db/LOCK create mode 100644 v9/data/application.db/LOG create mode 100644 v9/data/application.db/MANIFEST-000000 create mode 100644 v9/data/blockstore.db/CURRENT create mode 100644 v9/data/blockstore.db/LOCK create mode 100644 v9/data/blockstore.db/LOG create mode 100644 v9/data/blockstore.db/MANIFEST-000000 create mode 100644 v9/data/cs.wal/wal create mode 100644 v9/data/evidence.db/CURRENT create mode 100644 v9/data/evidence.db/LOCK create mode 100644 v9/data/evidence.db/LOG create mode 100644 v9/data/evidence.db/MANIFEST-000000 create mode 100644 v9/data/priv_validator_state.json create mode 100644 v9/data/snapshots/metadata.db/CURRENT create mode 100644 v9/data/snapshots/metadata.db/LOCK create mode 100644 v9/data/snapshots/metadata.db/LOG create mode 100644 v9/data/snapshots/metadata.db/MANIFEST-000000 create mode 100644 v9/data/state.db/CURRENT create mode 100644 v9/data/state.db/LOCK create mode 100644 v9/data/state.db/LOG create mode 100644 v9/data/state.db/MANIFEST-000000 create mode 100644 v9/data/tx_index.db/CURRENT create mode 100644 v9/data/tx_index.db/LOCK create mode 100644 v9/data/tx_index.db/LOG create mode 100644 v9/data/tx_index.db/MANIFEST-000000 create mode 100644 v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address create mode 100644 v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address create mode 100644 v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address create mode 100644 v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address create mode 100644 v9/keyring-test/alice.info create mode 100644 v9/keyring-test/bob.info create mode 100644 v9/keyring-test/charlie.info create mode 100644 v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address create mode 100644 v9/keyring-test/rly0.info create mode 100644 v9/keyring-test/val1.info diff --git a/tests/e2e/e2e_exec_test.go b/tests/e2e/e2e_exec_test.go index 1c3df872b5c..e42ec4ae4d2 100644 --- a/tests/e2e/e2e_exec_test.go +++ b/tests/e2e/e2e_exec_test.go @@ -440,8 +440,9 @@ func (s *IntegrationTestSuite) executeDelegate(c *chain, valIdx int, amount, val fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, "300uatom"), "--keyring-backend=test", + fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), fmt.Sprintf("--%s=%s", flags.FlagHome, home), "--output=json", "-y", @@ -470,7 +471,8 @@ func (s *IntegrationTestSuite) executeRedelegate(c *chain, valIdx int, amount, o fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, "300uatom"), + fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), "--keyring-backend=test", fmt.Sprintf("--%s=%s", flags.FlagHome, home), "--output=json", @@ -599,6 +601,7 @@ func (s *IntegrationTestSuite) executeGaiaTxCommand(ctx context.Context, c *chai Cmd: gaiaCommand, }) s.Require().NoError(err) + fmt.Println(gaiaCommand) err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, @@ -610,6 +613,8 @@ func (s *IntegrationTestSuite) executeGaiaTxCommand(ctx context.Context, c *chai stdOut := outBuf.Bytes() stdErr := errBuf.Bytes() + fmt.Println(string(stdOut), string(stdErr)) + if !validation(stdOut, stdErr) { s.Require().FailNowf("Exec validation failed", "stdout: %s, stderr: %s", string(stdOut), string(stdErr)) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 83e35e83c0d..1c4eed1ca76 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -146,8 +146,10 @@ func (s *IntegrationTestSuite) SetupSuite() { s.initValidatorConfigs(s.chainB) s.runValidators(s.chainB, 10) - time.Sleep(10 * time.Second) - s.runIBCRelayer() + if runIBCTest { + time.Sleep(10 * time.Second) + s.runIBCRelayer() + } } func (s *IntegrationTestSuite) TearDownSuite() { diff --git a/tests/e2e/e2e_staking_test.go b/tests/e2e/e2e_staking_test.go index 592d4e23d43..8b144d3b8fa 100644 --- a/tests/e2e/e2e_staking_test.go +++ b/tests/e2e/e2e_staking_test.go @@ -25,6 +25,17 @@ func (s *IntegrationTestSuite) testStaking() { delegationAmount := sdk.NewInt(500000000) delegation := sdk.NewCoin(uatomDenom, delegationAmount) // 500 atom + s.Require().Eventually( + func() bool { + balances, err := queryGaiaAllBalances(chainEndpoint, delegatorAddress) + s.Require().NoError(err) + s.T().Log(balances.String()) + return balances.Len() != 0 + }, + time.Minute, + 5*time.Second, + ) + // Alice delegate uatom to Validator A s.executeDelegate(s.chainA, 0, delegation.String(), validatorAddressA, delegatorAddress, gaiaHomePath, fees.String()) @@ -41,6 +52,17 @@ func (s *IntegrationTestSuite) testStaking() { 5*time.Second, ) + s.Require().Eventually( + func() bool { + balances, err := queryGaiaAllBalances(chainEndpoint, delegatorAddress) + s.Require().NoError(err) + s.T().Log(balances.String()) + return balances.Len() != 0 + }, + time.Minute, + 5*time.Second, + ) + // Alice re-delegate uatom from Validator A to Validator B s.executeRedelegate(s.chainA, 0, delegation.String(), validatorAddressA, validatorAddressB, delegatorAddress, gaiaHomePath, fees.String()) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index f272d72434c..e115c38a7f6 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -5,18 +5,18 @@ import ( ) var ( - runBankTest = true - runBypassMinFeeTest = true - runEncodeTest = true - runEvidenceTest = true - runFeeGrantTest = true - runGlobalFeesTest = true - runGovTest = true - runIBCTest = true - runSlashingTest = true - runStakingAndDistributionTest = true + runBankTest = false + runBypassMinFeeTest = false + runEncodeTest = false + runEvidenceTest = false + runFeeGrantTest = false + runGlobalFeesTest = false + runGovTest = false + runIBCTest = false + runSlashingTest = false + runStakingAndDistributionTest = false runVestingTest = true - runRestInterfacesTest = true + runRestInterfacesTest = false ) func (s *IntegrationTestSuite) TestRestInterfaces() { diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index a405a411eee..9fd598e9e39 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -2,6 +2,7 @@ package e2e import ( "encoding/json" + "fmt" "math/rand" "path/filepath" "time" @@ -59,6 +60,17 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { s.Require().NoError(err) s.Require().Equal(vestingBalance.AmountOf(uatomDenom), balance.Amount) + s.Require().Eventually( + func() bool { + balances, err := queryGaiaAllBalances(api, vestingDelayedAcc.String()) + s.Require().NoError(err) + s.T().Log(balances.String()) + return balances.Len() != 0 + }, + time.Minute, + 20*time.Second, + ) + // Delegate coins should succeed s.executeDelegate(chain, valIdx, vestingDelegationAmount.String(), valOpAddr, vestingDelayedAcc.String(), gaiaHomePath, vestingDelegationFees.String()) @@ -75,6 +87,8 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { 20*time.Second, 5*time.Second, ) + 59755500uatom + 99900350000uatom waitTime := acc.EndTime - time.Now().Unix() if waitTime > vestingTxDelay { @@ -125,8 +139,10 @@ func (s *IntegrationTestSuite) testContinuousVestingAccount(api string) { // Check address balance balance, err := getSpecificBalance(api, continuousVestingAcc.String(), uatomDenom) + fmt.Println(balance.String()) s.Require().NoError(err) s.Require().Equal(vestingBalance.AmountOf(uatomDenom), balance.Amount) + fmt.Println(vestingBalance.AmountOf(uatomDenom)) // Delegate coins should succeed s.executeDelegate(chain, valIdx, vestingDelegationAmount.String(), diff --git a/v9/config/addrbook.json b/v9/config/addrbook.json new file mode 100644 index 00000000000..1e332c31f40 --- /dev/null +++ b/v9/config/addrbook.json @@ -0,0 +1,4 @@ +{ + "key": "5444e668e5802cbf78bcb12d", + "addrs": [] +} \ No newline at end of file diff --git a/v9/config/app.toml b/v9/config/app.toml new file mode 100644 index 00000000000..12f31456787 --- /dev/null +++ b/v9/config/app.toml @@ -0,0 +1,238 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Custom Gaia Configuration ### +############################################################################### +# bypass-min-fee-msg-types defines custom message types the operator may set that +# will bypass minimum fee checks during CheckTx. +# NOTE: +# bypass-min-fee-msg-types = [] will deactivate the bypass - no messages will be allowed to bypass the minimum fee check +# bypass-min-fee-msg-types = [...] will allow messages of specified type to bypass the minimum fee check +# removing bypass-min-fee-msg-types from the config file will apply the default values: +# ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient"] +# +# Example: +# bypass-min-fee-msg-types = ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient"] +bypass-min-fee-msg-types = ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient", "/ibc.core.channel.v1.MsgTimeout", "/ibc.core.channel.v1.MsgTimeoutOnClose", ] + +############################################################################### +### Base Configuration ### +############################################################################### + +# 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.25token1;0.0001token2). +minimum-gas-prices = "" + +# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals +# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) +# everything: all saved states will be deleted, storing only the current and previous state; pruning at 10 block intervals +# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' +pruning = "default" + +# These are applied if and only if the pruning strategy is custom. +pruning-keep-recent = "0" +pruning-keep-every = "0" +pruning-interval = "0" + +# HaltHeight contains a non-zero block height at which a node will gracefully +# halt and shutdown that can be used to assist upgrades and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-height = 0 + +# HaltTime contains a non-zero minimum block time (in Unix seconds) at which +# a node will gracefully halt and shutdown that can be used to assist upgrades +# and testing. +# +# Note: Commitment of state will be attempted on the corresponding block. +halt-time = 0 + +# MinRetainBlocks defines the minimum block height offset from the current +# block being committed, such that all blocks past this offset are pruned +# from Tendermint. It is used as part of the process of determining the +# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates +# that no blocks should be pruned. +# +# This configuration value is only responsible for pruning Tendermint blocks. +# It has no bearing on application state pruning which is determined by the +# "pruning-*" configurations. +# +# Note: Tendermint block pruning is dependant on this parameter in conunction +# with the unbonding (safety threshold) period, state pruning and state sync +# snapshot parameters to determine the correct minimum value of +# ResponseCommit.RetainHeight. +min-retain-blocks = 0 + +# InterBlockCache enables inter-block caching. +inter-block-cache = true + +# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, +# which informs Tendermint what to index. If empty, all events will be indexed. +# +# Example: +# ["message.sender", "message.recipient"] +index-events = [] + +# IavlCacheSize set the size of the iavl tree cache. +# Default cache size is 50mb. +iavl-cache-size = 781250 + +# IAVLDisableFastNode enables or disables the fast node feature of IAVL. +# Default is true. +iavl-disable-fastnode = true + +############################################################################### +### Telemetry Configuration ### +############################################################################### + +[telemetry] + +# Prefixed with keys to separate services. +service-name = "" + +# Enabled enables the application telemetry functionality. When enabled, +# an in-memory sink is also enabled by default. Operators may also enabled +# other sinks such as Prometheus. +enabled = false + +# Enable prefixing gauge values with hostname. +enable-hostname = false + +# Enable adding hostname to labels. +enable-hostname-label = false + +# Enable adding service to labels. +enable-service-label = false + +# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. +prometheus-retention-time = 0 + +# GlobalLabels defines a global set of name/value label tuples applied to all +# metrics emitted using the wrapper functions defined in telemetry package. +# +# Example: +# [["chain_id", "cosmoshub-1"]] +global-labels = [ +] + +############################################################################### +### API Configuration ### +############################################################################### + +[api] + +# Enable defines if the API server should be enabled. +enable = false + +# Swagger defines if swagger documentation should automatically be registered. +swagger = false + +# Address defines the API server to listen on. +address = "tcp://0.0.0.0:1317" + +# MaxOpenConnections defines the number of maximum open connections. +max-open-connections = 1000 + +# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). +rpc-read-timeout = 10 + +# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). +rpc-write-timeout = 0 + +# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). +rpc-max-body-bytes = 1000000 + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enabled-unsafe-cors = false + +############################################################################### +### Rosetta Configuration ### +############################################################################### + +[rosetta] + +# Enable defines if the Rosetta API server should be enabled. +enable = false + +# Address defines the Rosetta API server to listen on. +address = ":8080" + +# Network defines the name of the blockchain that will be returned by Rosetta. +blockchain = "app" + +# Network defines the name of the network that will be returned by Rosetta. +network = "network" + +# Retries defines the number of retries when connecting to the node before failing. +retries = 3 + +# Offline defines if Rosetta server should run in offline mode. +offline = false + +############################################################################### +### gRPC Configuration ### +############################################################################### + +[grpc] + +# Enable defines if the gRPC server should be enabled. +enable = true + +# Address defines the gRPC server address to bind to. +address = "0.0.0.0:9090" + +############################################################################### +### gRPC Web Configuration ### +############################################################################### + +[grpc-web] + +# GRPCWebEnable defines if the gRPC-web should be enabled. +# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. +enable = true + +# Address defines the gRPC-web server address to bind to. +address = "0.0.0.0:9091" + +# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). +enable-unsafe-cors = false + +############################################################################### +### State Sync Configuration ### +############################################################################### + +# State sync snapshots allow other nodes to rapidly join the network without replaying historical +# blocks, instead downloading and applying a snapshot of the application state at a given height. +[state-sync] + +# snapshot-interval specifies the block interval at which local state sync snapshots are +# taken (0 to disable). Must be a multiple of pruning-keep-every. +snapshot-interval = 1000 + +# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). +snapshot-keep-recent = 10 + +############################################################################### +### Store / State Streaming ### +############################################################################### + +[store] +streamers = [] + +[streamers] +[streamers.file] +keys = ["*", ] +write_dir = "" +prefix = "" + +# output-metadata specifies if output the metadata file which includes the abci request/responses +# during processing the block. +output-metadata = "true" + +# stop-node-on-error specifies if propagate the file streamer errors to consensus state machine. +stop-node-on-error = "true" + +# fsync specifies if call fsync after writing the files. +fsync = "false" diff --git a/v9/config/client.toml b/v9/config/client.toml new file mode 100644 index 00000000000..e1e4d146b09 --- /dev/null +++ b/v9/config/client.toml @@ -0,0 +1,17 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +############################################################################### +### Client Configuration ### +############################################################################### + +# The network chain ID +chain-id = "test" +# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) +keyring-backend = "test" +# CLI output format (text|json) +output = "text" +# : to Tendermint RPC interface for this chain +node = "tcp://localhost:" +# Transaction broadcasting mode (sync|async|block) +broadcast-mode = "block" diff --git a/v9/config/config.toml b/v9/config/config.toml new file mode 100644 index 00000000000..eb1a5d28f52 --- /dev/null +++ b/v9/config/config.toml @@ -0,0 +1,471 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or +# relative to the home directory (e.g. "data"). The home directory is +# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable +# or --home cmd flag. + +####################################################################### +### Main Base Config Options ### +####################################################################### + +# TCP or UNIX socket address of the ABCI application, +# or the name of an ABCI application compiled in with the CometBFT binary +proxy_app = "tcp://127.0.0.1:26658" + +# A custom human readable name for this node +moniker = "mynode0" + +# If this node is many blocks behind the tip of the chain, FastSync +# allows them to catchup quickly by downloading blocks in parallel +# and verifying their commits +fast_sync = true + +# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb +# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) +# - pure go +# - stable +# * cleveldb (uses levigo wrapper) +# - fast +# - requires gcc +# - use cleveldb build tag (go build -tags cleveldb) +# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) +# - EXPERIMENTAL +# - may be faster is some use-cases (random reads - indexer) +# - use boltdb build tag (go build -tags boltdb) +# * rocksdb (uses github.com/tecbot/gorocksdb) +# - EXPERIMENTAL +# - requires gcc +# - use rocksdb build tag (go build -tags rocksdb) +# * badgerdb (uses github.com/dgraph-io/badger) +# - EXPERIMENTAL +# - use badgerdb build tag (go build -tags badgerdb) +db_backend = "goleveldb" + +# Database directory +db_dir = "data" + +# Output level for logging, including package level options +log_level = "info" + +# Output format: 'plain' (colored text) or 'json' +log_format = "plain" + +##### additional base config options ##### + +# Path to the JSON file containing the initial validator set and other meta data +genesis_file = "config/genesis.json" + +# Path to the JSON file containing the private key to use as a validator in the consensus protocol +priv_validator_key_file = "config/priv_validator_key.json" + +# Path to the JSON file containing the last sign state of a validator +priv_validator_state_file = "data/priv_validator_state.json" + +# TCP or UNIX socket address for CometBFT to listen on for +# connections from an external PrivValidator process +priv_validator_laddr = "" + +# Path to the JSON file containing the private key to use for node authentication in the p2p protocol +node_key_file = "config/node_key.json" + +# Mechanism to connect to the ABCI application: socket | grpc +abci = "socket" + +# If true, query the ABCI app on connecting to a new peer +# so the app can decide if we should keep the connection or not +filter_peers = false + + +####################################################################### +### Advanced Configuration Options ### +####################################################################### + +####################################################### +### RPC Server Configuration Options ### +####################################################### +[rpc] + +# TCP or UNIX socket address for the RPC server to listen on +laddr = "tcp://127.0.0.1:26657" + +# A list of origins a cross-domain request can be executed from +# Default value '[]' disables cors support +# Use '["*"]' to allow any origin +cors_allowed_origins = [] + +# A list of methods the client is allowed to use with cross-domain requests +cors_allowed_methods = ["HEAD", "GET", "POST", ] + +# A list of non simple headers the client is allowed to use with cross-domain requests +cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] + +# TCP or UNIX socket address for the gRPC server to listen on +# NOTE: This server only supports /broadcast_tx_commit +grpc_laddr = "" + +# Maximum number of simultaneous connections. +# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +grpc_max_open_connections = 900 + +# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool +unsafe = false + +# Maximum number of simultaneous connections (including WebSocket). +# Does not include gRPC connections. See grpc_max_open_connections +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} +# 1024 - 40 - 10 - 50 = 924 = ~900 +max_open_connections = 900 + +# Maximum number of unique clientIDs that can /subscribe +# If you're using /broadcast_tx_commit, set to the estimated maximum number +# of broadcast_tx_commit calls per block. +max_subscription_clients = 100 + +# Maximum number of unique queries a given client can /subscribe to +# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to +# the estimated # maximum number of broadcast_tx_commit calls per block. +max_subscriptions_per_client = 5 + +# Experimental parameter to specify the maximum number of events a node will +# buffer, per subscription, before returning an error and closing the +# subscription. Must be set to at least 100, but higher values will accommodate +# higher event throughput rates (and will use more memory). +experimental_subscription_buffer_size = 200 + +# Experimental parameter to specify the maximum number of RPC responses that +# can be buffered per WebSocket client. If clients cannot read from the +# WebSocket endpoint fast enough, they will be disconnected, so increasing this +# parameter may reduce the chances of them being disconnected (but will cause +# the node to use more memory). +# +# Must be at least the same as "experimental_subscription_buffer_size", +# otherwise connections could be dropped unnecessarily. This value should +# ideally be somewhat higher than "experimental_subscription_buffer_size" to +# accommodate non-subscription-related RPC responses. +experimental_websocket_write_buffer_size = 200 + +# If a WebSocket client cannot read fast enough, at present we may +# silently drop events instead of generating an error or disconnecting the +# client. +# +# Enabling this experimental parameter will cause the WebSocket connection to +# be closed instead if it cannot read fast enough, allowing for greater +# predictability in subscription behaviour. +experimental_close_on_slow_client = false + +# How long to wait for a tx to be committed during /broadcast_tx_commit. +# WARNING: Using a value larger than 10s will result in increasing the +# global HTTP write timeout, which applies to all connections and endpoints. +# See https://github.com/tendermint/tendermint/issues/3435 +timeout_broadcast_tx_commit = "10s" + +# Maximum size of request body, in bytes +max_body_bytes = 1000000 + +# Maximum size of request header, in bytes +max_header_bytes = 1048576 + +# The path to a file containing certificate that is used to create the HTTPS server. +# Might be either absolute path or path related to CometBFT's config directory. +# If the certificate is signed by a certificate authority, +# the certFile should be the concatenation of the server's certificate, any intermediates, +# and the CA's certificate. +# NOTE: both tls_cert_file and tls_key_file must be present for CometBFT to create HTTPS server. +# Otherwise, HTTP server is run. +tls_cert_file = "" + +# The path to a file containing matching private key that is used to create the HTTPS server. +# Might be either absolute path or path related to CometBFT's config directory. +# NOTE: both tls-cert-file and tls-key-file must be present for CometBFT to create HTTPS server. +# Otherwise, HTTP server is run. +tls_key_file = "" + +# pprof listen address (https://golang.org/pkg/net/http/pprof) +pprof_laddr = "localhost:6060" + +####################################################### +### P2P Configuration Options ### +####################################################### +[p2p] + +# Address to listen for incoming connections +laddr = "tcp://0.0.0.0:26656" + +# Address to advertise to peers for them to dial +# If empty, will use the same port as the laddr, +# and will introspect on the listener or use UPnP +# to figure out the address. ip and port are required +# example: 159.89.10.97:26656 +external_address = "" + +# Comma separated list of seed nodes to connect to +seeds = "" + +# Comma separated list of nodes to keep persistent connections to +persistent_peers = "" + +# UPNP port forwarding +upnp = false + +# Path to address book +addr_book_file = "config/addrbook.json" + +# Set true for strict address routability rules +# Set false for private or local networks +addr_book_strict = true + +# Maximum number of inbound peers +max_num_inbound_peers = 40 + +# Maximum number of outbound peers to connect to, excluding persistent peers +max_num_outbound_peers = 10 + +# List of node IDs, to which a connection will be (re)established ignoring any existing limits +unconditional_peer_ids = "" + +# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) +persistent_peers_max_dial_period = "0s" + +# Time to wait before flushing messages out on the connection +flush_throttle_timeout = "100ms" + +# Maximum size of a message packet payload, in bytes +max_packet_msg_payload_size = 1024 + +# Rate at which packets can be sent, in bytes/second +send_rate = 5120000 + +# Rate at which packets can be received, in bytes/second +recv_rate = 5120000 + +# Set true to enable the peer-exchange reactor +pex = true + +# Seed mode, in which node constantly crawls the network and looks for +# peers. If another node asks it for addresses, it responds and disconnects. +# +# Does not work if the peer-exchange reactor is disabled. +seed_mode = false + +# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) +private_peer_ids = "" + +# Toggle to disable guard against peers connecting from the same ip. +allow_duplicate_ip = false + +# Peer connection configuration. +handshake_timeout = "20s" +dial_timeout = "3s" + +####################################################### +### Mempool Configuration Option ### +####################################################### +[mempool] + +# Mempool version to use: +# 1) "v0" - (default) FIFO mempool. +# 2) "v1" - prioritized mempool. +version = "v0" + +# Recheck (default: true) defines whether CometBFT should recheck the +# validity for all remaining transaction in the mempool after a block. +# Since a block affects the application state, some transactions in the +# mempool may become invalid. If this does not apply to your application, +# you can disable rechecking. +recheck = true +broadcast = true +wal_dir = "" + +# Maximum number of transactions in the mempool +size = 5000 + +# Limit the total size of all txs in the mempool. +# This only accounts for raw transactions (e.g. given 1MB transactions and +# max_txs_bytes=5MB, mempool will only accept 5 transactions). +max_txs_bytes = 1073741824 + +# Size of the cache (used to filter transactions we saw earlier) in transactions +cache_size = 10000 + +# Do not remove invalid transactions from the cache (default: false) +# Set to true if it's not possible for any invalid transaction to become valid +# again in the future. +keep-invalid-txs-in-cache = false + +# Maximum size of a single transaction. +# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. +max_tx_bytes = 1048576 + +# Maximum size of a batch of transactions to send to a peer +# Including space needed by encoding (one varint per transaction). +# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 +max_batch_bytes = 0 + +# ttl-duration, if non-zero, defines the maximum amount of time a transaction +# can exist for in the mempool. +# +# Note, if ttl-num-blocks is also defined, a transaction will be removed if it +# has existed in the mempool at least ttl-num-blocks number of blocks or if it's +# insertion time into the mempool is beyond ttl-duration. +ttl-duration = "0s" + +# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction +# can exist for in the mempool. +# +# Note, if ttl-duration is also defined, a transaction will be removed if it +# has existed in the mempool at least ttl-num-blocks number of blocks or if +# it's insertion time into the mempool is beyond ttl-duration. +ttl-num-blocks = 0 + +####################################################### +### State Sync Configuration Options ### +####################################################### +[statesync] +# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine +# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in +# the network to take and serve state machine snapshots. State sync is not attempted if the node +# has any local state (LastBlockHeight > 0). The node will have a truncated block history, +# starting from the height of the snapshot. +enable = false + +# RPC servers (comma-separated) for light client verification of the synced state machine and +# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding +# header hash obtained from a trusted source, and a period during which validators can be trusted. +# +# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 +# weeks) during which they can be financially punished (slashed) for misbehavior. +rpc_servers = "" +trust_height = 0 +trust_hash = "" +trust_period = "168h0m0s" + +# Time to spend discovering snapshots before initiating a restore. +discovery_time = "15s" + +# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). +# Will create a new, randomly named directory within, and remove it when done. +temp_dir = "" + +# The timeout duration before re-requesting a chunk, possibly from a different +# peer (default: 1 minute). +chunk_request_timeout = "10s" + +# The number of concurrent chunk fetchers to run (default: 1). +chunk_fetchers = "4" + +####################################################### +### Fast Sync Configuration Connections ### +####################################################### +[fastsync] + +# Fast Sync version to use: +# 1) "v0" (default) - the legacy fast sync implementation +# 2) "v1" - refactor of v0 version for better testability +# 2) "v2" - complete redesign of v0, optimized for testability & readability +version = "v0" + +####################################################### +### Consensus Configuration Options ### +####################################################### +[consensus] + +wal_file = "data/cs.wal/wal" + +# How long we wait for a proposal block before prevoting nil +timeout_propose = "3s" +# How much timeout_propose increases with each round +timeout_propose_delta = "500ms" +# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) +timeout_prevote = "1s" +# How much the timeout_prevote increases with each round +timeout_prevote_delta = "500ms" +# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) +timeout_precommit = "1s" +# How much the timeout_precommit increases with each round +timeout_precommit_delta = "500ms" +# How long we wait after committing a block, before starting on the new +# height (this gives us a chance to receive some more precommits, even +# though we already have +2/3). +timeout_commit = "5s" + +# How many blocks to look back to check existence of the node's consensus votes before joining consensus +# When non-zero, the node will panic upon restart +# if the same consensus key was used to sign {double_sign_check_height} last blocks. +# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. +double_sign_check_height = 0 + +# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) +skip_timeout_commit = false + +# EmptyBlocks mode and possible interval between empty blocks +create_empty_blocks = true +create_empty_blocks_interval = "0s" + +# Reactor sleep duration parameters +peer_gossip_sleep_duration = "100ms" +peer_query_maj23_sleep_duration = "2s" + +####################################################### +### Storage Configuration Options ### +####################################################### +[storage] + +# Set to true to discard ABCI responses from the state store, which can save a +# considerable amount of disk space. Set to false to ensure ABCI responses are +# persisted. ABCI responses are required for /block_results RPC queries, and to +# reindex events in the command-line tool. +discard_abci_responses = false + +####################################################### +### Transaction Indexer Configuration Options ### +####################################################### +[tx_index] + +# What indexer to use for transactions +# +# The application will set which txs to index. In some cases a node operator will be able +# to decide which txs to index based on configuration set in the application. +# +# Options: +# 1) "null" +# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). +# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. +# 3) "psql" - the indexer services backed by PostgreSQL. +# When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. +indexer = "kv" + +# The PostgreSQL connection configuration, the connection format: +# postgresql://:@:/? +psql-conn = "" + +####################################################### +### Instrumentation Configuration Options ### +####################################################### +[instrumentation] + +# When true, Prometheus metrics are served under /metrics on +# PrometheusListenAddr. +# Check out the documentation for the list of available metrics. +prometheus = false + +# Address to listen for Prometheus collector(s) connections +prometheus_listen_addr = ":26660" + +# Maximum number of simultaneous connections. +# If you want to accept a larger number than the default, make sure +# you increase your OS limits. +# 0 - unlimited. +max_open_connections = 3 + +# Instrumentation namespace +namespace = "cometbft" diff --git a/v9/config/genesis.json b/v9/config/genesis.json new file mode 100644 index 00000000000..83fb6d525ef --- /dev/null +++ b/v9/config/genesis.json @@ -0,0 +1,500 @@ +{ + "genesis_time": "2023-04-26T12:54:19.026291Z", + "chain_id": "test", + "initial_height": "1", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_num_blocks": "100000", + "max_age_duration": "172800000000000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + }, + "app_hash": "", + "app_state": { + "auth": { + "params": { + "max_memo_characters": "256", + "tx_sig_limit": "7", + "tx_size_cost_per_byte": "10", + "sig_verify_cost_ed25519": "590", + "sig_verify_cost_secp256k1": "1000" + }, + "accounts": [ + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1mjk79fjjgpplak5wq838w0yd982gzkyfrk07am", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1v9g4uduk3tv437vqw3d2hrnjz3t90qfndas2vn", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1tp3usz7zsgkv6fe2yshaefgvlmacsum227vka7", + "pub_key": null, + "account_number": "0", + "sequence": "0" + }, + { + "@type": "/cosmos.auth.v1beta1.BaseAccount", + "address": "cosmos1q8h9996k02zncmjrj9e8rv3qtrs82xwdhdtyda", + "pub_key": null, + "account_number": "0", + "sequence": "0" + } + ] + }, + "authz": { + "authorization": [] + }, + "bank": { + "params": { + "send_enabled": [], + "default_send_enabled": true + }, + "balances": [ + { + "address": "cosmos1q8h9996k02zncmjrj9e8rv3qtrs82xwdhdtyda", + "coins": [ + { + "denom": "stake", + "amount": "100000000000" + } + ] + }, + { + "address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", + "coins": [ + { + "denom": "photon", + "amount": "10000000000000000" + }, + { + "denom": "stake", + "amount": "10000000000000000" + } + ] + }, + { + "address": "cosmos1tp3usz7zsgkv6fe2yshaefgvlmacsum227vka7", + "coins": [ + { + "denom": "stake", + "amount": "100000000000" + } + ] + }, + { + "address": "cosmos1v9g4uduk3tv437vqw3d2hrnjz3t90qfndas2vn", + "coins": [ + { + "denom": "stake", + "amount": "100000000000" + } + ] + }, + { + "address": "cosmos1mjk79fjjgpplak5wq838w0yd982gzkyfrk07am", + "coins": [ + { + "denom": "stake", + "amount": "100000000000" + } + ] + } + ], + "supply": [ + { + "denom": "photon", + "amount": "10000000000000000" + }, + { + "denom": "stake", + "amount": "10000400000000000" + } + ], + "denom_metadata": [] + }, + "capability": { + "index": "1", + "owners": [] + }, + "crisis": { + "constant_fee": { + "denom": "stake", + "amount": "1000" + } + }, + "distribution": { + "params": { + "community_tax": "0.020000000000000000", + "base_proposer_reward": "0.010000000000000000", + "bonus_proposer_reward": "0.040000000000000000", + "withdraw_addr_enabled": true + }, + "fee_pool": { + "community_pool": [] + }, + "delegator_withdraw_infos": [], + "previous_proposer": "", + "outstanding_rewards": [], + "validator_accumulated_commissions": [], + "validator_historical_rewards": [], + "validator_current_rewards": [], + "delegator_starting_infos": [], + "validator_slash_events": [] + }, + "evidence": { + "evidence": [] + }, + "feegrant": { + "allowances": [] + }, + "genutil": { + "gen_txs": [ + { + "body": { + "messages": [ + { + "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", + "description": { + "moniker": "mynode0", + "identity": "", + "website": "", + "security_contact": "", + "details": "" + }, + "commission": { + "rate": "0.100000000000000000", + "max_rate": "0.200000000000000000", + "max_change_rate": "0.010000000000000000" + }, + "min_self_delegation": "1", + "delegator_address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", + "validator_address": "cosmosvaloper1rcvw7058vk3vmhwssnhmc8u83j9f7zd2xwrvmh", + "pubkey": { + "@type": "/cosmos.crypto.ed25519.PubKey", + "key": "G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0=" + }, + "value": { + "denom": "stake", + "amount": "1000000000000" + } + } + ], + "memo": "9cef46580e0e745493e704ce155b2fd11b18e49d@192.168.1.72:26656", + "timeout_height": "0", + "extension_options": [], + "non_critical_extension_options": [] + }, + "auth_info": { + "signer_infos": [ + { + "public_key": { + "@type": "/cosmos.crypto.secp256k1.PubKey", + "key": "A7PWYbIo+kPW3E0TLj2UfJGaSW3Y2PZnvbDix2jKLbKU" + }, + "mode_info": { + "single": { + "mode": "SIGN_MODE_DIRECT" + } + }, + "sequence": "0" + } + ], + "fee": { + "amount": [], + "gas_limit": "200000", + "payer": "", + "granter": "" + } + }, + "signatures": [ + "kqAevPlLQIePJluUCUQuxklggrexKD6WxAFX8E61xypGKzlk4O927GhRicUD2f9zkpgJp9cUVpIBBTuH/JMawQ==" + ] + } + ] + }, + "globalfee": { + "params": { + "minimum_gas_prices": [] + } + }, + "gov": { + "starting_proposal_id": "1", + "deposits": [], + "votes": [], + "proposals": [], + "deposit_params": { + "min_deposit": [ + { + "denom": "stake", + "amount": "10000000" + } + ], + "max_deposit_period": "172800s" + }, + "voting_params": { + "voting_period": "172800s" + }, + "tally_params": { + "quorum": "0.334000000000000000", + "threshold": "0.500000000000000000", + "veto_threshold": "0.334000000000000000" + } + }, + "ibc": { + "client_genesis": { + "clients": [], + "clients_consensus": [], + "clients_metadata": [], + "params": { + "allowed_clients": [ + "06-solomachine", + "07-tendermint" + ] + }, + "create_localhost": false, + "next_client_sequence": "0" + }, + "connection_genesis": { + "connections": [], + "client_connection_paths": [], + "next_connection_sequence": "0", + "params": { + "max_expected_time_per_block": "30000000000" + } + }, + "channel_genesis": { + "channels": [], + "acknowledgements": [], + "commitments": [], + "receipts": [], + "send_sequences": [], + "recv_sequences": [], + "ack_sequences": [], + "next_channel_sequence": "0" + } + }, + "interchainaccounts": { + "controller_genesis_state": { + "active_channels": [], + "interchain_accounts": [], + "ports": [], + "params": { + "controller_enabled": true + } + }, + "host_genesis_state": { + "active_channels": [], + "interchain_accounts": [], + "port": "icahost", + "params": { + "host_enabled": true, + "allow_messages": [] + } + } + }, + "liquidity": { + "params": { + "pool_types": [ + { + "id": 1, + "name": "StandardLiquidityPool", + "min_reserve_coin_num": 2, + "max_reserve_coin_num": 2, + "description": "Standard liquidity pool with pool price function X/Y, ESPM constraint, and two kinds of reserve coins" + } + ], + "min_init_deposit_amount": "1000000", + "init_pool_coin_mint_amount": "1000000", + "max_reserve_coin_amount": "0", + "pool_creation_fee": [ + { + "denom": "stake", + "amount": "40000000" + } + ], + "swap_fee_rate": "0.003000000000000000", + "withdraw_fee_rate": "0.000000000000000000", + "max_order_amount_ratio": "0.100000000000000000", + "unit_batch_height": 1, + "circuit_breaker_enabled": false + }, + "pool_records": [] + }, + "mint": { + "minter": { + "inflation": "0.130000000000000000", + "annual_provisions": "0.000000000000000000" + }, + "params": { + "mint_denom": "stake", + "inflation_rate_change": "0.130000000000000000", + "inflation_max": "0.200000000000000000", + "inflation_min": "0.070000000000000000", + "goal_bonded": "0.670000000000000000", + "blocks_per_year": "6311520" + } + }, + "packetfowardmiddleware": { + "params": { + "fee_percentage": "0.000000000000000000" + }, + "in_flight_packets": {} + }, + "params": null, + "provider": { + "valset_update_id": "1", + "consumer_states": [], + "unbonding_ops": [], + "mature_unbonding_ops": null, + "valset_update_id_to_height": [], + "consumer_addition_proposals": [], + "consumer_removal_proposals": [], + "params": { + "template_client": { + "chain_id": "", + "trust_level": { + "numerator": "1", + "denominator": "3" + }, + "trusting_period": "0s", + "unbonding_period": "0s", + "max_clock_drift": "10s", + "frozen_height": { + "revision_number": "0", + "revision_height": "0" + }, + "latest_height": { + "revision_number": "0", + "revision_height": "0" + }, + "proof_specs": [ + { + "leaf_spec": { + "hash": "SHA256", + "prehash_key": "NO_HASH", + "prehash_value": "SHA256", + "length": "VAR_PROTO", + "prefix": "AA==" + }, + "inner_spec": { + "child_order": [ + 0, + 1 + ], + "child_size": 33, + "min_prefix_length": 4, + "max_prefix_length": 12, + "empty_child": null, + "hash": "SHA256" + }, + "max_depth": 0, + "min_depth": 0 + }, + { + "leaf_spec": { + "hash": "SHA256", + "prehash_key": "NO_HASH", + "prehash_value": "SHA256", + "length": "VAR_PROTO", + "prefix": "AA==" + }, + "inner_spec": { + "child_order": [ + 0, + 1 + ], + "child_size": 32, + "min_prefix_length": 1, + "max_prefix_length": 1, + "empty_child": null, + "hash": "SHA256" + }, + "max_depth": 0, + "min_depth": 0 + } + ], + "upgrade_path": [ + "upgrade", + "upgradedIBCState" + ], + "allow_update_after_expiry": true, + "allow_update_after_misbehaviour": true + }, + "trusting_period_fraction": "0.66", + "ccv_timeout_period": "2419200s", + "init_timeout_period": "604800s", + "vsc_timeout_period": "3024000s", + "slash_meter_replenish_period": "3600s", + "slash_meter_replenish_fraction": "0.05", + "max_throttled_packets": "100000" + }, + "validator_consumer_pubkeys": [], + "validators_by_consumer_addr": [], + "consumer_addrs_to_prune": [] + }, + "slashing": { + "params": { + "signed_blocks_window": "100", + "min_signed_per_window": "0.500000000000000000", + "downtime_jail_duration": "600s", + "slash_fraction_double_sign": "0.050000000000000000", + "slash_fraction_downtime": "0.010000000000000000" + }, + "signing_infos": [], + "missed_blocks": [] + }, + "staking": { + "params": { + "unbonding_time": "1814400s", + "max_validators": 100, + "max_entries": 7, + "historical_entries": 10000, + "bond_denom": "stake" + }, + "last_total_power": "0", + "last_validator_powers": [], + "validators": [], + "delegations": [], + "unbonding_delegations": [], + "redelegations": [], + "exported": false + }, + "transfer": { + "port_id": "transfer", + "denom_traces": [], + "params": { + "send_enabled": true, + "receive_enabled": true + } + }, + "upgrade": {}, + "vesting": {} + } +} \ No newline at end of file diff --git a/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json b/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json new file mode 100644 index 00000000000..351e2dd951e --- /dev/null +++ b/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json @@ -0,0 +1 @@ +{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"mynode0","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy","validator_address":"cosmosvaloper1rcvw7058vk3vmhwssnhmc8u83j9f7zd2xwrvmh","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0="},"value":{"denom":"stake","amount":"1000000000000"}}],"memo":"9cef46580e0e745493e704ce155b2fd11b18e49d@192.168.1.72:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A7PWYbIo+kPW3E0TLj2UfJGaSW3Y2PZnvbDix2jKLbKU"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["kqAevPlLQIePJluUCUQuxklggrexKD6WxAFX8E61xypGKzlk4O927GhRicUD2f9zkpgJp9cUVpIBBTuH/JMawQ=="]} diff --git a/v9/config/node_key.json b/v9/config/node_key.json new file mode 100644 index 00000000000..cc38713ab69 --- /dev/null +++ b/v9/config/node_key.json @@ -0,0 +1 @@ +{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"3e4OW3rwzaNU0Ny0ZE++2knmVuRe9ChUUNJVUGFS7iofJ6GmVuIO75MHbChrwA8UnPNnCkXgl3pUgVr0t1kE3Q=="}} \ No newline at end of file diff --git a/v9/config/priv_validator_key.json b/v9/config/priv_validator_key.json new file mode 100644 index 00000000000..481660fd578 --- /dev/null +++ b/v9/config/priv_validator_key.json @@ -0,0 +1,11 @@ +{ + "address": "41A5FF4E8949D30A15ADE95FA405E55D0E54EF14", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0=" + }, + "priv_key": { + "type": "tendermint/PrivKeyEd25519", + "value": "SSMw5an19NB9ZQ8HHzM9mEXFV3H+3UQvFI0eKceVUhkb2bQwoz2A+/zMuObw7BxwskTQ+kYEJTOpgr5KnMv07Q==" + } +} \ No newline at end of file diff --git a/v9/data/application.db/CURRENT b/v9/data/application.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/application.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/application.db/LOCK b/v9/data/application.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/application.db/LOG b/v9/data/application.db/LOG new file mode 100644 index 00000000000..01755c62d8b --- /dev/null +++ b/v9/data/application.db/LOG @@ -0,0 +1,6 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:19.581168 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:19.641145 db@open opening +14:54:19.641418 version@stat F·[] S·0B[] Sc·[] +14:54:19.661842 db@janitor F·2 G·0 +14:54:19.661868 db@open done T·20.679292ms diff --git a/v9/data/application.db/MANIFEST-000000 b/v9/data/application.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/data/blockstore.db/CURRENT b/v9/data/blockstore.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/blockstore.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/blockstore.db/LOCK b/v9/data/blockstore.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/blockstore.db/LOG b/v9/data/blockstore.db/LOG new file mode 100644 index 00000000000..41bad60cb0f --- /dev/null +++ b/v9/data/blockstore.db/LOG @@ -0,0 +1,8 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:19.746440 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:19.810090 db@open opening +14:54:19.810566 version@stat F·[] S·0B[] Sc·[] +14:54:19.829887 db@janitor F·2 G·0 +14:54:19.829926 db@open done T·19.755125ms +15:04:01.200084 db@close closing +15:04:01.200185 db@close done T·100.958µs diff --git a/v9/data/blockstore.db/MANIFEST-000000 b/v9/data/blockstore.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/data/cs.wal/wal b/v9/data/cs.wal/wal new file mode 100644 index 0000000000000000000000000000000000000000..1c1d56c0893c0761982864fb08540035a1d53b15 GIT binary patch literal 180893 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�ZMxuy&}PQ#~;>3J@cNNk!)Ap-R2J_%3)BqEum5 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 literal 0 HcmV?d00001 diff --git a/v9/data/evidence.db/CURRENT b/v9/data/evidence.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/evidence.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/evidence.db/LOCK b/v9/data/evidence.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/evidence.db/LOG b/v9/data/evidence.db/LOG new file mode 100644 index 00000000000..a76e7bf9103 --- /dev/null +++ b/v9/data/evidence.db/LOG @@ -0,0 +1,6 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:20.050744 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:20.107031 db@open opening +14:54:20.107287 version@stat F·[] S·0B[] Sc·[] +14:54:20.126432 db@janitor F·2 G·0 +14:54:20.126472 db@open done T·19.409708ms diff --git a/v9/data/evidence.db/MANIFEST-000000 b/v9/data/evidence.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/data/priv_validator_state.json b/v9/data/priv_validator_state.json new file mode 100644 index 00000000000..16def484214 --- /dev/null +++ b/v9/data/priv_validator_state.json @@ -0,0 +1,7 @@ +{ + "height": "113", + "round": 0, + "step": 3, + "signature": "nmXTIOVKRVLcEio16nrP7x3jh4Pi+YuXktAoO+I54/fZqo3apqbk1CIVn+B777wK2lLeOMVZSmHIt5HKp0zWDA==", + "signbytes": "69080211710000000000000022480A2060556C337D79D08968ECE2F5F025BD9743EAEA6C9A3F9F752E858A199662572A122408011220CBC2C9F932FF1A6E6ABA5DAA710F3FDF6F33D879210112ED6989B73FD26BF88D2A0C08BFC2A4A20610A0FDDEEC01320474657374" +} \ No newline at end of file diff --git a/v9/data/snapshots/metadata.db/CURRENT b/v9/data/snapshots/metadata.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/snapshots/metadata.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/snapshots/metadata.db/LOCK b/v9/data/snapshots/metadata.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/snapshots/metadata.db/LOG b/v9/data/snapshots/metadata.db/LOG new file mode 100644 index 00000000000..c3917369666 --- /dev/null +++ b/v9/data/snapshots/metadata.db/LOG @@ -0,0 +1,6 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:19.665963 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:19.725959 db@open opening +14:54:19.726415 version@stat F·[] S·0B[] Sc·[] +14:54:19.744880 db@janitor F·2 G·0 +14:54:19.744916 db@open done T·18.915292ms diff --git a/v9/data/snapshots/metadata.db/MANIFEST-000000 b/v9/data/snapshots/metadata.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/data/state.db/CURRENT b/v9/data/state.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/state.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/state.db/LOCK b/v9/data/state.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/state.db/LOG b/v9/data/state.db/LOG new file mode 100644 index 00000000000..108e46e9597 --- /dev/null +++ b/v9/data/state.db/LOG @@ -0,0 +1,8 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:19.830232 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:19.893377 db@open opening +14:54:19.894423 version@stat F·[] S·0B[] Sc·[] +14:54:19.914276 db@janitor F·2 G·0 +14:54:19.914431 db@open done T·20.954334ms +15:04:01.200253 db@close closing +15:04:01.200304 db@close done T·50.5µs diff --git a/v9/data/state.db/MANIFEST-000000 b/v9/data/state.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/data/tx_index.db/CURRENT b/v9/data/tx_index.db/CURRENT new file mode 100644 index 00000000000..feda7d6b248 --- /dev/null +++ b/v9/data/tx_index.db/CURRENT @@ -0,0 +1 @@ +MANIFEST-000000 diff --git a/v9/data/tx_index.db/LOCK b/v9/data/tx_index.db/LOCK new file mode 100644 index 00000000000..e69de29bb2d diff --git a/v9/data/tx_index.db/LOG b/v9/data/tx_index.db/LOG new file mode 100644 index 00000000000..36a2d44eef2 --- /dev/null +++ b/v9/data/tx_index.db/LOG @@ -0,0 +1,6 @@ +=============== Apr 26, 2023 (CEST) =============== +14:54:19.937714 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed +14:54:19.996697 db@open opening +14:54:19.997009 version@stat F·[] S·0B[] Sc·[] +14:54:20.016281 db@janitor F·2 G·0 +14:54:20.016318 db@open done T·19.576333ms diff --git a/v9/data/tx_index.db/MANIFEST-000000 b/v9/data/tx_index.db/MANIFEST-000000 new file mode 100644 index 0000000000000000000000000000000000000000..9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d GIT binary patch literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD literal 0 HcmV?d00001 diff --git a/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address b/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address new file mode 100644 index 00000000000..442abef9c3e --- /dev/null +++ b/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yNDQ0MTIgKzAyMDAgQ0VTVCBtPSswLjAyNTMzMjAwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjEyaWhRX0dGSkNvSWtjSHIifQ.KRnqp1-c6sbuPgsMgjqGt-f4vATO8Rs0d4bpA2mosWiCdYWueMM1aQ.qhlz_QhKXuSgzo74.reGrjNVFnL80Av7w1rVHudTQM2c0uJc8QqMdK4T88WCa2UDyQQB_0xfiE1t1J0U6vS4CUSyGVeVxalEYN24zUWH5L46IL6t2lUHHHQwT1oLvoepL5iTGGQ3neSmVatv-OjLtpl8uVERreas9_6RFZavZlaVS3y3a_mczRmqMIVoQS0csoe7qbkAX_kbVjS-fAdGQKORYdxSlI0ZQ8KcolmHOXrvK2WaCQ2cmTHD8xYlbUolK_j0.3_3ZFWWRY6Ws21yg57YkkQ \ No newline at end of file diff --git a/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address b/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address new file mode 100644 index 00000000000..d2f786cafd2 --- /dev/null +++ b/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNDM2NzQgKzAyMDAgQ0VTVCBtPSswLjAyNTc4NzU0MyIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ill3ZTdQVFpUOXJKS3ByaXIifQ.ft0ikJRRWR0kvKdWowERCK2ibsf6Nc7qFYpifrtdkZ-lXzYU6K18kQ.-SNY0abuh4fZEPGf.X_3xe-ZUFLC4W0d2NqbBtZjvbTLQ7cfdhw5lhyNycGf8N0NfxmslBuEASF84LzCy2qiXZa_jxJJjjQp6vVR1xnm9UQkziR4fNDBufjPaQG0CphpEcfIsioMG5zpviQ8SI9h1zX5N5BGtH0VpC8IJNdSQ99x-pBDzYSls_nwiw6K7qrDGWOqdwDlL2zCGkTmWoakUetDpuk4NcNpHXwIMboT6k1K9xLX-BjzIZEKNawSBQw.aKEXEQHy2J9egAjBeznpQw \ No newline at end of file diff --git a/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address b/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address new file mode 100644 index 00000000000..9b902074898 --- /dev/null +++ b/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yMTEyNyArMDIwMCBDRVNUIG09KzAuMDI2OTE1NzkyIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiMVIzSWZsWFJ4b1dLRXB0cyJ9.PTGBpv2IM1seBmZmEEzFrHWn906ztpy-aiI29ENM-d8BL9GNyUzAiA.MtEWbFIigwRnAgqR.N6qhznkh8rwFR64zlIkpgKV19dM6Iuv6_XH2xNZla4Z2_7ATsel3_QdC1cKR3xlUpri01OY0l-TmCm725TmjKRHtcUhmTcIV40oNxhim2AtC_IIAupraXu3Q1eB60x6xyOpdnvQqaLtI8HLtIVDDcKi5AP7GOrr2AR0Mfy3Yv406UDNuiTpdKuEPgtAuI37RycE08SQwivHF5yYodVS6ij7Eps9pZbwdQHsnMm1IkTUKyw.YXyCSR0oKUaLRgwv1_lg5Q \ No newline at end of file diff --git a/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address b/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address new file mode 100644 index 00000000000..75a0ca5c86c --- /dev/null +++ b/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNzY3MDEgKzAyMDAgQ0VTVCBtPSswLjAyNTQ0MjUwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Im5rb2hCWjdsSTQ2dWZ2WFkifQ.BWwKhwUWEAwYJtLJbKD3rhRbcXyADd0zDSE2Kse0RjOgfZHZltGTDg.UIyjcX1YWZVTSG94.9MOoalqU08HLT1hxTAsgnOn3T6PHyOPX2d4Wibk-rXjdDj9iwa4blQ-84udnobX4vso0BiwFlp_ov8Z5vrJpcds0R6qIhoa0Ky9HXFvLDEe3zXENKCrKTpqQPMAixQBvVEtLCPqhqFbKDpYdupS_A8Lh5XF-TeqgWDdB2o5DZEkHNOo6dUD5qooB0v43uuAIPMyFZFYcAka0Fw3QH9PdxoP2sZo01a39Ly19sdevW8bq6HKgIj0.iidqA-GEM9mbMGbpTQRVOA \ No newline at end of file diff --git a/v9/keyring-test/alice.info b/v9/keyring-test/alice.info new file mode 100644 index 00000000000..94e762c7cf9 --- /dev/null +++ b/v9/keyring-test/alice.info @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNzUxMDEgKzAyMDAgQ0VTVCBtPSswLjAyMzg0MjE2OCIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6InNTRzFUOHBYektIa0V5SG4ifQ._Q0lm0CM4hsTmH268i2trW8HrE93T2p0R3p_KTXjazhS13J-S0WA8w.kqOCV4bW_tGj0f_s.kV1f8Zyodp7hgN5uq7n3Lf02ur1DMW-wZqikDwy1SDHpufNkYAs7T5hvcSBPnFymC9uzsFo1K9cQ9BgN6-J4Tub-HQv2aqOOBUaDRWF3oK42Ws07uzPgi2GB22w5Kcevf0Tm3WmhdUG6VSIisn1cfB2qDkXJSUHdL237BJqwYTrAeSzdnukW6rM5ZoKynKpkYXXBgASUjdh5YzDE6-voA_UGlvKfujsKkf6du1vd4ipVg9ynNmqESsSLR2hw1f_6RN2MENgtnvroZoAVYKmuVISKr1-BE04FAuAMU2PwXiZZEh64uSChse7fX7tamt3By34bMrM9ZeEAqww4qvN2B-l27Y02Etw0.Yh4LYAotYR14s7sse44MVQ \ No newline at end of file diff --git a/v9/keyring-test/bob.info b/v9/keyring-test/bob.info new file mode 100644 index 00000000000..8c89daf4c85 --- /dev/null +++ b/v9/keyring-test/bob.info @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yMDk3MzYgKzAyMDAgQ0VTVCBtPSswLjAyNTM4MTYyNiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ino2dmk5eUh1ZS0wNnRrOVoifQ.-b10yCzf0xrOoVRpXw6bMkLaK9VzazmdKTrumol-Wj1hf3TQj3p0Uw.r9ZHZkJzYRT4Ccy8.fS3OOWzQ5s2F0GvfPlCYmxwR6NyWMOFV7z77UfftkHrkn82viFD3Y2jZRcvGiFBHLfDpVO5pDx9lVPvfxczHuKCeIJ51h6mxHZfYpnoOfiUP484nGcACDSxSsy8l_jE2an9faGfZvA7Z48aAaa874sGJk3yCmbTu0JYU15RJAVK1TM22Y1rDdveBXZXq3FD0p3i5tZI-_nhhWKL_HooRMiA4vyhm2dnja1kFxyieU-Uqk4A5_OmY5lquHj06La1dKDKe6IhIz_ANytZm673zpsrRPX7vQEqL5_g2rFwQsgx8qT7t08L4U5cZT8P9U9mmv_vAwv3MIi4n5DdbJuF5Dgp5n-tEJw.hffRrQFLmHotfueXkqYEOg \ No newline at end of file diff --git a/v9/keyring-test/charlie.info b/v9/keyring-test/charlie.info new file mode 100644 index 00000000000..5123f836514 --- /dev/null +++ b/v9/keyring-test/charlie.info @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yNDI4OCArMDIwMCBDRVNUIG09KzAuMDIzODAwMDAxIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoibUlGMDdVTUF3ODlWZlBYbSJ9.6fMuygYYp0wPKWI9iVl4KF0ZSxOM0GvFqwkfygJ7nbA6agrG9sGh3w.hCDy8k50RvSzX0E1.dRnSnRESba_dqPddrXoHW8j7KjP2D0oXei4halhI-eOcCvGYnjO2XtZHT3I_HYl2SRl-0tybExtwgz5pfAfkaGxodehEGkBNCc9b19-b9BO1Lrpy1tRYEu1fzm2T2QZsrZbXJFL8pQBc5GxRb9ehHMoD-sjjHfAlkOIKb9UbRxmHh8S0yfhmJOorYEJ0qGyK4-iFgOvKBl_WLfey9aocLVQUuqj4TG400uiY006gBG7FgNlN5WWC5jBsNPrTAoeqOT-NCkHzEnJIE81TKxl0ZShzdNmIrQ3kVMb3hx3Q2okN4jN0W7awqA-nUELxP-v1C23MiJgMfFQwUTb-2OizyDfh7S8Vg2xaTs6Ryt8U.fWppIpT14mR3A4BZ4TvbzQ \ No newline at end of file diff --git a/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address b/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address new file mode 100644 index 00000000000..f476994b840 --- /dev/null +++ b/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4zMjI4ODYgKzAyMDAgQ0VTVCBtPSswLjAyNTU5OTEyNiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ilhrb3Eyd1VfT0Yyb3VNUnUifQ.qwr_-yh_NJ_sK1ThEsL7uJwBtbd9Q35M4qoW5FI4d9JVr02TASQVtg.MIYnIdhlquLg1-iG.g6mOHMXFiYqOkVYkooATOI7_k3e5LKF_MtMBUht2r1hw3QWuyOOOpj_bGVK4RMn5NtpuLEXVbtTNy8vCwlxZtC1IJMyw8WbNxr6-6Gl6BfGVCRFzoEtYBS1BlYX80xpJYjZlpIONzh1Efa8AaVubLcx8V2k_rNR535rWMmtDvUwaVJ0Fhcvjgwh_U1siORTGkS_qo7dZvxbIXxhAFXi6rEzLAu7o4_rZqzTVBhyqeVbFKg.FKmj04OTLushxmyuXc5erg \ No newline at end of file diff --git a/v9/keyring-test/rly0.info b/v9/keyring-test/rly0.info new file mode 100644 index 00000000000..c983754ca55 --- /dev/null +++ b/v9/keyring-test/rly0.info @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4zMjEzNzggKzAyMDAgQ0VTVCBtPSswLjAyNDA5MTI5MyIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6InhvNm5UR2s3Y2hoaW9aYmsifQ.j7GX6Tn3ic0M43pkmszIdglyUDIQ0UGlrUAM-cUYXzOOpTpSBnDzDg.5ZuD6OAB6a88oFiN.wq7mht_11W4dxe-G53X3wDVdPH1WWnTZSKJe-S57HWPGFl3VUic0PlsGshccnkYCkYiAFNWnxz1ZO4fTuchyV7gRoa8c1gAgYTGrfxr4i6KzHhh3m0KkgRjSD2Ku9d9xAxWgbH2XYOzG0Ge3pu6kNK2nIR_G2jQmL1M4h2GmYpnY15Ca_sMTTe4EPt4L1brMWPrfHdXIea-yooUn9OBzIa2fpzSNRCcx7Wz-bPwn3hh1psXqp-dQ81aVn7Pn-zMXzDqZNJE75GpV9-zRTQs4O_GnFRjGlTgh2Clo3AAgjhSxYJ56rmLyP9_iSWSVWbJ1tcH_6mficSAFf7zBgEynzx4MFtdnV1o.PyeSnbpPNr8aJM1hoiGvXg \ No newline at end of file diff --git a/v9/keyring-test/val1.info b/v9/keyring-test/val1.info new file mode 100644 index 00000000000..e5dcc9aab39 --- /dev/null +++ b/v9/keyring-test/val1.info @@ -0,0 +1 @@ +eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNDIxNTIgKzAyMDAgQ0VTVCBtPSswLjAyNDI2NTQxOCIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjY0MW9Qa1g3c2JrVnJuNU8ifQ.H50NzXw26ghK2BUXkYLvGx4Hgif7hxbHC8P_qtQThJVlZ1l_aSmt_g.sO-GG5cEOPldlDtL.En9GQHdamnFL7HQOXI0cMsWZKyXDp1AzuN0W8PUaiF0zeaiWLgntJvT6-WL9O3lacbrlcApvT27K3uQcNJxJf3_KVZfk9k5HRD4aMxA--LpxcUYQSETFIRIhr9UcZYx6xl0rFr6zJsPWwB39OCqKxPId3H4XbghyiMtjNLiPYoMuUkV9xQpawns_iO1gw91_KneKIHAMV7S07gNifrNliznsxz04U3sVDElJ73onivyAwverFOiLxQ4ZYfc5wF64D8bm0FDNfZ3Pj9OQWwcn3CeDan1Nvi50y6rU7fkOxP7dp7RJYajMiBFHNNVN0plLYHCny8vF-3Yd5lw0D3M5rQ8lplmSk0U.mV6Ea3eKwG8E0I7zXkjCyQ \ No newline at end of file From 567b74f9f085e41711e9c976bcde7f3764667e28 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Thu, 27 Apr 2023 18:11:40 +0200 Subject: [PATCH 07/34] print global fee --- e2e.Dockerfile | 9 +++++---- tests/e2e/e2e_vesting_test.go | 5 ++--- x/globalfee/ante/fee.go | 7 +++++++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/e2e.Dockerfile b/e2e.Dockerfile index 9dd74f65c7d..46ddc2e36b5 100644 --- a/e2e.Dockerfile +++ b/e2e.Dockerfile @@ -1,4 +1,4 @@ -ARG IMG_TAG=latest +ARG IMG_TAG=latest-glibc # Compile the gaiad binary FROM golang:1.20-alpine AS gaiad-builder @@ -11,10 +11,11 @@ RUN apk add --no-cache $PACKAGES RUN CGO_ENABLED=0 make install # Add to a distroless container -FROM cgr.dev/chainguard/static:$IMG_TAG -ARG IMG_TAG +FROM alpine:3 +RUN adduser -D nonroot COPY --from=gaiad-builder /go/bin/gaiad /usr/local/bin/ EXPOSE 26656 26657 1317 9090 -USER "nonroot" +USER nonroot + ENTRYPOINT ["gaiad", "start"] diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index 9fd598e9e39..c0d2d3c235a 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -8,6 +8,7 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/gaia/v9/x/globalfee/ante" ) @@ -35,7 +36,7 @@ type ( var ( genesisVestingKeys = []string{continuousVestingKey, delayedVestingKey, lockedVestingKey, periodicVestingKey} vestingAmountVested = sdk.NewCoin(uatomDenom, sdk.NewInt(99900000000)) - vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(350000)) + vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(35000000000)) vestingBalance = sdk.NewCoins(vestingAmountVested).Add(vestingAmount) vestingDelegationAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(500000000)) vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(10)) @@ -87,8 +88,6 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { 20*time.Second, 5*time.Second, ) - 59755500uatom - 99900350000uatom waitTime := acc.EndTime - time.Now().Unix() if waitTime > vestingTxDelay { diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index badc639ed45..a93acd2a6f0 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -2,6 +2,7 @@ package ante import ( "errors" + "fmt" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -67,6 +68,9 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne gas := feeTx.GetGas() msgs := feeTx.GetMsgs() + ctx.Logger().Info(fmt.Sprintf("tx received: %#+v", msgs)) + ctx.Logger().Info(fmt.Sprintf("gas: %v fee: %v", gas, feeCoins)) + // Get the required fees according the Check or Deliver Tx mode feeRequired, err := mfd.GetTxFeeRequired(ctx, feeTx) if err != nil { @@ -121,6 +125,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // if nonZeroCoinFeesReq=[], return false (this situation should not happen // because when nonZeroCoinFeesReq empty, and DenomsSubsetOf check passed, // the tx should already passed before) + ctx.Logger().Info(fmt.Sprintf("%#+v is GT than %#+v", feeCoinsNonZeroDenom.String(), nonZeroCoinFeesReq.String())) if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins, feeRequired) } @@ -183,7 +188,9 @@ func (mfd FeeDecorator) GetGlobalFee(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coin glDec := sdk.NewDec(int64(feeTx.GetGas())) for i, gp := range globalMinGasPrices { fee := gp.Amount.Mul(glDec) + ctx.Logger().Info(fmt.Sprintf("Computing Global Fee min x gas %v x %v", gp.Amount, glDec)) requiredGlobalFees[i] = sdk.NewCoin(gp.Denom, fee.Ceil().RoundInt()) + ctx.Logger().Info(fmt.Sprintf("Equal %v", requiredGlobalFees[i].String())) } return requiredGlobalFees.Sort(), nil From cddadafa3dfa39b0173bb7aae12cf568ea83e478 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 09:14:22 +0200 Subject: [PATCH 08/34] lower fees in e2e tests --- tests/e2e/e2e_exec_test.go | 2 +- tests/e2e/e2e_staking_test.go | 2 +- tests/e2e/e2e_test.go | 22 +++++++++++----------- tests/e2e/e2e_vesting_test.go | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/e2e/e2e_exec_test.go b/tests/e2e/e2e_exec_test.go index e42ec4ae4d2..505fe7d0533 100644 --- a/tests/e2e/e2e_exec_test.go +++ b/tests/e2e/e2e_exec_test.go @@ -440,7 +440,7 @@ func (s *IntegrationTestSuite) executeDelegate(c *chain, valIdx int, amount, val fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagGasPrices, "300uatom"), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, delegateFees), "--keyring-backend=test", fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), fmt.Sprintf("--%s=%s", flags.FlagHome, home), diff --git a/tests/e2e/e2e_staking_test.go b/tests/e2e/e2e_staking_test.go index 8b144d3b8fa..28828ea1820 100644 --- a/tests/e2e/e2e_staking_test.go +++ b/tests/e2e/e2e_staking_test.go @@ -20,7 +20,7 @@ func (s *IntegrationTestSuite) testStaking() { delegatorAddress := s.chainA.genesisAccounts[2].keyInfo.GetAddress().String() - fees := sdk.NewCoin(uatomDenom, sdk.NewInt(10)) + fees := sdk.NewCoin(uatomDenom, sdk.NewInt(1)) delegationAmount := sdk.NewInt(500000000) delegation := sdk.NewCoin(uatomDenom, delegationAmount) // 500 atom diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index e115c38a7f6..f272d72434c 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -5,18 +5,18 @@ import ( ) var ( - runBankTest = false - runBypassMinFeeTest = false - runEncodeTest = false - runEvidenceTest = false - runFeeGrantTest = false - runGlobalFeesTest = false - runGovTest = false - runIBCTest = false - runSlashingTest = false - runStakingAndDistributionTest = false + runBankTest = true + runBypassMinFeeTest = true + runEncodeTest = true + runEvidenceTest = true + runFeeGrantTest = true + runGlobalFeesTest = true + runGovTest = true + runIBCTest = true + runSlashingTest = true + runStakingAndDistributionTest = true runVestingTest = true - runRestInterfacesTest = false + runRestInterfacesTest = true ) func (s *IntegrationTestSuite) TestRestInterfaces() { diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index c0d2d3c235a..b1d69aa7120 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -36,10 +36,10 @@ type ( var ( genesisVestingKeys = []string{continuousVestingKey, delayedVestingKey, lockedVestingKey, periodicVestingKey} vestingAmountVested = sdk.NewCoin(uatomDenom, sdk.NewInt(99900000000)) - vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(35000000000)) + vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(350000)) vestingBalance = sdk.NewCoins(vestingAmountVested).Add(vestingAmount) vestingDelegationAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(500000000)) - vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(10)) + vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(1)) ) func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { From 79cf97e37c2c40af659bf6308dc211837055ce1c Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 09:54:35 +0200 Subject: [PATCH 09/34] fix e2e test tx flags --- tests/e2e/e2e_exec_test.go | 6 +++--- tests/e2e/e2e_staking_test.go | 2 +- tests/e2e/e2e_vesting_test.go | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/e2e/e2e_exec_test.go b/tests/e2e/e2e_exec_test.go index 505fe7d0533..1aba8af677e 100644 --- a/tests/e2e/e2e_exec_test.go +++ b/tests/e2e/e2e_exec_test.go @@ -440,7 +440,7 @@ func (s *IntegrationTestSuite) executeDelegate(c *chain, valIdx int, amount, val fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagGasPrices, delegateFees), + fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), "--keyring-backend=test", fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), fmt.Sprintf("--%s=%s", flags.FlagHome, home), @@ -471,7 +471,7 @@ func (s *IntegrationTestSuite) executeRedelegate(c *chain, valIdx int, amount, o fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagGasPrices, "300uatom"), + fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), "--keyring-backend=test", fmt.Sprintf("--%s=%s", flags.FlagHome, home), @@ -540,7 +540,7 @@ func (s *IntegrationTestSuite) execSetWithdrawAddress( "set-withdraw-addr", newWithdrawalAddress, fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddress), - fmt.Sprintf("--%s=%s", flags.FlagGasPrices, fees), + fmt.Sprintf("--%s=%s", flags.FlagFees, fees), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), fmt.Sprintf("--%s=%s", flags.FlagHome, homePath), "--keyring-backend=test", diff --git a/tests/e2e/e2e_staking_test.go b/tests/e2e/e2e_staking_test.go index 28828ea1820..8b144d3b8fa 100644 --- a/tests/e2e/e2e_staking_test.go +++ b/tests/e2e/e2e_staking_test.go @@ -20,7 +20,7 @@ func (s *IntegrationTestSuite) testStaking() { delegatorAddress := s.chainA.genesisAccounts[2].keyInfo.GetAddress().String() - fees := sdk.NewCoin(uatomDenom, sdk.NewInt(1)) + fees := sdk.NewCoin(uatomDenom, sdk.NewInt(10)) delegationAmount := sdk.NewInt(500000000) delegation := sdk.NewCoin(uatomDenom, delegationAmount) // 500 atom diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index b1d69aa7120..4f1d4f505d1 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -39,7 +39,7 @@ var ( vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(350000)) vestingBalance = sdk.NewCoins(vestingAmountVested).Add(vestingAmount) vestingDelegationAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(500000000)) - vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(1)) + vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(10)) ) func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { @@ -109,6 +109,7 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { // Transfer coins should succeed balance, err = getSpecificBalance(api, vestingDelayedAcc.String(), uatomDenom) + s.T().Log(balance.String()) s.Require().NoError(err) s.execBankSend( chain, From 0bade2ca6619eb24bddef2e131575e024733a331 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 10:30:35 +0200 Subject: [PATCH 10/34] remove debug logs --- e2e.Dockerfile | 7 +- tests/e2e/e2e_exec_test.go | 2 - tests/e2e/e2e_staking_test.go | 22 - tests/e2e/e2e_vesting_test.go | 11 - v9/config/addrbook.json | 4 - v9/config/app.toml | 238 --------- v9/config/client.toml | 17 - v9/config/config.toml | 471 ----------------- v9/config/genesis.json | 500 ------------------ ...f46580e0e745493e704ce155b2fd11b18e49d.json | 1 - v9/config/node_key.json | 1 - v9/config/priv_validator_key.json | 11 - v9/data/application.db/CURRENT | 1 - v9/data/application.db/LOCK | 0 v9/data/application.db/LOG | 6 - v9/data/application.db/MANIFEST-000000 | Bin 54 -> 0 bytes v9/data/blockstore.db/CURRENT | 1 - v9/data/blockstore.db/LOCK | 0 v9/data/blockstore.db/LOG | 8 - v9/data/blockstore.db/MANIFEST-000000 | Bin 54 -> 0 bytes v9/data/cs.wal/wal | Bin 180893 -> 0 bytes v9/data/evidence.db/CURRENT | 1 - v9/data/evidence.db/LOCK | 0 v9/data/evidence.db/LOG | 6 - v9/data/evidence.db/MANIFEST-000000 | Bin 54 -> 0 bytes v9/data/priv_validator_state.json | 7 - v9/data/snapshots/metadata.db/CURRENT | 1 - v9/data/snapshots/metadata.db/LOCK | 0 v9/data/snapshots/metadata.db/LOG | 6 - v9/data/snapshots/metadata.db/MANIFEST-000000 | Bin 54 -> 0 bytes v9/data/state.db/CURRENT | 1 - v9/data/state.db/LOCK | 0 v9/data/state.db/LOG | 8 - v9/data/state.db/MANIFEST-000000 | Bin 54 -> 0 bytes v9/data/tx_index.db/CURRENT | 1 - v9/data/tx_index.db/LOCK | 0 v9/data/tx_index.db/LOG | 6 - v9/data/tx_index.db/MANIFEST-000000 | Bin 54 -> 0 bytes ...97567a853c6e43917271b22058e07519cd.address | 1 - ...3e8765a2cdddd084efbc1f878c8a9f09aa.address | 1 - ...0bc2822ccd272a242fdca50cfefb88736a.address | 1 - ...37968ad958f980745aab8e721456578133.address | 1 - v9/keyring-test/alice.info | 1 - v9/keyring-test/bob.info | 1 - v9/keyring-test/charlie.info | 1 - ...a6524043feda8e01e2773c8d29d4815889.address | 1 - v9/keyring-test/rly0.info | 1 - v9/keyring-test/val1.info | 1 - x/globalfee/ante/fee.go | 10 +- 49 files changed, 7 insertions(+), 1351 deletions(-) delete mode 100644 v9/config/addrbook.json delete mode 100644 v9/config/app.toml delete mode 100644 v9/config/client.toml delete mode 100644 v9/config/config.toml delete mode 100644 v9/config/genesis.json delete mode 100644 v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json delete mode 100644 v9/config/node_key.json delete mode 100644 v9/config/priv_validator_key.json delete mode 100644 v9/data/application.db/CURRENT delete mode 100644 v9/data/application.db/LOCK delete mode 100644 v9/data/application.db/LOG delete mode 100644 v9/data/application.db/MANIFEST-000000 delete mode 100644 v9/data/blockstore.db/CURRENT delete mode 100644 v9/data/blockstore.db/LOCK delete mode 100644 v9/data/blockstore.db/LOG delete mode 100644 v9/data/blockstore.db/MANIFEST-000000 delete mode 100644 v9/data/cs.wal/wal delete mode 100644 v9/data/evidence.db/CURRENT delete mode 100644 v9/data/evidence.db/LOCK delete mode 100644 v9/data/evidence.db/LOG delete mode 100644 v9/data/evidence.db/MANIFEST-000000 delete mode 100644 v9/data/priv_validator_state.json delete mode 100644 v9/data/snapshots/metadata.db/CURRENT delete mode 100644 v9/data/snapshots/metadata.db/LOCK delete mode 100644 v9/data/snapshots/metadata.db/LOG delete mode 100644 v9/data/snapshots/metadata.db/MANIFEST-000000 delete mode 100644 v9/data/state.db/CURRENT delete mode 100644 v9/data/state.db/LOCK delete mode 100644 v9/data/state.db/LOG delete mode 100644 v9/data/state.db/MANIFEST-000000 delete mode 100644 v9/data/tx_index.db/CURRENT delete mode 100644 v9/data/tx_index.db/LOCK delete mode 100644 v9/data/tx_index.db/LOG delete mode 100644 v9/data/tx_index.db/MANIFEST-000000 delete mode 100644 v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address delete mode 100644 v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address delete mode 100644 v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address delete mode 100644 v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address delete mode 100644 v9/keyring-test/alice.info delete mode 100644 v9/keyring-test/bob.info delete mode 100644 v9/keyring-test/charlie.info delete mode 100644 v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address delete mode 100644 v9/keyring-test/rly0.info delete mode 100644 v9/keyring-test/val1.info diff --git a/e2e.Dockerfile b/e2e.Dockerfile index 46ddc2e36b5..d6facae2f8e 100644 --- a/e2e.Dockerfile +++ b/e2e.Dockerfile @@ -1,4 +1,4 @@ -ARG IMG_TAG=latest-glibc +ARG IMG_TAG=latest # Compile the gaiad binary FROM golang:1.20-alpine AS gaiad-builder @@ -11,11 +11,10 @@ RUN apk add --no-cache $PACKAGES RUN CGO_ENABLED=0 make install # Add to a distroless container -FROM alpine:3 -RUN adduser -D nonroot +FROM cgr.dev/chainguard/static:$IMG_TAG +ARG IMG_TAG COPY --from=gaiad-builder /go/bin/gaiad /usr/local/bin/ EXPOSE 26656 26657 1317 9090 USER nonroot - ENTRYPOINT ["gaiad", "start"] diff --git a/tests/e2e/e2e_exec_test.go b/tests/e2e/e2e_exec_test.go index 1aba8af677e..32f6c933e24 100644 --- a/tests/e2e/e2e_exec_test.go +++ b/tests/e2e/e2e_exec_test.go @@ -601,7 +601,6 @@ func (s *IntegrationTestSuite) executeGaiaTxCommand(ctx context.Context, c *chai Cmd: gaiaCommand, }) s.Require().NoError(err) - fmt.Println(gaiaCommand) err = s.dkrPool.Client.StartExec(exec.ID, docker.StartExecOptions{ Context: ctx, @@ -613,7 +612,6 @@ func (s *IntegrationTestSuite) executeGaiaTxCommand(ctx context.Context, c *chai stdOut := outBuf.Bytes() stdErr := errBuf.Bytes() - fmt.Println(string(stdOut), string(stdErr)) if !validation(stdOut, stdErr) { s.Require().FailNowf("Exec validation failed", "stdout: %s, stderr: %s", diff --git a/tests/e2e/e2e_staking_test.go b/tests/e2e/e2e_staking_test.go index 8b144d3b8fa..592d4e23d43 100644 --- a/tests/e2e/e2e_staking_test.go +++ b/tests/e2e/e2e_staking_test.go @@ -25,17 +25,6 @@ func (s *IntegrationTestSuite) testStaking() { delegationAmount := sdk.NewInt(500000000) delegation := sdk.NewCoin(uatomDenom, delegationAmount) // 500 atom - s.Require().Eventually( - func() bool { - balances, err := queryGaiaAllBalances(chainEndpoint, delegatorAddress) - s.Require().NoError(err) - s.T().Log(balances.String()) - return balances.Len() != 0 - }, - time.Minute, - 5*time.Second, - ) - // Alice delegate uatom to Validator A s.executeDelegate(s.chainA, 0, delegation.String(), validatorAddressA, delegatorAddress, gaiaHomePath, fees.String()) @@ -52,17 +41,6 @@ func (s *IntegrationTestSuite) testStaking() { 5*time.Second, ) - s.Require().Eventually( - func() bool { - balances, err := queryGaiaAllBalances(chainEndpoint, delegatorAddress) - s.Require().NoError(err) - s.T().Log(balances.String()) - return balances.Len() != 0 - }, - time.Minute, - 5*time.Second, - ) - // Alice re-delegate uatom from Validator A to Validator B s.executeRedelegate(s.chainA, 0, delegation.String(), validatorAddressA, validatorAddressB, delegatorAddress, gaiaHomePath, fees.String()) diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index 4f1d4f505d1..fe9984edf08 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -61,17 +61,6 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { s.Require().NoError(err) s.Require().Equal(vestingBalance.AmountOf(uatomDenom), balance.Amount) - s.Require().Eventually( - func() bool { - balances, err := queryGaiaAllBalances(api, vestingDelayedAcc.String()) - s.Require().NoError(err) - s.T().Log(balances.String()) - return balances.Len() != 0 - }, - time.Minute, - 20*time.Second, - ) - // Delegate coins should succeed s.executeDelegate(chain, valIdx, vestingDelegationAmount.String(), valOpAddr, vestingDelayedAcc.String(), gaiaHomePath, vestingDelegationFees.String()) diff --git a/v9/config/addrbook.json b/v9/config/addrbook.json deleted file mode 100644 index 1e332c31f40..00000000000 --- a/v9/config/addrbook.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "key": "5444e668e5802cbf78bcb12d", - "addrs": [] -} \ No newline at end of file diff --git a/v9/config/app.toml b/v9/config/app.toml deleted file mode 100644 index 12f31456787..00000000000 --- a/v9/config/app.toml +++ /dev/null @@ -1,238 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -############################################################################### -### Custom Gaia Configuration ### -############################################################################### -# bypass-min-fee-msg-types defines custom message types the operator may set that -# will bypass minimum fee checks during CheckTx. -# NOTE: -# bypass-min-fee-msg-types = [] will deactivate the bypass - no messages will be allowed to bypass the minimum fee check -# bypass-min-fee-msg-types = [...] will allow messages of specified type to bypass the minimum fee check -# removing bypass-min-fee-msg-types from the config file will apply the default values: -# ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient"] -# -# Example: -# bypass-min-fee-msg-types = ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient"] -bypass-min-fee-msg-types = ["/ibc.core.channel.v1.MsgRecvPacket", "/ibc.core.channel.v1.MsgAcknowledgement", "/ibc.core.client.v1.MsgUpdateClient", "/ibc.core.channel.v1.MsgTimeout", "/ibc.core.channel.v1.MsgTimeoutOnClose", ] - -############################################################################### -### Base Configuration ### -############################################################################### - -# 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.25token1;0.0001token2). -minimum-gas-prices = "" - -# default: the last 100 states are kept in addition to every 500th state; pruning at 10 block intervals -# nothing: all historic states will be saved, nothing will be deleted (i.e. archiving node) -# everything: all saved states will be deleted, storing only the current and previous state; pruning at 10 block intervals -# custom: allow pruning options to be manually specified through 'pruning-keep-recent', 'pruning-keep-every', and 'pruning-interval' -pruning = "default" - -# These are applied if and only if the pruning strategy is custom. -pruning-keep-recent = "0" -pruning-keep-every = "0" -pruning-interval = "0" - -# HaltHeight contains a non-zero block height at which a node will gracefully -# halt and shutdown that can be used to assist upgrades and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-height = 0 - -# HaltTime contains a non-zero minimum block time (in Unix seconds) at which -# a node will gracefully halt and shutdown that can be used to assist upgrades -# and testing. -# -# Note: Commitment of state will be attempted on the corresponding block. -halt-time = 0 - -# MinRetainBlocks defines the minimum block height offset from the current -# block being committed, such that all blocks past this offset are pruned -# from Tendermint. It is used as part of the process of determining the -# ResponseCommit.RetainHeight value during ABCI Commit. A value of 0 indicates -# that no blocks should be pruned. -# -# This configuration value is only responsible for pruning Tendermint blocks. -# It has no bearing on application state pruning which is determined by the -# "pruning-*" configurations. -# -# Note: Tendermint block pruning is dependant on this parameter in conunction -# with the unbonding (safety threshold) period, state pruning and state sync -# snapshot parameters to determine the correct minimum value of -# ResponseCommit.RetainHeight. -min-retain-blocks = 0 - -# InterBlockCache enables inter-block caching. -inter-block-cache = true - -# IndexEvents defines the set of events in the form {eventType}.{attributeKey}, -# which informs Tendermint what to index. If empty, all events will be indexed. -# -# Example: -# ["message.sender", "message.recipient"] -index-events = [] - -# IavlCacheSize set the size of the iavl tree cache. -# Default cache size is 50mb. -iavl-cache-size = 781250 - -# IAVLDisableFastNode enables or disables the fast node feature of IAVL. -# Default is true. -iavl-disable-fastnode = true - -############################################################################### -### Telemetry Configuration ### -############################################################################### - -[telemetry] - -# Prefixed with keys to separate services. -service-name = "" - -# Enabled enables the application telemetry functionality. When enabled, -# an in-memory sink is also enabled by default. Operators may also enabled -# other sinks such as Prometheus. -enabled = false - -# Enable prefixing gauge values with hostname. -enable-hostname = false - -# Enable adding hostname to labels. -enable-hostname-label = false - -# Enable adding service to labels. -enable-service-label = false - -# PrometheusRetentionTime, when positive, enables a Prometheus metrics sink. -prometheus-retention-time = 0 - -# GlobalLabels defines a global set of name/value label tuples applied to all -# metrics emitted using the wrapper functions defined in telemetry package. -# -# Example: -# [["chain_id", "cosmoshub-1"]] -global-labels = [ -] - -############################################################################### -### API Configuration ### -############################################################################### - -[api] - -# Enable defines if the API server should be enabled. -enable = false - -# Swagger defines if swagger documentation should automatically be registered. -swagger = false - -# Address defines the API server to listen on. -address = "tcp://0.0.0.0:1317" - -# MaxOpenConnections defines the number of maximum open connections. -max-open-connections = 1000 - -# RPCReadTimeout defines the Tendermint RPC read timeout (in seconds). -rpc-read-timeout = 10 - -# RPCWriteTimeout defines the Tendermint RPC write timeout (in seconds). -rpc-write-timeout = 0 - -# RPCMaxBodyBytes defines the Tendermint maximum response body (in bytes). -rpc-max-body-bytes = 1000000 - -# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). -enabled-unsafe-cors = false - -############################################################################### -### Rosetta Configuration ### -############################################################################### - -[rosetta] - -# Enable defines if the Rosetta API server should be enabled. -enable = false - -# Address defines the Rosetta API server to listen on. -address = ":8080" - -# Network defines the name of the blockchain that will be returned by Rosetta. -blockchain = "app" - -# Network defines the name of the network that will be returned by Rosetta. -network = "network" - -# Retries defines the number of retries when connecting to the node before failing. -retries = 3 - -# Offline defines if Rosetta server should run in offline mode. -offline = false - -############################################################################### -### gRPC Configuration ### -############################################################################### - -[grpc] - -# Enable defines if the gRPC server should be enabled. -enable = true - -# Address defines the gRPC server address to bind to. -address = "0.0.0.0:9090" - -############################################################################### -### gRPC Web Configuration ### -############################################################################### - -[grpc-web] - -# GRPCWebEnable defines if the gRPC-web should be enabled. -# NOTE: gRPC must also be enabled, otherwise, this configuration is a no-op. -enable = true - -# Address defines the gRPC-web server address to bind to. -address = "0.0.0.0:9091" - -# EnableUnsafeCORS defines if CORS should be enabled (unsafe - use it at your own risk). -enable-unsafe-cors = false - -############################################################################### -### State Sync Configuration ### -############################################################################### - -# State sync snapshots allow other nodes to rapidly join the network without replaying historical -# blocks, instead downloading and applying a snapshot of the application state at a given height. -[state-sync] - -# snapshot-interval specifies the block interval at which local state sync snapshots are -# taken (0 to disable). Must be a multiple of pruning-keep-every. -snapshot-interval = 1000 - -# snapshot-keep-recent specifies the number of recent snapshots to keep and serve (0 to keep all). -snapshot-keep-recent = 10 - -############################################################################### -### Store / State Streaming ### -############################################################################### - -[store] -streamers = [] - -[streamers] -[streamers.file] -keys = ["*", ] -write_dir = "" -prefix = "" - -# output-metadata specifies if output the metadata file which includes the abci request/responses -# during processing the block. -output-metadata = "true" - -# stop-node-on-error specifies if propagate the file streamer errors to consensus state machine. -stop-node-on-error = "true" - -# fsync specifies if call fsync after writing the files. -fsync = "false" diff --git a/v9/config/client.toml b/v9/config/client.toml deleted file mode 100644 index e1e4d146b09..00000000000 --- a/v9/config/client.toml +++ /dev/null @@ -1,17 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -############################################################################### -### Client Configuration ### -############################################################################### - -# The network chain ID -chain-id = "test" -# The keyring's backend, where the keys are stored (os|file|kwallet|pass|test|memory) -keyring-backend = "test" -# CLI output format (text|json) -output = "text" -# : to Tendermint RPC interface for this chain -node = "tcp://localhost:" -# Transaction broadcasting mode (sync|async|block) -broadcast-mode = "block" diff --git a/v9/config/config.toml b/v9/config/config.toml deleted file mode 100644 index eb1a5d28f52..00000000000 --- a/v9/config/config.toml +++ /dev/null @@ -1,471 +0,0 @@ -# This is a TOML config file. -# For more information, see https://github.com/toml-lang/toml - -# NOTE: Any path below can be absolute (e.g. "/var/myawesomeapp/data") or -# relative to the home directory (e.g. "data"). The home directory is -# "$HOME/.cometbft" by default, but could be changed via $CMTHOME env variable -# or --home cmd flag. - -####################################################################### -### Main Base Config Options ### -####################################################################### - -# TCP or UNIX socket address of the ABCI application, -# or the name of an ABCI application compiled in with the CometBFT binary -proxy_app = "tcp://127.0.0.1:26658" - -# A custom human readable name for this node -moniker = "mynode0" - -# If this node is many blocks behind the tip of the chain, FastSync -# allows them to catchup quickly by downloading blocks in parallel -# and verifying their commits -fast_sync = true - -# Database backend: goleveldb | cleveldb | boltdb | rocksdb | badgerdb -# * goleveldb (github.com/syndtr/goleveldb - most popular implementation) -# - pure go -# - stable -# * cleveldb (uses levigo wrapper) -# - fast -# - requires gcc -# - use cleveldb build tag (go build -tags cleveldb) -# * boltdb (uses etcd's fork of bolt - github.com/etcd-io/bbolt) -# - EXPERIMENTAL -# - may be faster is some use-cases (random reads - indexer) -# - use boltdb build tag (go build -tags boltdb) -# * rocksdb (uses github.com/tecbot/gorocksdb) -# - EXPERIMENTAL -# - requires gcc -# - use rocksdb build tag (go build -tags rocksdb) -# * badgerdb (uses github.com/dgraph-io/badger) -# - EXPERIMENTAL -# - use badgerdb build tag (go build -tags badgerdb) -db_backend = "goleveldb" - -# Database directory -db_dir = "data" - -# Output level for logging, including package level options -log_level = "info" - -# Output format: 'plain' (colored text) or 'json' -log_format = "plain" - -##### additional base config options ##### - -# Path to the JSON file containing the initial validator set and other meta data -genesis_file = "config/genesis.json" - -# Path to the JSON file containing the private key to use as a validator in the consensus protocol -priv_validator_key_file = "config/priv_validator_key.json" - -# Path to the JSON file containing the last sign state of a validator -priv_validator_state_file = "data/priv_validator_state.json" - -# TCP or UNIX socket address for CometBFT to listen on for -# connections from an external PrivValidator process -priv_validator_laddr = "" - -# Path to the JSON file containing the private key to use for node authentication in the p2p protocol -node_key_file = "config/node_key.json" - -# Mechanism to connect to the ABCI application: socket | grpc -abci = "socket" - -# If true, query the ABCI app on connecting to a new peer -# so the app can decide if we should keep the connection or not -filter_peers = false - - -####################################################################### -### Advanced Configuration Options ### -####################################################################### - -####################################################### -### RPC Server Configuration Options ### -####################################################### -[rpc] - -# TCP or UNIX socket address for the RPC server to listen on -laddr = "tcp://127.0.0.1:26657" - -# A list of origins a cross-domain request can be executed from -# Default value '[]' disables cors support -# Use '["*"]' to allow any origin -cors_allowed_origins = [] - -# A list of methods the client is allowed to use with cross-domain requests -cors_allowed_methods = ["HEAD", "GET", "POST", ] - -# A list of non simple headers the client is allowed to use with cross-domain requests -cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time", ] - -# TCP or UNIX socket address for the gRPC server to listen on -# NOTE: This server only supports /broadcast_tx_commit -grpc_laddr = "" - -# Maximum number of simultaneous connections. -# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -grpc_max_open_connections = 900 - -# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool -unsafe = false - -# Maximum number of simultaneous connections (including WebSocket). -# Does not include gRPC connections. See grpc_max_open_connections -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files} -# 1024 - 40 - 10 - 50 = 924 = ~900 -max_open_connections = 900 - -# Maximum number of unique clientIDs that can /subscribe -# If you're using /broadcast_tx_commit, set to the estimated maximum number -# of broadcast_tx_commit calls per block. -max_subscription_clients = 100 - -# Maximum number of unique queries a given client can /subscribe to -# If you're using GRPC (or Local RPC client) and /broadcast_tx_commit, set to -# the estimated # maximum number of broadcast_tx_commit calls per block. -max_subscriptions_per_client = 5 - -# Experimental parameter to specify the maximum number of events a node will -# buffer, per subscription, before returning an error and closing the -# subscription. Must be set to at least 100, but higher values will accommodate -# higher event throughput rates (and will use more memory). -experimental_subscription_buffer_size = 200 - -# Experimental parameter to specify the maximum number of RPC responses that -# can be buffered per WebSocket client. If clients cannot read from the -# WebSocket endpoint fast enough, they will be disconnected, so increasing this -# parameter may reduce the chances of them being disconnected (but will cause -# the node to use more memory). -# -# Must be at least the same as "experimental_subscription_buffer_size", -# otherwise connections could be dropped unnecessarily. This value should -# ideally be somewhat higher than "experimental_subscription_buffer_size" to -# accommodate non-subscription-related RPC responses. -experimental_websocket_write_buffer_size = 200 - -# If a WebSocket client cannot read fast enough, at present we may -# silently drop events instead of generating an error or disconnecting the -# client. -# -# Enabling this experimental parameter will cause the WebSocket connection to -# be closed instead if it cannot read fast enough, allowing for greater -# predictability in subscription behaviour. -experimental_close_on_slow_client = false - -# How long to wait for a tx to be committed during /broadcast_tx_commit. -# WARNING: Using a value larger than 10s will result in increasing the -# global HTTP write timeout, which applies to all connections and endpoints. -# See https://github.com/tendermint/tendermint/issues/3435 -timeout_broadcast_tx_commit = "10s" - -# Maximum size of request body, in bytes -max_body_bytes = 1000000 - -# Maximum size of request header, in bytes -max_header_bytes = 1048576 - -# The path to a file containing certificate that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# If the certificate is signed by a certificate authority, -# the certFile should be the concatenation of the server's certificate, any intermediates, -# and the CA's certificate. -# NOTE: both tls_cert_file and tls_key_file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_cert_file = "" - -# The path to a file containing matching private key that is used to create the HTTPS server. -# Might be either absolute path or path related to CometBFT's config directory. -# NOTE: both tls-cert-file and tls-key-file must be present for CometBFT to create HTTPS server. -# Otherwise, HTTP server is run. -tls_key_file = "" - -# pprof listen address (https://golang.org/pkg/net/http/pprof) -pprof_laddr = "localhost:6060" - -####################################################### -### P2P Configuration Options ### -####################################################### -[p2p] - -# Address to listen for incoming connections -laddr = "tcp://0.0.0.0:26656" - -# Address to advertise to peers for them to dial -# If empty, will use the same port as the laddr, -# and will introspect on the listener or use UPnP -# to figure out the address. ip and port are required -# example: 159.89.10.97:26656 -external_address = "" - -# Comma separated list of seed nodes to connect to -seeds = "" - -# Comma separated list of nodes to keep persistent connections to -persistent_peers = "" - -# UPNP port forwarding -upnp = false - -# Path to address book -addr_book_file = "config/addrbook.json" - -# Set true for strict address routability rules -# Set false for private or local networks -addr_book_strict = true - -# Maximum number of inbound peers -max_num_inbound_peers = 40 - -# Maximum number of outbound peers to connect to, excluding persistent peers -max_num_outbound_peers = 10 - -# List of node IDs, to which a connection will be (re)established ignoring any existing limits -unconditional_peer_ids = "" - -# Maximum pause when redialing a persistent peer (if zero, exponential backoff is used) -persistent_peers_max_dial_period = "0s" - -# Time to wait before flushing messages out on the connection -flush_throttle_timeout = "100ms" - -# Maximum size of a message packet payload, in bytes -max_packet_msg_payload_size = 1024 - -# Rate at which packets can be sent, in bytes/second -send_rate = 5120000 - -# Rate at which packets can be received, in bytes/second -recv_rate = 5120000 - -# Set true to enable the peer-exchange reactor -pex = true - -# Seed mode, in which node constantly crawls the network and looks for -# peers. If another node asks it for addresses, it responds and disconnects. -# -# Does not work if the peer-exchange reactor is disabled. -seed_mode = false - -# Comma separated list of peer IDs to keep private (will not be gossiped to other peers) -private_peer_ids = "" - -# Toggle to disable guard against peers connecting from the same ip. -allow_duplicate_ip = false - -# Peer connection configuration. -handshake_timeout = "20s" -dial_timeout = "3s" - -####################################################### -### Mempool Configuration Option ### -####################################################### -[mempool] - -# Mempool version to use: -# 1) "v0" - (default) FIFO mempool. -# 2) "v1" - prioritized mempool. -version = "v0" - -# Recheck (default: true) defines whether CometBFT should recheck the -# validity for all remaining transaction in the mempool after a block. -# Since a block affects the application state, some transactions in the -# mempool may become invalid. If this does not apply to your application, -# you can disable rechecking. -recheck = true -broadcast = true -wal_dir = "" - -# Maximum number of transactions in the mempool -size = 5000 - -# Limit the total size of all txs in the mempool. -# This only accounts for raw transactions (e.g. given 1MB transactions and -# max_txs_bytes=5MB, mempool will only accept 5 transactions). -max_txs_bytes = 1073741824 - -# Size of the cache (used to filter transactions we saw earlier) in transactions -cache_size = 10000 - -# Do not remove invalid transactions from the cache (default: false) -# Set to true if it's not possible for any invalid transaction to become valid -# again in the future. -keep-invalid-txs-in-cache = false - -# Maximum size of a single transaction. -# NOTE: the max size of a tx transmitted over the network is {max_tx_bytes}. -max_tx_bytes = 1048576 - -# Maximum size of a batch of transactions to send to a peer -# Including space needed by encoding (one varint per transaction). -# XXX: Unused due to https://github.com/tendermint/tendermint/issues/5796 -max_batch_bytes = 0 - -# ttl-duration, if non-zero, defines the maximum amount of time a transaction -# can exist for in the mempool. -# -# Note, if ttl-num-blocks is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if it's -# insertion time into the mempool is beyond ttl-duration. -ttl-duration = "0s" - -# ttl-num-blocks, if non-zero, defines the maximum number of blocks a transaction -# can exist for in the mempool. -# -# Note, if ttl-duration is also defined, a transaction will be removed if it -# has existed in the mempool at least ttl-num-blocks number of blocks or if -# it's insertion time into the mempool is beyond ttl-duration. -ttl-num-blocks = 0 - -####################################################### -### State Sync Configuration Options ### -####################################################### -[statesync] -# State sync rapidly bootstraps a new node by discovering, fetching, and restoring a state machine -# snapshot from peers instead of fetching and replaying historical blocks. Requires some peers in -# the network to take and serve state machine snapshots. State sync is not attempted if the node -# has any local state (LastBlockHeight > 0). The node will have a truncated block history, -# starting from the height of the snapshot. -enable = false - -# RPC servers (comma-separated) for light client verification of the synced state machine and -# retrieval of state data for node bootstrapping. Also needs a trusted height and corresponding -# header hash obtained from a trusted source, and a period during which validators can be trusted. -# -# For Cosmos SDK-based chains, trust_period should usually be about 2/3 of the unbonding time (~2 -# weeks) during which they can be financially punished (slashed) for misbehavior. -rpc_servers = "" -trust_height = 0 -trust_hash = "" -trust_period = "168h0m0s" - -# Time to spend discovering snapshots before initiating a restore. -discovery_time = "15s" - -# Temporary directory for state sync snapshot chunks, defaults to the OS tempdir (typically /tmp). -# Will create a new, randomly named directory within, and remove it when done. -temp_dir = "" - -# The timeout duration before re-requesting a chunk, possibly from a different -# peer (default: 1 minute). -chunk_request_timeout = "10s" - -# The number of concurrent chunk fetchers to run (default: 1). -chunk_fetchers = "4" - -####################################################### -### Fast Sync Configuration Connections ### -####################################################### -[fastsync] - -# Fast Sync version to use: -# 1) "v0" (default) - the legacy fast sync implementation -# 2) "v1" - refactor of v0 version for better testability -# 2) "v2" - complete redesign of v0, optimized for testability & readability -version = "v0" - -####################################################### -### Consensus Configuration Options ### -####################################################### -[consensus] - -wal_file = "data/cs.wal/wal" - -# How long we wait for a proposal block before prevoting nil -timeout_propose = "3s" -# How much timeout_propose increases with each round -timeout_propose_delta = "500ms" -# How long we wait after receiving +2/3 prevotes for “anything” (ie. not a single block or nil) -timeout_prevote = "1s" -# How much the timeout_prevote increases with each round -timeout_prevote_delta = "500ms" -# How long we wait after receiving +2/3 precommits for “anything” (ie. not a single block or nil) -timeout_precommit = "1s" -# How much the timeout_precommit increases with each round -timeout_precommit_delta = "500ms" -# How long we wait after committing a block, before starting on the new -# height (this gives us a chance to receive some more precommits, even -# though we already have +2/3). -timeout_commit = "5s" - -# How many blocks to look back to check existence of the node's consensus votes before joining consensus -# When non-zero, the node will panic upon restart -# if the same consensus key was used to sign {double_sign_check_height} last blocks. -# So, validators should stop the state machine, wait for some blocks, and then restart the state machine to avoid panic. -double_sign_check_height = 0 - -# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0) -skip_timeout_commit = false - -# EmptyBlocks mode and possible interval between empty blocks -create_empty_blocks = true -create_empty_blocks_interval = "0s" - -# Reactor sleep duration parameters -peer_gossip_sleep_duration = "100ms" -peer_query_maj23_sleep_duration = "2s" - -####################################################### -### Storage Configuration Options ### -####################################################### -[storage] - -# Set to true to discard ABCI responses from the state store, which can save a -# considerable amount of disk space. Set to false to ensure ABCI responses are -# persisted. ABCI responses are required for /block_results RPC queries, and to -# reindex events in the command-line tool. -discard_abci_responses = false - -####################################################### -### Transaction Indexer Configuration Options ### -####################################################### -[tx_index] - -# What indexer to use for transactions -# -# The application will set which txs to index. In some cases a node operator will be able -# to decide which txs to index based on configuration set in the application. -# -# Options: -# 1) "null" -# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend). -# - When "kv" is chosen "tx.height" and "tx.hash" will always be indexed. -# 3) "psql" - the indexer services backed by PostgreSQL. -# When "kv" or "psql" is chosen "tx.height" and "tx.hash" will always be indexed. -indexer = "kv" - -# The PostgreSQL connection configuration, the connection format: -# postgresql://:@:/? -psql-conn = "" - -####################################################### -### Instrumentation Configuration Options ### -####################################################### -[instrumentation] - -# When true, Prometheus metrics are served under /metrics on -# PrometheusListenAddr. -# Check out the documentation for the list of available metrics. -prometheus = false - -# Address to listen for Prometheus collector(s) connections -prometheus_listen_addr = ":26660" - -# Maximum number of simultaneous connections. -# If you want to accept a larger number than the default, make sure -# you increase your OS limits. -# 0 - unlimited. -max_open_connections = 3 - -# Instrumentation namespace -namespace = "cometbft" diff --git a/v9/config/genesis.json b/v9/config/genesis.json deleted file mode 100644 index 83fb6d525ef..00000000000 --- a/v9/config/genesis.json +++ /dev/null @@ -1,500 +0,0 @@ -{ - "genesis_time": "2023-04-26T12:54:19.026291Z", - "chain_id": "test", - "initial_height": "1", - "consensus_params": { - "block": { - "max_bytes": "22020096", - "max_gas": "-1", - "time_iota_ms": "1000" - }, - "evidence": { - "max_age_num_blocks": "100000", - "max_age_duration": "172800000000000", - "max_bytes": "1048576" - }, - "validator": { - "pub_key_types": [ - "ed25519" - ] - }, - "version": {} - }, - "app_hash": "", - "app_state": { - "auth": { - "params": { - "max_memo_characters": "256", - "tx_sig_limit": "7", - "tx_size_cost_per_byte": "10", - "sig_verify_cost_ed25519": "590", - "sig_verify_cost_secp256k1": "1000" - }, - "accounts": [ - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1mjk79fjjgpplak5wq838w0yd982gzkyfrk07am", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1v9g4uduk3tv437vqw3d2hrnjz3t90qfndas2vn", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1tp3usz7zsgkv6fe2yshaefgvlmacsum227vka7", - "pub_key": null, - "account_number": "0", - "sequence": "0" - }, - { - "@type": "/cosmos.auth.v1beta1.BaseAccount", - "address": "cosmos1q8h9996k02zncmjrj9e8rv3qtrs82xwdhdtyda", - "pub_key": null, - "account_number": "0", - "sequence": "0" - } - ] - }, - "authz": { - "authorization": [] - }, - "bank": { - "params": { - "send_enabled": [], - "default_send_enabled": true - }, - "balances": [ - { - "address": "cosmos1q8h9996k02zncmjrj9e8rv3qtrs82xwdhdtyda", - "coins": [ - { - "denom": "stake", - "amount": "100000000000" - } - ] - }, - { - "address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", - "coins": [ - { - "denom": "photon", - "amount": "10000000000000000" - }, - { - "denom": "stake", - "amount": "10000000000000000" - } - ] - }, - { - "address": "cosmos1tp3usz7zsgkv6fe2yshaefgvlmacsum227vka7", - "coins": [ - { - "denom": "stake", - "amount": "100000000000" - } - ] - }, - { - "address": "cosmos1v9g4uduk3tv437vqw3d2hrnjz3t90qfndas2vn", - "coins": [ - { - "denom": "stake", - "amount": "100000000000" - } - ] - }, - { - "address": "cosmos1mjk79fjjgpplak5wq838w0yd982gzkyfrk07am", - "coins": [ - { - "denom": "stake", - "amount": "100000000000" - } - ] - } - ], - "supply": [ - { - "denom": "photon", - "amount": "10000000000000000" - }, - { - "denom": "stake", - "amount": "10000400000000000" - } - ], - "denom_metadata": [] - }, - "capability": { - "index": "1", - "owners": [] - }, - "crisis": { - "constant_fee": { - "denom": "stake", - "amount": "1000" - } - }, - "distribution": { - "params": { - "community_tax": "0.020000000000000000", - "base_proposer_reward": "0.010000000000000000", - "bonus_proposer_reward": "0.040000000000000000", - "withdraw_addr_enabled": true - }, - "fee_pool": { - "community_pool": [] - }, - "delegator_withdraw_infos": [], - "previous_proposer": "", - "outstanding_rewards": [], - "validator_accumulated_commissions": [], - "validator_historical_rewards": [], - "validator_current_rewards": [], - "delegator_starting_infos": [], - "validator_slash_events": [] - }, - "evidence": { - "evidence": [] - }, - "feegrant": { - "allowances": [] - }, - "genutil": { - "gen_txs": [ - { - "body": { - "messages": [ - { - "@type": "/cosmos.staking.v1beta1.MsgCreateValidator", - "description": { - "moniker": "mynode0", - "identity": "", - "website": "", - "security_contact": "", - "details": "" - }, - "commission": { - "rate": "0.100000000000000000", - "max_rate": "0.200000000000000000", - "max_change_rate": "0.010000000000000000" - }, - "min_self_delegation": "1", - "delegator_address": "cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy", - "validator_address": "cosmosvaloper1rcvw7058vk3vmhwssnhmc8u83j9f7zd2xwrvmh", - "pubkey": { - "@type": "/cosmos.crypto.ed25519.PubKey", - "key": "G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0=" - }, - "value": { - "denom": "stake", - "amount": "1000000000000" - } - } - ], - "memo": "9cef46580e0e745493e704ce155b2fd11b18e49d@192.168.1.72:26656", - "timeout_height": "0", - "extension_options": [], - "non_critical_extension_options": [] - }, - "auth_info": { - "signer_infos": [ - { - "public_key": { - "@type": "/cosmos.crypto.secp256k1.PubKey", - "key": "A7PWYbIo+kPW3E0TLj2UfJGaSW3Y2PZnvbDix2jKLbKU" - }, - "mode_info": { - "single": { - "mode": "SIGN_MODE_DIRECT" - } - }, - "sequence": "0" - } - ], - "fee": { - "amount": [], - "gas_limit": "200000", - "payer": "", - "granter": "" - } - }, - "signatures": [ - "kqAevPlLQIePJluUCUQuxklggrexKD6WxAFX8E61xypGKzlk4O927GhRicUD2f9zkpgJp9cUVpIBBTuH/JMawQ==" - ] - } - ] - }, - "globalfee": { - "params": { - "minimum_gas_prices": [] - } - }, - "gov": { - "starting_proposal_id": "1", - "deposits": [], - "votes": [], - "proposals": [], - "deposit_params": { - "min_deposit": [ - { - "denom": "stake", - "amount": "10000000" - } - ], - "max_deposit_period": "172800s" - }, - "voting_params": { - "voting_period": "172800s" - }, - "tally_params": { - "quorum": "0.334000000000000000", - "threshold": "0.500000000000000000", - "veto_threshold": "0.334000000000000000" - } - }, - "ibc": { - "client_genesis": { - "clients": [], - "clients_consensus": [], - "clients_metadata": [], - "params": { - "allowed_clients": [ - "06-solomachine", - "07-tendermint" - ] - }, - "create_localhost": false, - "next_client_sequence": "0" - }, - "connection_genesis": { - "connections": [], - "client_connection_paths": [], - "next_connection_sequence": "0", - "params": { - "max_expected_time_per_block": "30000000000" - } - }, - "channel_genesis": { - "channels": [], - "acknowledgements": [], - "commitments": [], - "receipts": [], - "send_sequences": [], - "recv_sequences": [], - "ack_sequences": [], - "next_channel_sequence": "0" - } - }, - "interchainaccounts": { - "controller_genesis_state": { - "active_channels": [], - "interchain_accounts": [], - "ports": [], - "params": { - "controller_enabled": true - } - }, - "host_genesis_state": { - "active_channels": [], - "interchain_accounts": [], - "port": "icahost", - "params": { - "host_enabled": true, - "allow_messages": [] - } - } - }, - "liquidity": { - "params": { - "pool_types": [ - { - "id": 1, - "name": "StandardLiquidityPool", - "min_reserve_coin_num": 2, - "max_reserve_coin_num": 2, - "description": "Standard liquidity pool with pool price function X/Y, ESPM constraint, and two kinds of reserve coins" - } - ], - "min_init_deposit_amount": "1000000", - "init_pool_coin_mint_amount": "1000000", - "max_reserve_coin_amount": "0", - "pool_creation_fee": [ - { - "denom": "stake", - "amount": "40000000" - } - ], - "swap_fee_rate": "0.003000000000000000", - "withdraw_fee_rate": "0.000000000000000000", - "max_order_amount_ratio": "0.100000000000000000", - "unit_batch_height": 1, - "circuit_breaker_enabled": false - }, - "pool_records": [] - }, - "mint": { - "minter": { - "inflation": "0.130000000000000000", - "annual_provisions": "0.000000000000000000" - }, - "params": { - "mint_denom": "stake", - "inflation_rate_change": "0.130000000000000000", - "inflation_max": "0.200000000000000000", - "inflation_min": "0.070000000000000000", - "goal_bonded": "0.670000000000000000", - "blocks_per_year": "6311520" - } - }, - "packetfowardmiddleware": { - "params": { - "fee_percentage": "0.000000000000000000" - }, - "in_flight_packets": {} - }, - "params": null, - "provider": { - "valset_update_id": "1", - "consumer_states": [], - "unbonding_ops": [], - "mature_unbonding_ops": null, - "valset_update_id_to_height": [], - "consumer_addition_proposals": [], - "consumer_removal_proposals": [], - "params": { - "template_client": { - "chain_id": "", - "trust_level": { - "numerator": "1", - "denominator": "3" - }, - "trusting_period": "0s", - "unbonding_period": "0s", - "max_clock_drift": "10s", - "frozen_height": { - "revision_number": "0", - "revision_height": "0" - }, - "latest_height": { - "revision_number": "0", - "revision_height": "0" - }, - "proof_specs": [ - { - "leaf_spec": { - "hash": "SHA256", - "prehash_key": "NO_HASH", - "prehash_value": "SHA256", - "length": "VAR_PROTO", - "prefix": "AA==" - }, - "inner_spec": { - "child_order": [ - 0, - 1 - ], - "child_size": 33, - "min_prefix_length": 4, - "max_prefix_length": 12, - "empty_child": null, - "hash": "SHA256" - }, - "max_depth": 0, - "min_depth": 0 - }, - { - "leaf_spec": { - "hash": "SHA256", - "prehash_key": "NO_HASH", - "prehash_value": "SHA256", - "length": "VAR_PROTO", - "prefix": "AA==" - }, - "inner_spec": { - "child_order": [ - 0, - 1 - ], - "child_size": 32, - "min_prefix_length": 1, - "max_prefix_length": 1, - "empty_child": null, - "hash": "SHA256" - }, - "max_depth": 0, - "min_depth": 0 - } - ], - "upgrade_path": [ - "upgrade", - "upgradedIBCState" - ], - "allow_update_after_expiry": true, - "allow_update_after_misbehaviour": true - }, - "trusting_period_fraction": "0.66", - "ccv_timeout_period": "2419200s", - "init_timeout_period": "604800s", - "vsc_timeout_period": "3024000s", - "slash_meter_replenish_period": "3600s", - "slash_meter_replenish_fraction": "0.05", - "max_throttled_packets": "100000" - }, - "validator_consumer_pubkeys": [], - "validators_by_consumer_addr": [], - "consumer_addrs_to_prune": [] - }, - "slashing": { - "params": { - "signed_blocks_window": "100", - "min_signed_per_window": "0.500000000000000000", - "downtime_jail_duration": "600s", - "slash_fraction_double_sign": "0.050000000000000000", - "slash_fraction_downtime": "0.010000000000000000" - }, - "signing_infos": [], - "missed_blocks": [] - }, - "staking": { - "params": { - "unbonding_time": "1814400s", - "max_validators": 100, - "max_entries": 7, - "historical_entries": 10000, - "bond_denom": "stake" - }, - "last_total_power": "0", - "last_validator_powers": [], - "validators": [], - "delegations": [], - "unbonding_delegations": [], - "redelegations": [], - "exported": false - }, - "transfer": { - "port_id": "transfer", - "denom_traces": [], - "params": { - "send_enabled": true, - "receive_enabled": true - } - }, - "upgrade": {}, - "vesting": {} - } -} \ No newline at end of file diff --git a/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json b/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json deleted file mode 100644 index 351e2dd951e..00000000000 --- a/v9/config/gentx/gentx-9cef46580e0e745493e704ce155b2fd11b18e49d.json +++ /dev/null @@ -1 +0,0 @@ -{"body":{"messages":[{"@type":"/cosmos.staking.v1beta1.MsgCreateValidator","description":{"moniker":"mynode0","identity":"","website":"","security_contact":"","details":""},"commission":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"min_self_delegation":"1","delegator_address":"cosmos1rcvw7058vk3vmhwssnhmc8u83j9f7zd2r6hehy","validator_address":"cosmosvaloper1rcvw7058vk3vmhwssnhmc8u83j9f7zd2xwrvmh","pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0="},"value":{"denom":"stake","amount":"1000000000000"}}],"memo":"9cef46580e0e745493e704ce155b2fd11b18e49d@192.168.1.72:26656","timeout_height":"0","extension_options":[],"non_critical_extension_options":[]},"auth_info":{"signer_infos":[{"public_key":{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A7PWYbIo+kPW3E0TLj2UfJGaSW3Y2PZnvbDix2jKLbKU"},"mode_info":{"single":{"mode":"SIGN_MODE_DIRECT"}},"sequence":"0"}],"fee":{"amount":[],"gas_limit":"200000","payer":"","granter":""}},"signatures":["kqAevPlLQIePJluUCUQuxklggrexKD6WxAFX8E61xypGKzlk4O927GhRicUD2f9zkpgJp9cUVpIBBTuH/JMawQ=="]} diff --git a/v9/config/node_key.json b/v9/config/node_key.json deleted file mode 100644 index cc38713ab69..00000000000 --- a/v9/config/node_key.json +++ /dev/null @@ -1 +0,0 @@ -{"priv_key":{"type":"tendermint/PrivKeyEd25519","value":"3e4OW3rwzaNU0Ny0ZE++2knmVuRe9ChUUNJVUGFS7iofJ6GmVuIO75MHbChrwA8UnPNnCkXgl3pUgVr0t1kE3Q=="}} \ No newline at end of file diff --git a/v9/config/priv_validator_key.json b/v9/config/priv_validator_key.json deleted file mode 100644 index 481660fd578..00000000000 --- a/v9/config/priv_validator_key.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "address": "41A5FF4E8949D30A15ADE95FA405E55D0E54EF14", - "pub_key": { - "type": "tendermint/PubKeyEd25519", - "value": "G9m0MKM9gPv8zLjm8OwccLJE0PpGBCUzqYK+SpzL9O0=" - }, - "priv_key": { - "type": "tendermint/PrivKeyEd25519", - "value": "SSMw5an19NB9ZQ8HHzM9mEXFV3H+3UQvFI0eKceVUhkb2bQwoz2A+/zMuObw7BxwskTQ+kYEJTOpgr5KnMv07Q==" - } -} \ No newline at end of file diff --git a/v9/data/application.db/CURRENT b/v9/data/application.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/application.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/application.db/LOCK b/v9/data/application.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/application.db/LOG b/v9/data/application.db/LOG deleted file mode 100644 index 01755c62d8b..00000000000 --- a/v9/data/application.db/LOG +++ /dev/null @@ -1,6 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:19.581168 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:19.641145 db@open opening -14:54:19.641418 version@stat F·[] S·0B[] Sc·[] -14:54:19.661842 db@janitor F·2 G·0 -14:54:19.661868 db@open done T·20.679292ms diff --git a/v9/data/application.db/MANIFEST-000000 b/v9/data/application.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/data/blockstore.db/CURRENT b/v9/data/blockstore.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/blockstore.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/blockstore.db/LOCK b/v9/data/blockstore.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/blockstore.db/LOG b/v9/data/blockstore.db/LOG deleted file mode 100644 index 41bad60cb0f..00000000000 --- a/v9/data/blockstore.db/LOG +++ /dev/null @@ -1,8 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:19.746440 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:19.810090 db@open opening -14:54:19.810566 version@stat F·[] S·0B[] Sc·[] -14:54:19.829887 db@janitor F·2 G·0 -14:54:19.829926 db@open done T·19.755125ms -15:04:01.200084 db@close closing -15:04:01.200185 db@close done T·100.958µs diff --git a/v9/data/blockstore.db/MANIFEST-000000 b/v9/data/blockstore.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/data/cs.wal/wal b/v9/data/cs.wal/wal deleted file mode 100644 index 1c1d56c0893c0761982864fb08540035a1d53b15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180893 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�ZMxuy&}PQ#~;>3J@cNNk!)Ap-R2J_%3)BqEum5 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 diff --git a/v9/data/evidence.db/CURRENT b/v9/data/evidence.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/evidence.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/evidence.db/LOCK b/v9/data/evidence.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/evidence.db/LOG b/v9/data/evidence.db/LOG deleted file mode 100644 index a76e7bf9103..00000000000 --- a/v9/data/evidence.db/LOG +++ /dev/null @@ -1,6 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:20.050744 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:20.107031 db@open opening -14:54:20.107287 version@stat F·[] S·0B[] Sc·[] -14:54:20.126432 db@janitor F·2 G·0 -14:54:20.126472 db@open done T·19.409708ms diff --git a/v9/data/evidence.db/MANIFEST-000000 b/v9/data/evidence.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/data/priv_validator_state.json b/v9/data/priv_validator_state.json deleted file mode 100644 index 16def484214..00000000000 --- a/v9/data/priv_validator_state.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "height": "113", - "round": 0, - "step": 3, - "signature": "nmXTIOVKRVLcEio16nrP7x3jh4Pi+YuXktAoO+I54/fZqo3apqbk1CIVn+B777wK2lLeOMVZSmHIt5HKp0zWDA==", - "signbytes": "69080211710000000000000022480A2060556C337D79D08968ECE2F5F025BD9743EAEA6C9A3F9F752E858A199662572A122408011220CBC2C9F932FF1A6E6ABA5DAA710F3FDF6F33D879210112ED6989B73FD26BF88D2A0C08BFC2A4A20610A0FDDEEC01320474657374" -} \ No newline at end of file diff --git a/v9/data/snapshots/metadata.db/CURRENT b/v9/data/snapshots/metadata.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/snapshots/metadata.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/snapshots/metadata.db/LOCK b/v9/data/snapshots/metadata.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/snapshots/metadata.db/LOG b/v9/data/snapshots/metadata.db/LOG deleted file mode 100644 index c3917369666..00000000000 --- a/v9/data/snapshots/metadata.db/LOG +++ /dev/null @@ -1,6 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:19.665963 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:19.725959 db@open opening -14:54:19.726415 version@stat F·[] S·0B[] Sc·[] -14:54:19.744880 db@janitor F·2 G·0 -14:54:19.744916 db@open done T·18.915292ms diff --git a/v9/data/snapshots/metadata.db/MANIFEST-000000 b/v9/data/snapshots/metadata.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/data/state.db/CURRENT b/v9/data/state.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/state.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/state.db/LOCK b/v9/data/state.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/state.db/LOG b/v9/data/state.db/LOG deleted file mode 100644 index 108e46e9597..00000000000 --- a/v9/data/state.db/LOG +++ /dev/null @@ -1,8 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:19.830232 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:19.893377 db@open opening -14:54:19.894423 version@stat F·[] S·0B[] Sc·[] -14:54:19.914276 db@janitor F·2 G·0 -14:54:19.914431 db@open done T·20.954334ms -15:04:01.200253 db@close closing -15:04:01.200304 db@close done T·50.5µs diff --git a/v9/data/state.db/MANIFEST-000000 b/v9/data/state.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/data/tx_index.db/CURRENT b/v9/data/tx_index.db/CURRENT deleted file mode 100644 index feda7d6b248..00000000000 --- a/v9/data/tx_index.db/CURRENT +++ /dev/null @@ -1 +0,0 @@ -MANIFEST-000000 diff --git a/v9/data/tx_index.db/LOCK b/v9/data/tx_index.db/LOCK deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/v9/data/tx_index.db/LOG b/v9/data/tx_index.db/LOG deleted file mode 100644 index 36a2d44eef2..00000000000 --- a/v9/data/tx_index.db/LOG +++ /dev/null @@ -1,6 +0,0 @@ -=============== Apr 26, 2023 (CEST) =============== -14:54:19.937714 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed -14:54:19.996697 db@open opening -14:54:19.997009 version@stat F·[] S·0B[] Sc·[] -14:54:20.016281 db@janitor F·2 G·0 -14:54:20.016318 db@open done T·19.576333ms diff --git a/v9/data/tx_index.db/MANIFEST-000000 b/v9/data/tx_index.db/MANIFEST-000000 deleted file mode 100644 index 9d54f6733b1364dc8d53dd15ca59a6ec36a1c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmdmC5aOo9z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&O?~%*ev9Y~pbaHU>r} JMrI}!1^~s!4paaD diff --git a/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address b/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address deleted file mode 100644 index 442abef9c3e..00000000000 --- a/v9/keyring-test/01ee5297567a853c6e43917271b22058e07519cd.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yNDQ0MTIgKzAyMDAgQ0VTVCBtPSswLjAyNTMzMjAwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjEyaWhRX0dGSkNvSWtjSHIifQ.KRnqp1-c6sbuPgsMgjqGt-f4vATO8Rs0d4bpA2mosWiCdYWueMM1aQ.qhlz_QhKXuSgzo74.reGrjNVFnL80Av7w1rVHudTQM2c0uJc8QqMdK4T88WCa2UDyQQB_0xfiE1t1J0U6vS4CUSyGVeVxalEYN24zUWH5L46IL6t2lUHHHQwT1oLvoepL5iTGGQ3neSmVatv-OjLtpl8uVERreas9_6RFZavZlaVS3y3a_mczRmqMIVoQS0csoe7qbkAX_kbVjS-fAdGQKORYdxSlI0ZQ8KcolmHOXrvK2WaCQ2cmTHD8xYlbUolK_j0.3_3ZFWWRY6Ws21yg57YkkQ \ No newline at end of file diff --git a/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address b/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address deleted file mode 100644 index d2f786cafd2..00000000000 --- a/v9/keyring-test/1e18ef3e8765a2cdddd084efbc1f878c8a9f09aa.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNDM2NzQgKzAyMDAgQ0VTVCBtPSswLjAyNTc4NzU0MyIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ill3ZTdQVFpUOXJKS3ByaXIifQ.ft0ikJRRWR0kvKdWowERCK2ibsf6Nc7qFYpifrtdkZ-lXzYU6K18kQ.-SNY0abuh4fZEPGf.X_3xe-ZUFLC4W0d2NqbBtZjvbTLQ7cfdhw5lhyNycGf8N0NfxmslBuEASF84LzCy2qiXZa_jxJJjjQp6vVR1xnm9UQkziR4fNDBufjPaQG0CphpEcfIsioMG5zpviQ8SI9h1zX5N5BGtH0VpC8IJNdSQ99x-pBDzYSls_nwiw6K7qrDGWOqdwDlL2zCGkTmWoakUetDpuk4NcNpHXwIMboT6k1K9xLX-BjzIZEKNawSBQw.aKEXEQHy2J9egAjBeznpQw \ No newline at end of file diff --git a/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address b/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address deleted file mode 100644 index 9b902074898..00000000000 --- a/v9/keyring-test/5863c80bc2822ccd272a242fdca50cfefb88736a.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yMTEyNyArMDIwMCBDRVNUIG09KzAuMDI2OTE1NzkyIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoiMVIzSWZsWFJ4b1dLRXB0cyJ9.PTGBpv2IM1seBmZmEEzFrHWn906ztpy-aiI29ENM-d8BL9GNyUzAiA.MtEWbFIigwRnAgqR.N6qhznkh8rwFR64zlIkpgKV19dM6Iuv6_XH2xNZla4Z2_7ATsel3_QdC1cKR3xlUpri01OY0l-TmCm725TmjKRHtcUhmTcIV40oNxhim2AtC_IIAupraXu3Q1eB60x6xyOpdnvQqaLtI8HLtIVDDcKi5AP7GOrr2AR0Mfy3Yv406UDNuiTpdKuEPgtAuI37RycE08SQwivHF5yYodVS6ij7Eps9pZbwdQHsnMm1IkTUKyw.YXyCSR0oKUaLRgwv1_lg5Q \ No newline at end of file diff --git a/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address b/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address deleted file mode 100644 index 75a0ca5c86c..00000000000 --- a/v9/keyring-test/61515e37968ad958f980745aab8e721456578133.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNzY3MDEgKzAyMDAgQ0VTVCBtPSswLjAyNTQ0MjUwMSIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Im5rb2hCWjdsSTQ2dWZ2WFkifQ.BWwKhwUWEAwYJtLJbKD3rhRbcXyADd0zDSE2Kse0RjOgfZHZltGTDg.UIyjcX1YWZVTSG94.9MOoalqU08HLT1hxTAsgnOn3T6PHyOPX2d4Wibk-rXjdDj9iwa4blQ-84udnobX4vso0BiwFlp_ov8Z5vrJpcds0R6qIhoa0Ky9HXFvLDEe3zXENKCrKTpqQPMAixQBvVEtLCPqhqFbKDpYdupS_A8Lh5XF-TeqgWDdB2o5DZEkHNOo6dUD5qooB0v43uuAIPMyFZFYcAka0Fw3QH9PdxoP2sZo01a39Ly19sdevW8bq6HKgIj0.iidqA-GEM9mbMGbpTQRVOA \ No newline at end of file diff --git a/v9/keyring-test/alice.info b/v9/keyring-test/alice.info deleted file mode 100644 index 94e762c7cf9..00000000000 --- a/v9/keyring-test/alice.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNzUxMDEgKzAyMDAgQ0VTVCBtPSswLjAyMzg0MjE2OCIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6InNTRzFUOHBYektIa0V5SG4ifQ._Q0lm0CM4hsTmH268i2trW8HrE93T2p0R3p_KTXjazhS13J-S0WA8w.kqOCV4bW_tGj0f_s.kV1f8Zyodp7hgN5uq7n3Lf02ur1DMW-wZqikDwy1SDHpufNkYAs7T5hvcSBPnFymC9uzsFo1K9cQ9BgN6-J4Tub-HQv2aqOOBUaDRWF3oK42Ws07uzPgi2GB22w5Kcevf0Tm3WmhdUG6VSIisn1cfB2qDkXJSUHdL237BJqwYTrAeSzdnukW6rM5ZoKynKpkYXXBgASUjdh5YzDE6-voA_UGlvKfujsKkf6du1vd4ipVg9ynNmqESsSLR2hw1f_6RN2MENgtnvroZoAVYKmuVISKr1-BE04FAuAMU2PwXiZZEh64uSChse7fX7tamt3By34bMrM9ZeEAqww4qvN2B-l27Y02Etw0.Yh4LYAotYR14s7sse44MVQ \ No newline at end of file diff --git a/v9/keyring-test/bob.info b/v9/keyring-test/bob.info deleted file mode 100644 index 8c89daf4c85..00000000000 --- a/v9/keyring-test/bob.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yMDk3MzYgKzAyMDAgQ0VTVCBtPSswLjAyNTM4MTYyNiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ino2dmk5eUh1ZS0wNnRrOVoifQ.-b10yCzf0xrOoVRpXw6bMkLaK9VzazmdKTrumol-Wj1hf3TQj3p0Uw.r9ZHZkJzYRT4Ccy8.fS3OOWzQ5s2F0GvfPlCYmxwR6NyWMOFV7z77UfftkHrkn82viFD3Y2jZRcvGiFBHLfDpVO5pDx9lVPvfxczHuKCeIJ51h6mxHZfYpnoOfiUP484nGcACDSxSsy8l_jE2an9faGfZvA7Z48aAaa874sGJk3yCmbTu0JYU15RJAVK1TM22Y1rDdveBXZXq3FD0p3i5tZI-_nhhWKL_HooRMiA4vyhm2dnja1kFxyieU-Uqk4A5_OmY5lquHj06La1dKDKe6IhIz_ANytZm673zpsrRPX7vQEqL5_g2rFwQsgx8qT7t08L4U5cZT8P9U9mmv_vAwv3MIi4n5DdbJuF5Dgp5n-tEJw.hffRrQFLmHotfueXkqYEOg \ No newline at end of file diff --git a/v9/keyring-test/charlie.info b/v9/keyring-test/charlie.info deleted file mode 100644 index 5123f836514..00000000000 --- a/v9/keyring-test/charlie.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4yNDI4OCArMDIwMCBDRVNUIG09KzAuMDIzODAwMDAxIiwiZW5jIjoiQTI1NkdDTSIsInAyYyI6ODE5MiwicDJzIjoibUlGMDdVTUF3ODlWZlBYbSJ9.6fMuygYYp0wPKWI9iVl4KF0ZSxOM0GvFqwkfygJ7nbA6agrG9sGh3w.hCDy8k50RvSzX0E1.dRnSnRESba_dqPddrXoHW8j7KjP2D0oXei4halhI-eOcCvGYnjO2XtZHT3I_HYl2SRl-0tybExtwgz5pfAfkaGxodehEGkBNCc9b19-b9BO1Lrpy1tRYEu1fzm2T2QZsrZbXJFL8pQBc5GxRb9ehHMoD-sjjHfAlkOIKb9UbRxmHh8S0yfhmJOorYEJ0qGyK4-iFgOvKBl_WLfey9aocLVQUuqj4TG400uiY006gBG7FgNlN5WWC5jBsNPrTAoeqOT-NCkHzEnJIE81TKxl0ZShzdNmIrQ3kVMb3hx3Q2okN4jN0W7awqA-nUELxP-v1C23MiJgMfFQwUTb-2OizyDfh7S8Vg2xaTs6Ryt8U.fWppIpT14mR3A4BZ4TvbzQ \ No newline at end of file diff --git a/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address b/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address deleted file mode 100644 index f476994b840..00000000000 --- a/v9/keyring-test/dcade2a6524043feda8e01e2773c8d29d4815889.address +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4zMjI4ODYgKzAyMDAgQ0VTVCBtPSswLjAyNTU5OTEyNiIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6Ilhrb3Eyd1VfT0Yyb3VNUnUifQ.qwr_-yh_NJ_sK1ThEsL7uJwBtbd9Q35M4qoW5FI4d9JVr02TASQVtg.MIYnIdhlquLg1-iG.g6mOHMXFiYqOkVYkooATOI7_k3e5LKF_MtMBUht2r1hw3QWuyOOOpj_bGVK4RMn5NtpuLEXVbtTNy8vCwlxZtC1IJMyw8WbNxr6-6Gl6BfGVCRFzoEtYBS1BlYX80xpJYjZlpIONzh1Efa8AaVubLcx8V2k_rNR535rWMmtDvUwaVJ0Fhcvjgwh_U1siORTGkS_qo7dZvxbIXxhAFXi6rEzLAu7o4_rZqzTVBhyqeVbFKg.FKmj04OTLushxmyuXc5erg \ No newline at end of file diff --git a/v9/keyring-test/rly0.info b/v9/keyring-test/rly0.info deleted file mode 100644 index c983754ca55..00000000000 --- a/v9/keyring-test/rly0.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4zMjEzNzggKzAyMDAgQ0VTVCBtPSswLjAyNDA5MTI5MyIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6InhvNm5UR2s3Y2hoaW9aYmsifQ.j7GX6Tn3ic0M43pkmszIdglyUDIQ0UGlrUAM-cUYXzOOpTpSBnDzDg.5ZuD6OAB6a88oFiN.wq7mht_11W4dxe-G53X3wDVdPH1WWnTZSKJe-S57HWPGFl3VUic0PlsGshccnkYCkYiAFNWnxz1ZO4fTuchyV7gRoa8c1gAgYTGrfxr4i6KzHhh3m0KkgRjSD2Ku9d9xAxWgbH2XYOzG0Ge3pu6kNK2nIR_G2jQmL1M4h2GmYpnY15Ca_sMTTe4EPt4L1brMWPrfHdXIea-yooUn9OBzIa2fpzSNRCcx7Wz-bPwn3hh1psXqp-dQ81aVn7Pn-zMXzDqZNJE75GpV9-zRTQs4O_GnFRjGlTgh2Clo3AAgjhSxYJ56rmLyP9_iSWSVWbJ1tcH_6mficSAFf7zBgEynzx4MFtdnV1o.PyeSnbpPNr8aJM1hoiGvXg \ No newline at end of file diff --git a/v9/keyring-test/val1.info b/v9/keyring-test/val1.info deleted file mode 100644 index e5dcc9aab39..00000000000 --- a/v9/keyring-test/val1.info +++ /dev/null @@ -1 +0,0 @@ -eyJhbGciOiJQQkVTMi1IUzI1NitBMTI4S1ciLCJjcmVhdGVkIjoiMjAyMy0wNC0yNiAxNDo1NDoxOS4xNDIxNTIgKzAyMDAgQ0VTVCBtPSswLjAyNDI2NTQxOCIsImVuYyI6IkEyNTZHQ00iLCJwMmMiOjgxOTIsInAycyI6IjY0MW9Qa1g3c2JrVnJuNU8ifQ.H50NzXw26ghK2BUXkYLvGx4Hgif7hxbHC8P_qtQThJVlZ1l_aSmt_g.sO-GG5cEOPldlDtL.En9GQHdamnFL7HQOXI0cMsWZKyXDp1AzuN0W8PUaiF0zeaiWLgntJvT6-WL9O3lacbrlcApvT27K3uQcNJxJf3_KVZfk9k5HRD4aMxA--LpxcUYQSETFIRIhr9UcZYx6xl0rFr6zJsPWwB39OCqKxPId3H4XbghyiMtjNLiPYoMuUkV9xQpawns_iO1gw91_KneKIHAMV7S07gNifrNliznsxz04U3sVDElJ73onivyAwverFOiLxQ4ZYfc5wF64D8bm0FDNfZ3Pj9OQWwcn3CeDan1Nvi50y6rU7fkOxP7dp7RJYajMiBFHNNVN0plLYHCny8vF-3Yd5lw0D3M5rQ8lplmSk0U.mV6Ea3eKwG8E0I7zXkjCyQ \ No newline at end of file diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index a93acd2a6f0..3a7783c8e92 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -79,10 +79,10 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired) - // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequirement + // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequired // // feeCoinsNoZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq - // when feeCoins does not contain zero coins' denoms in feeRequirement + // when feeCoins does not contain zero coins' denoms in feeRequired feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq) // Check that the fees are in expected denominations. @@ -110,7 +110,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // the expected amounts. // only check feeCoinsNoZeroDenom has coins IsAnyGTE than nonZeroCoinFeesReq - // when feeCoins does not contain denoms of zero denoms in feeRequirement + // when feeCoins does not contain denoms of zero denoms in feeRequired if !allowedToBypassMinFee && len(feeCoinsZeroDenom) == 0 { // special case: when feeCoins=[] and there is zero coin in fee requirement if len(feeCoins) == 0 && len(zeroCoinFeesDenomReq) != 0 { @@ -152,7 +152,7 @@ func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coi // Get local minimum-gas-prices localFees := GetMinGasPrice(ctx, int64(tx.GetGas())) - // feeRequirement should never be empty since + // the combined fee requirement should never be empty since // global fee is set to its default value, i.e. 0uatom, if empty feeReq, err := CombinedFeeRequirement(globalFees, localFees) if err != nil { @@ -188,9 +188,7 @@ func (mfd FeeDecorator) GetGlobalFee(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coin glDec := sdk.NewDec(int64(feeTx.GetGas())) for i, gp := range globalMinGasPrices { fee := gp.Amount.Mul(glDec) - ctx.Logger().Info(fmt.Sprintf("Computing Global Fee min x gas %v x %v", gp.Amount, glDec)) requiredGlobalFees[i] = sdk.NewCoin(gp.Denom, fee.Ceil().RoundInt()) - ctx.Logger().Info(fmt.Sprintf("Equal %v", requiredGlobalFees[i].String())) } return requiredGlobalFees.Sort(), nil From a5a29ef3a7d52c3effa159d45dcd0f4296814126 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 10:38:15 +0200 Subject: [PATCH 11/34] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce45c5c06b6..a44de1881ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] * (gaia) Bump Golang prerequisite from 1.18 to 1.20 see (https://go.dev/blog/go1.20) for details. +* (feat!) [#2447] Update Global Fee's AnteHandler to have tx fees checked against network min gas prices in DeliverTx mode. It entails that the local min gas price are only taken in account in CheckTx mode. ## [v9.0.3] - 2023-04-19 * (deps) [#2399](https://github.com/cosmos/gaia/pull/2399) Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.45.15-ics](https://github.com/cosmos/cosmos From 238c6fdc39a4435e0bf5e0e8d6a5841203cbbc88 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 11:11:56 +0200 Subject: [PATCH 12/34] nits --- CHANGELOG.md | 2 +- tests/e2e/e2e_vesting_test.go | 3 --- x/globalfee/ante/fee.go | 5 +---- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a44de1881ca..b31612b4f21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] * (gaia) Bump Golang prerequisite from 1.18 to 1.20 see (https://go.dev/blog/go1.20) for details. -* (feat!) [#2447] Update Global Fee's AnteHandler to have tx fees checked against network min gas prices in DeliverTx mode. It entails that the local min gas price are only taken in account in CheckTx mode. +* (feat!) [#2447] Update Global Fee's AnteHandler to check tx fees against the network min gas prices in DeliverTx mode. The local min gas prices are only taken in account in CheckTx mode. ## [v9.0.3] - 2023-04-19 * (deps) [#2399](https://github.com/cosmos/gaia/pull/2399) Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.45.15-ics](https://github.com/cosmos/cosmos diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index fe9984edf08..d79ae2b4de7 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -2,7 +2,6 @@ package e2e import ( "encoding/json" - "fmt" "math/rand" "path/filepath" "time" @@ -128,10 +127,8 @@ func (s *IntegrationTestSuite) testContinuousVestingAccount(api string) { // Check address balance balance, err := getSpecificBalance(api, continuousVestingAcc.String(), uatomDenom) - fmt.Println(balance.String()) s.Require().NoError(err) s.Require().Equal(vestingBalance.AmountOf(uatomDenom), balance.Amount) - fmt.Println(vestingBalance.AmountOf(uatomDenom)) // Delegate coins should succeed s.executeDelegate(chain, valIdx, vestingDelegationAmount.String(), diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 3a7783c8e92..14d9d098ffd 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -68,10 +68,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne gas := feeTx.GetGas() msgs := feeTx.GetMsgs() - ctx.Logger().Info(fmt.Sprintf("tx received: %#+v", msgs)) - ctx.Logger().Info(fmt.Sprintf("gas: %v fee: %v", gas, feeCoins)) - - // Get the required fees according the Check or Deliver Tx mode + // Get the required fees according the CheckTx or DeliverTx modes feeRequired, err := mfd.GetTxFeeRequired(ctx, feeTx) if err != nil { return ctx, err From e51b618930d6b07cafffaaa692ac3332b78f5cde Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 11:46:08 +0200 Subject: [PATCH 13/34] refactor GetTxFeeRequired --- x/globalfee/ante/fee.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 14d9d098ffd..2c50fec278c 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -135,28 +135,26 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // In case the FeeTx's mode is CheckTx, it returns the combined requirements // of local min gas prices and global fees. Otherwise, in DeliverTx, it returns the global fee. func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coins, error) { - // Get required Global Fee + // Get required global fee min gas prices + // Note that it should never be empty since its default value is set to {DefaultStakingDenom, 0} globalFees, err := mfd.GetGlobalFee(ctx, tx) if err != nil { return sdk.Coins{}, err } + // In DeliverTx, the global fee min gas prices are the only tx fee requirements. if !ctx.IsCheckTx() { return globalFees, nil } - // In CheckTx get local min gas price and combined it with global fee. + // In CheckTx mode, the local and global fee min gas prices are combined + // to form the tx fee requirements + // Get local minimum-gas-prices localFees := GetMinGasPrice(ctx, int64(tx.GetGas())) - // the combined fee requirement should never be empty since - // global fee is set to its default value, i.e. 0uatom, if empty - feeReq, err := CombinedFeeRequirement(globalFees, localFees) - if err != nil { - return sdk.Coins{}, err - } - - return feeReq, nil + // Return combined fee requirements + return CombinedFeeRequirement(globalFees, localFees) } // GetGlobalFee returns the global fees for a given fee tx's gas From 98ab598a86e7406e9f1e04f1d7c953cb6414d7c9 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 11:47:46 +0200 Subject: [PATCH 14/34] nits --- x/globalfee/ante/antetest/fee_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 611fbcfbf33..07215c5a696 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -758,7 +758,7 @@ func (s *IntegrationTestSuite) TestContainsOnlyBypassMinFeeMsgs() { } func (s *IntegrationTestSuite) TestGetTxFeeRequired() { - // set up default gloabal fee i.e. "0utaom" + // set up default gloabal fee i.e. "0uatom" globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} // setup decorator From 016ab54cb62fa0dd0b9fc290b4935e42cd575f0d Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 11:58:40 +0200 Subject: [PATCH 15/34] update docs --- x/globalfee/ante/antetest/fee_test.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 07215c5a696..18e8bc99bc4 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -767,7 +767,7 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { // reset decorator staking subspace feeDecorator.StakingSubspace = paramtypes.Subspace{} - // check an error is returned when staking subspace isn't set + // check that an error is returned when staking subspace isn't set _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) s.Require().Equal(err.Error(), "empty staking bond denomination") @@ -792,15 +792,14 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { tx, err := s.CreateTestTx(privs, accNums, accSeqs, s.ctx.ChainID()) s.Require().NoError(err) - // check that in CheckTx the combined fee is returned - // i.e. local min gas prices as it has higher amount of uatom than global fee + // check that the required fees returned in CheckTx mode are equal to + // local min gas prices since they're bigger than the default global fee values. s.Require().True(s.ctx.IsCheckTx()) res, err := feeDecorator.GetTxFeeRequired(s.ctx, tx) - s.Require().True(res.IsEqual(localMinGasPrices)) s.Require().NoError(err) - // check that in DeliverTx the global fee is returned + // check that the global fee is returned n DeliverTx mode. globalFee, err := feeDecorator.GetGlobalFee(s.ctx, tx) s.Require().NoError(err) From c57a4efd5b05c730fc4288a82ce06ecd9f1281d0 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:22:08 +0200 Subject: [PATCH 16/34] update changelog --- CHANGELOG.md | 2 +- x/globalfee/ante/fee.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b31612b4f21..f26ce6784b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] * (gaia) Bump Golang prerequisite from 1.18 to 1.20 see (https://go.dev/blog/go1.20) for details. -* (feat!) [#2447] Update Global Fee's AnteHandler to check tx fees against the network min gas prices in DeliverTx mode. The local min gas prices are only taken in account in CheckTx mode. +* (feat!) [#2447] Update Global Fee's AnteHandler to check tx fees against the network min gas prices in DeliverTx mode. ## [v9.0.3] - 2023-04-19 * (deps) [#2399](https://github.com/cosmos/gaia/pull/2399) Bump [cosmos-sdk](https://github.com/cosmos/cosmos-sdk) to [v0.45.15-ics](https://github.com/cosmos/cosmos diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 2c50fec278c..8146d9e0ce9 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -68,7 +68,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne gas := feeTx.GetGas() msgs := feeTx.GetMsgs() - // Get the required fees according the CheckTx or DeliverTx modes + // Get the required fees according to the CheckTx or DeliverTx modes feeRequired, err := mfd.GetTxFeeRequired(ctx, feeTx) if err != nil { return ctx, err From a4ed8e1a1fd0bf03242df073b22e9e292c7bbd95 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:23:37 +0200 Subject: [PATCH 17/34] remove debugging setup --- tests/e2e/e2e_setup_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 1c4eed1ca76..83e35e83c0d 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -146,10 +146,8 @@ func (s *IntegrationTestSuite) SetupSuite() { s.initValidatorConfigs(s.chainB) s.runValidators(s.chainB, 10) - if runIBCTest { - time.Sleep(10 * time.Second) - s.runIBCRelayer() - } + time.Sleep(10 * time.Second) + s.runIBCRelayer() } func (s *IntegrationTestSuite) TearDownSuite() { From 51656cce48b9a9e63870e03de5b064ce8e6934da Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:27:44 +0200 Subject: [PATCH 18/34] nits --- tests/e2e/e2e_vesting_test.go | 1 - x/globalfee/ante/antetest/fee_test.go | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index d79ae2b4de7..efc09dbbc88 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -97,7 +97,6 @@ func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { // Transfer coins should succeed balance, err = getSpecificBalance(api, vestingDelayedAcc.String(), uatomDenom) - s.T().Log(balance.String()) s.Require().NoError(err) s.execBankSend( chain, diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 18e8bc99bc4..a159fa39b16 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -575,7 +575,7 @@ func (s *IntegrationTestSuite) TestGlobalFeeMinimumGasFeeAnteHandler() { txCheck: true, expErr: true, }, - "disable checkTx: no fee check. min_gas_price is med, global fee is low, tx fee is low": { + "disable checkTx: min_gas_price is med, global fee is low, tx fee is low": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", lowFeeAmt)), @@ -584,7 +584,7 @@ func (s *IntegrationTestSuite) TestGlobalFeeMinimumGasFeeAnteHandler() { txCheck: false, expErr: false, }, - "disable checkTx: no fee check. min_gas_price is med, global fee is low, tx is zero": { + "disable checkTx: min_gas_price is med, global fee is low, tx is zero": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt())), From bdc180f5aee3db907056730ef0023d6f5e05182e Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:32:28 +0200 Subject: [PATCH 19/34] nits --- x/globalfee/ante/antetest/fee_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index a159fa39b16..fd083010e2b 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -758,10 +758,10 @@ func (s *IntegrationTestSuite) TestContainsOnlyBypassMinFeeMsgs() { } func (s *IntegrationTestSuite) TestGetTxFeeRequired() { - // set up default gloabal fee i.e. "0uatom" + // create global fee params globalfeeParamsEmpty := &globfeetypes.Params{MinimumGasPrices: []sdk.DecCoin{}} - // setup decorator + // setup tests with default global fee i.e. "0uatom" and empty local min gas prices feeDecorator, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice([]sdk.DecCoin{}, globalfeeParamsEmpty) // reset decorator staking subspace @@ -771,10 +771,10 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) s.Require().Equal(err.Error(), "empty staking bond denomination") - // set non-zero local min gas price + // set non-zero local min gas prices localMinGasPrices := sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(1))) - // setup decorator + // setup tests with non-empty local min gas prices feeDecorator, _ = s.SetupTestGlobalFeeStoreAndMinGasPrice( sdk.NewDecCoinsFromCoins(localMinGasPrices...), globalfeeParamsEmpty, @@ -793,13 +793,13 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { s.Require().NoError(err) // check that the required fees returned in CheckTx mode are equal to - // local min gas prices since they're bigger than the default global fee values. + // local min gas prices since they're greater than the default global fee values. s.Require().True(s.ctx.IsCheckTx()) res, err := feeDecorator.GetTxFeeRequired(s.ctx, tx) s.Require().True(res.IsEqual(localMinGasPrices)) s.Require().NoError(err) - // check that the global fee is returned n DeliverTx mode. + // check that the global fee is returned in DeliverTx mode. globalFee, err := feeDecorator.GetGlobalFee(s.ctx, tx) s.Require().NoError(err) From 0f2a66186650b9557a28aecdd18a135419b632f7 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:43:55 +0200 Subject: [PATCH 20/34] nits --- x/globalfee/ante/fee.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 8146d9e0ce9..34b9d7f8289 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -2,7 +2,6 @@ package ante import ( "errors" - "fmt" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -122,7 +121,6 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // if nonZeroCoinFeesReq=[], return false (this situation should not happen // because when nonZeroCoinFeesReq empty, and DenomsSubsetOf check passed, // the tx should already passed before) - ctx.Logger().Info(fmt.Sprintf("%#+v is GT than %#+v", feeCoinsNonZeroDenom.String(), nonZeroCoinFeesReq.String())) if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins, feeRequired) } @@ -136,7 +134,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // of local min gas prices and global fees. Otherwise, in DeliverTx, it returns the global fee. func (mfd FeeDecorator) GetTxFeeRequired(ctx sdk.Context, tx sdk.FeeTx) (sdk.Coins, error) { // Get required global fee min gas prices - // Note that it should never be empty since its default value is set to {DefaultStakingDenom, 0} + // Note that it should never be empty since its default value is set to coin={"StakingBondDenom", 0} globalFees, err := mfd.GetGlobalFee(ctx, tx) if err != nil { return sdk.Coins{}, err @@ -189,6 +187,7 @@ func (mfd FeeDecorator) GetGlobalFee(ctx sdk.Context, feeTx sdk.FeeTx) (sdk.Coin return requiredGlobalFees.Sort(), nil } +// DefaultZeroGlobalFee returns a zero coin with the staking module bond denom func (mfd FeeDecorator) DefaultZeroGlobalFee(ctx sdk.Context) ([]sdk.DecCoin, error) { bondDenom := mfd.getBondDenom(ctx) if bondDenom == "" { @@ -199,7 +198,8 @@ func (mfd FeeDecorator) DefaultZeroGlobalFee(ctx sdk.Context) ([]sdk.DecCoin, er } func (mfd FeeDecorator) getBondDenom(ctx sdk.Context) string { - // prevent panic if staking subspace isn't set + // prevent the getter above to panic + // when the staking subspace isn't set if !mfd.StakingSubspace.HasKeyTable() { return "" } From 7925dfa3561fd76e1f405ac929fce223e0457fbb Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 1 May 2023 14:46:52 +0200 Subject: [PATCH 21/34] nits --- x/globalfee/ante/fee_utils.go | 4 ++-- x/globalfee/ante/fee_utils_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x/globalfee/ante/fee_utils.go b/x/globalfee/ante/fee_utils.go index 073a635ac63..41ea40d31ef 100644 --- a/x/globalfee/ante/fee_utils.go +++ b/x/globalfee/ante/fee_utils.go @@ -25,8 +25,8 @@ func ContainZeroCoins(coins sdk.Coins) bool { // does not validate them, so it may return 0denom. // if globalfee is empty, CombinedFeeRequirement return sdk.Coins{} func CombinedFeeRequirement(globalFees, minGasPrices sdk.Coins) (sdk.Coins, error) { - // global fees should never be since it has a zero default value - // using the staking bond denom + // global fees should never be empty + // since it has a default value using the staking module's bond denom if len(globalFees) == 0 { return sdk.Coins{}, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "global fee cannot be empty") } diff --git a/x/globalfee/ante/fee_utils_test.go b/x/globalfee/ante/fee_utils_test.go index cebe119055a..52c577f5f16 100644 --- a/x/globalfee/ante/fee_utils_test.go +++ b/x/globalfee/ante/fee_utils_test.go @@ -81,7 +81,7 @@ func TestCombinedFeeRequirement(t *testing.T) { c sdk.Coins combined sdk.Coins }{ - "global fee invalid, return combined fee empty and non nil error": { + "global fee invalid, return combined fee empty and non-nil error": { cGlobal: coinsEmpty, c: coinsEmpty, combined: coinsEmpty, From d40ac5bac0762262ec06039bbc3645a0e26e3acc Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Tue, 2 May 2023 14:18:56 +0200 Subject: [PATCH 22/34] Update x/globalfee/ante/antetest/fee_test.go --- x/globalfee/ante/antetest/fee_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index fd083010e2b..7e85b4c3888 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -575,7 +575,7 @@ func (s *IntegrationTestSuite) TestGlobalFeeMinimumGasFeeAnteHandler() { txCheck: true, expErr: true, }, - "disable checkTx: min_gas_price is med, global fee is low, tx fee is low": { + "disable checkTx: min_gas_price is medium, global fee is low, tx fee is low": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", lowFeeAmt)), From b6de6d5fe3cb236fb4c20ab2713e156a9e68db93 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Tue, 2 May 2023 14:19:09 +0200 Subject: [PATCH 23/34] Update x/globalfee/ante/antetest/fee_test.go --- x/globalfee/ante/antetest/fee_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 7e85b4c3888..7964232e141 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -584,7 +584,7 @@ func (s *IntegrationTestSuite) TestGlobalFeeMinimumGasFeeAnteHandler() { txCheck: false, expErr: false, }, - "disable checkTx: min_gas_price is med, global fee is low, tx is zero": { + "disable checkTx: min_gas_price is medium, global fee is low, tx is zero": { minGasPrice: minGasPrice, globalFeeParams: globalfeeParamsLow, gasPrice: sdk.NewCoins(sdk.NewCoin("uatom", sdk.ZeroInt())), From 83e70f54ccc2216c46f1f414d4db4d2502c83ba8 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 3 May 2023 09:47:18 +0200 Subject: [PATCH 24/34] fix changelog --- CHANGELOG.md | 2 +- go.sum | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 293bf554515..550636d8cdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,10 +38,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Improvements * (test) [#2440](https://github.com/cosmos/gaia/pull/2440) Add vulncheck to nightly builds +* (gaia) [#2442](https://github.com/cosmos/gaia/pull/2442) Bump [Interchain-Security](https://github.com/cosmos/interchain-security) to [v1.1.1](https://github.com/cosmos/interchain-security/tree/v1.1.1). ### State Machine Breaking * (gaia) Bump Golang prerequisite from 1.18 to 1.20 see (https://go.dev/blog/go1.20) for details. -* (gaia) [#2442](https://github.com/cosmos/gaia/pull/2442) Bump [Interchain-Security](https://github.com/cosmos/interchain-security) to [v1.1.1](https://github.com/cosmos/interchain-security/tree/v1.1.1). ## [v9.0.3] - 2023-04-19 diff --git a/go.sum b/go.sum index fe68e505bba..47938240eba 100644 --- a/go.sum +++ b/go.sum @@ -1023,8 +1023,6 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= -github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= From c3e5dbc9d68fc9e091963d72d2e2c106a157ac2f Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Fri, 5 May 2023 15:40:41 +0200 Subject: [PATCH 25/34] Update x/globalfee/ante/fee.go Co-authored-by: yaruwangway <69694322+yaruwangway@users.noreply.github.com> --- x/globalfee/ante/fee.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 34b9d7f8289..c0e085c8140 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -57,7 +57,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return ctx, sdkerrors.Wrap(sdkerrors.ErrTxDecode, "Tx must implement the sdk.FeeTx interface") } - // Do not check minimum and global fees during simulations + // Do not check minimum-gas-prices and global fees during simulations if simulate { return next(ctx, tx, simulate) } From 00b3335ab69c41f233bb6f2c7fb50dd41844396a Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Mon, 8 May 2023 10:14:16 +0200 Subject: [PATCH 26/34] fix flag fees in e2e tests --- tests/e2e/e2e_exec_test.go | 9 +++------ tests/e2e/e2e_staking_test.go | 2 +- tests/e2e/e2e_vesting_test.go | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/e2e/e2e_exec_test.go b/tests/e2e/e2e_exec_test.go index 32f6c933e24..791cd6ea9e0 100644 --- a/tests/e2e/e2e_exec_test.go +++ b/tests/e2e/e2e_exec_test.go @@ -439,10 +439,8 @@ func (s *IntegrationTestSuite) executeDelegate(c *chain, valIdx int, amount, val amount, fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), - fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, delegateFees), "--keyring-backend=test", - fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), fmt.Sprintf("--%s=%s", flags.FlagHome, home), "--output=json", "-y", @@ -470,9 +468,8 @@ func (s *IntegrationTestSuite) executeRedelegate(c *chain, valIdx int, amount, o amount, fmt.Sprintf("--%s=%s", flags.FlagFrom, delegatorAddr), fmt.Sprintf("--%s=%s", flags.FlagChainID, c.id), - fmt.Sprintf("--%s=%s", flags.FlagGas, "auto"), - fmt.Sprintf("--%s=%s", flags.FlagFees, delegateFees), - fmt.Sprintf("--%s=%s", flags.FlagGasAdjustment, "1.5"), + fmt.Sprintf("--%s=%s", flags.FlagGas, "300000"), // default 200000 isn't enough + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, delegateFees), "--keyring-backend=test", fmt.Sprintf("--%s=%s", flags.FlagHome, home), "--output=json", diff --git a/tests/e2e/e2e_staking_test.go b/tests/e2e/e2e_staking_test.go index 592d4e23d43..b4a7b78a4dc 100644 --- a/tests/e2e/e2e_staking_test.go +++ b/tests/e2e/e2e_staking_test.go @@ -20,7 +20,7 @@ func (s *IntegrationTestSuite) testStaking() { delegatorAddress := s.chainA.genesisAccounts[2].keyInfo.GetAddress().String() - fees := sdk.NewCoin(uatomDenom, sdk.NewInt(10)) + fees := sdk.NewCoin(uatomDenom, sdk.NewInt(1)) delegationAmount := sdk.NewInt(500000000) delegation := sdk.NewCoin(uatomDenom, delegationAmount) // 500 atom diff --git a/tests/e2e/e2e_vesting_test.go b/tests/e2e/e2e_vesting_test.go index efc09dbbc88..70f13572596 100644 --- a/tests/e2e/e2e_vesting_test.go +++ b/tests/e2e/e2e_vesting_test.go @@ -38,7 +38,7 @@ var ( vestingAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(350000)) vestingBalance = sdk.NewCoins(vestingAmountVested).Add(vestingAmount) vestingDelegationAmount = sdk.NewCoin(uatomDenom, sdk.NewInt(500000000)) - vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(10)) + vestingDelegationFees = sdk.NewCoin(uatomDenom, sdk.NewInt(1)) ) func (s *IntegrationTestSuite) testDelayedVestingAccount(api string) { From 4ea31751630e37555d4f9896d82d3221df7ccda3 Mon Sep 17 00:00:00 2001 From: Yaru Wang Date: Wed, 10 May 2023 12:42:55 +0200 Subject: [PATCH 27/34] refactor: refactor fee check for readability --- x/globalfee/ante/fee.go | 77 +++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 567435f8023..beaf0e992c7 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -62,11 +62,6 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne return next(ctx, tx, simulate) } - // Sort fee tx's coins, zero coins in feeCoins are already removed - feeCoins := feeTx.GetFee().Sort() - gas := feeTx.GetGas() - msgs := feeTx.GetMsgs() - // Get the required fees according to the CheckTx or DeliverTx modes feeRequired, err := mfd.GetTxFeeRequired(ctx, feeTx) if err != nil { @@ -74,61 +69,77 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne } // reject the transaction early if the feeCoins have more denoms than the fee requirement - if feeCoins.Len() > feeRequired.Len() { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "fee is not a subset of required fees; got %s, required: %s", feeCoins.String(), feeRequired.String()) + if feeTx.GetFee().Len() > feeRequired.Len() { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "fee is not a subset of required fees; got %s, required: %s", feeTx.GetFee().String(), feeRequired.String()) } + // Sort fee tx's coins, zero coins in feeCoins are already removed + feeCoins := feeTx.GetFee().Sort() + gas := feeTx.GetGas() + msgs := feeTx.GetMsgs() + + // split feeRequired into zero and non-zero coins(nonZeroCoinFeesReq, zeroCoinFeesDenomReq), split feeCoins according to + // nonZeroCoinFeesReq, zeroCoinFeesDenomReq, + // so that feeCoins can be checked separately against them. nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired) // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequired - // // feeCoinsNoZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq // when feeCoins does not contain zero coins' denoms in feeRequired feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq) // Check that the fees are in expected denominations. - // if feeCoinsNoZeroDenom=[], DenomsSubsetOf returns true - // if feeCoinsNoZeroDenom is not empty, but nonZeroCoinFeesReq empty, return false + // according to splitCoinsByDenoms(), feeCoinsZeroDenom must be in denom subset of zeroCoinFeesDenomReq. + // check if feeCoinsNonZeroDenom is a subset of nonZeroCoinFeesReq. + // special case: if feeCoinsNoZeroDenom=[], DenomsSubsetOf returns true + // special case: if feeCoinsNoZeroDenom is not empty, but nonZeroCoinFeesReq empty, return false if !feeCoinsNonZeroDenom.DenomsSubsetOf(nonZeroCoinFeesReq) { return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "fee is not a subset of required fees; got %s, required: %s", feeCoins.String(), feeRequired.String()) } - // Accept zero fee transactions only if both of the following statements are true: + // If the feeCoins pass the denoms check, check they are bypass-msg types. // + // Bypass min fee requires: // - the tx contains only message types that can bypass the minimum fee, // see BypassMinFeeMsgTypes; // - the total gas limit per message does not exceed MaxTotalBypassMinFeeMsgGasUsage, // i.e., totalGas <= MaxTotalBypassMinFeeMsgGasUsage - // // Otherwise, minimum fees and global fees are checked to prevent spam. doesNotExceedMaxGasUsage := gas <= mfd.MaxTotalBypassMinFeeMsgGasUsage allowedToBypassMinFee := mfd.ContainsOnlyBypassMinFeeMsgs(msgs) && doesNotExceedMaxGasUsage + if allowedToBypassMinFee { + return next(ctx, tx, simulate) + } - // Either the transaction contains at least one message of a type - // that cannot bypass the minimum fee or the total gas limit exceeds - // the imposed threshold. As a result, besides check the fees are in - // expected denominations, check the amounts are greater or equal than - // the expected amounts. - - // only check feeCoinsNoZeroDenom has coins IsAnyGTE than nonZeroCoinFeesReq - // when feeCoins does not contain denoms of zero denoms in feeRequired - if !allowedToBypassMinFee && len(feeCoinsZeroDenom) == 0 { - // special case: when feeCoins=[] and there is zero coin in fee requirement - if len(feeCoins) == 0 && len(zeroCoinFeesDenomReq) != 0 { + // if the msg does not satisfy bypass condition and the feeCoins denoms are subset of feeRequired, + // check the feeCoins amount against feeRequired + // + // when feeCoins=[] + // special case: and there is zero coin in fee requirement, pass, + // otherwise, err + if len(feeCoins) == 0 { + if len(zeroCoinFeesDenomReq) != 0 { return next(ctx, tx, simulate) + } else { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String()) } + } - // Check that the amounts of the fees are greater or equal than - // the expected amounts, i.e., at least one feeCoin amount must - // be greater or equal to one of the combined required fees. + // when feeCoins != [] + // special case: if TX has at least one of the zeroCoinFeesDenomReq, then it should pass + if len(feeCoinsZeroDenom) > 0 { + return next(ctx, tx, simulate) + } - // if feeCoinsNoZeroDenom=[], return false - // if nonZeroCoinFeesReq=[], return false (this situation should not happen - // because when nonZeroCoinFeesReq empty, and DenomsSubsetOf check passed, - // the tx should already passed before) - if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String()) - } + // After all the checks, the tx is confirmed: + // feeCoins denoms subset off feeRequired + // Not bypass + // Not empty feeCoins + // Not cointain zeroCoinFeesDenomReq' denoms + // + // check if the feeCoins's feeCoinsNonZeroDenom part has coins' amount higher/equal to nonZeroCoinFeesReq + if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String()) } return next(ctx, tx, simulate) From 7864d5e729910e2f727a173674806f0aeb77bdb6 Mon Sep 17 00:00:00 2001 From: Yaru Wang Date: Wed, 10 May 2023 12:46:41 +0200 Subject: [PATCH 28/34] chore: fix typo --- x/globalfee/ante/fee.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index beaf0e992c7..3b233adbbfa 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -84,15 +84,15 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne nonZeroCoinFeesReq, zeroCoinFeesDenomReq := getNonZeroFees(feeRequired) // feeCoinsNonZeroDenom contains non-zero denominations from the feeRequired - // feeCoinsNoZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq + // feeCoinsNonZeroDenom is used to check if the fees meets the requirement imposed by nonZeroCoinFeesReq // when feeCoins does not contain zero coins' denoms in feeRequired feeCoinsNonZeroDenom, feeCoinsZeroDenom := splitCoinsByDenoms(feeCoins, zeroCoinFeesDenomReq) // Check that the fees are in expected denominations. // according to splitCoinsByDenoms(), feeCoinsZeroDenom must be in denom subset of zeroCoinFeesDenomReq. // check if feeCoinsNonZeroDenom is a subset of nonZeroCoinFeesReq. - // special case: if feeCoinsNoZeroDenom=[], DenomsSubsetOf returns true - // special case: if feeCoinsNoZeroDenom is not empty, but nonZeroCoinFeesReq empty, return false + // special case: if feeCoinsNonZeroDenom=[], DenomsSubsetOf returns true + // special case: if feeCoinsNonZeroDenom is not empty, but nonZeroCoinFeesReq empty, return false if !feeCoinsNonZeroDenom.DenomsSubsetOf(nonZeroCoinFeesReq) { return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "fee is not a subset of required fees; got %s, required: %s", feeCoins.String(), feeRequired.String()) } From fd84e3e3f34ed85ce3ea37e02e9b5d67adaa1193 Mon Sep 17 00:00:00 2001 From: Yaru Wang Date: Wed, 10 May 2023 12:55:13 +0200 Subject: [PATCH 29/34] chore: update comments --- x/globalfee/ante/fee.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 3b233adbbfa..f6af3d456d7 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -69,6 +69,7 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne } // reject the transaction early if the feeCoins have more denoms than the fee requirement + // feeRequired cannot be be empty if feeTx.GetFee().Len() > feeRequired.Len() { return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "fee is not a subset of required fees; got %s, required: %s", feeTx.GetFee().String(), feeRequired.String()) } @@ -134,8 +135,8 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne // After all the checks, the tx is confirmed: // feeCoins denoms subset off feeRequired // Not bypass - // Not empty feeCoins - // Not cointain zeroCoinFeesDenomReq' denoms + // feeCoins != [] + // Not contain zeroCoinFeesDenomReq's denoms // // check if the feeCoins's feeCoinsNonZeroDenom part has coins' amount higher/equal to nonZeroCoinFeesReq if !feeCoinsNonZeroDenom.IsAnyGTE(nonZeroCoinFeesReq) { From a4f34fef0fcd914796a09fd7f837cbf2da6ba43e Mon Sep 17 00:00:00 2001 From: Yaru Wang Date: Wed, 10 May 2023 13:13:55 +0200 Subject: [PATCH 30/34] refactor: change map[string]bool to map[string]struct{} --- x/globalfee/ante/fee_utils.go | 8 +++---- x/globalfee/ante/fee_utils_test.go | 36 +++++++++++++++--------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/x/globalfee/ante/fee_utils.go b/x/globalfee/ante/fee_utils.go index 41ea40d31ef..31c44aa3c2c 100644 --- a/x/globalfee/ante/fee_utils.go +++ b/x/globalfee/ante/fee_utils.go @@ -80,7 +80,7 @@ func Find(coins sdk.Coins, denom string) (bool, sdk.Coin) { // splitCoinsByDenoms returns the given coins split in two whether // their demon is or isn't found in the given denom map. -func splitCoinsByDenoms(feeCoins sdk.Coins, denomMap map[string]bool) (sdk.Coins, sdk.Coins) { +func splitCoinsByDenoms(feeCoins sdk.Coins, denomMap map[string]struct{}) (sdk.Coins, sdk.Coins) { feeCoinsNonZeroDenom, feeCoinsZeroDenom := sdk.Coins{}, sdk.Coins{} for _, fc := range feeCoins { @@ -97,13 +97,13 @@ func splitCoinsByDenoms(feeCoins sdk.Coins, denomMap map[string]bool) (sdk.Coins // getNonZeroFees returns the given fees nonzero coins // and a map storing the zero coins's denoms -func getNonZeroFees(fees sdk.Coins) (sdk.Coins, map[string]bool) { +func getNonZeroFees(fees sdk.Coins) (sdk.Coins, map[string]struct{}) { requiredFeesNonZero := sdk.Coins{} - requiredFeesZeroDenom := map[string]bool{} + requiredFeesZeroDenom := map[string]struct{}{} for _, gf := range fees { if gf.IsZero() { - requiredFeesZeroDenom[gf.Denom] = true + requiredFeesZeroDenom[gf.Denom] = struct{}{} } else { requiredFeesNonZero = append(requiredFeesNonZero, gf) } diff --git a/x/globalfee/ante/fee_utils_test.go b/x/globalfee/ante/fee_utils_test.go index 52c577f5f16..00d83be0fc0 100644 --- a/x/globalfee/ante/fee_utils_test.go +++ b/x/globalfee/ante/fee_utils_test.go @@ -162,16 +162,16 @@ func TestCombinedFeeRequirement(t *testing.T) { } func TestSplitCoinsByDenoms(t *testing.T) { - zeroGlobalFeesDenom0 := map[string]bool{} - zeroGlobalFeesDenom1 := map[string]bool{ - "uatom": true, - "photon": true, + zeroGlobalFeesDenom0 := map[string]struct{}{} + zeroGlobalFeesDenom1 := map[string]struct{}{ + "uatom": struct{}{}, + "photon": struct{}{}, } - zeroGlobalFeesDenom2 := map[string]bool{ - "uatom": true, + zeroGlobalFeesDenom2 := map[string]struct{}{ + "uatom": struct{}{}, } - zeroGlobalFeesDenom3 := map[string]bool{ - "stake": true, + zeroGlobalFeesDenom3 := map[string]struct{}{ + "stake": struct{}{}, } photon := sdk.NewCoin("photon", sdk.OneInt()) @@ -180,7 +180,7 @@ func TestSplitCoinsByDenoms(t *testing.T) { tests := map[string]struct { feeCoins sdk.Coins - zeroGlobalFeesDenom map[string]bool + zeroGlobalFeesDenom map[string]struct{} expectedNonZeroCoins sdk.Coins expectedZeroCoins sdk.Coins }{ @@ -238,31 +238,31 @@ func TestSplitGlobalFees(t *testing.T) { tests := map[string]struct { globalfees sdk.Coins - zeroGlobalFeesDenom map[string]bool + zeroGlobalFeesDenom map[string]struct{} globalfeesNonZero sdk.Coins }{ "empty global fees": { globalfees: globalFeesEmpty, - zeroGlobalFeesDenom: map[string]bool{}, + zeroGlobalFeesDenom: map[string]struct{}{}, globalfeesNonZero: sdk.Coins{}, }, "nonzero coins global fees": { globalfees: globalFees, - zeroGlobalFeesDenom: map[string]bool{}, + zeroGlobalFeesDenom: map[string]struct{}{}, globalfeesNonZero: globalFees, }, "zero coins global fees": { globalfees: globalFeesZeroCoins, - zeroGlobalFeesDenom: map[string]bool{ - "photon": true, - "uatom": true, + zeroGlobalFeesDenom: map[string]struct{}{ + "photon": struct{}{}, + "uatom": struct{}{}, }, globalfeesNonZero: sdk.Coins{}, }, "mix zero, nonzero coins global fees": { globalfees: globalFeesMix, - zeroGlobalFeesDenom: map[string]bool{ - "photon": true, + zeroGlobalFeesDenom: map[string]struct{}{ + "photon": struct{}{}, }, globalfeesNonZero: sdk.NewCoins(uatom1), }, @@ -277,7 +277,7 @@ func TestSplitGlobalFees(t *testing.T) { } } -func equalMap(a, b map[string]bool) bool { +func equalMap(a, b map[string]struct{}) bool { if len(a) != len(b) { return false } From 3988578112c35466fc0cd3fc797da12343104b3f Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 10 May 2023 14:54:33 +0200 Subject: [PATCH 31/34] fix linter --- x/globalfee/ante/fee.go | 3 +-- x/globalfee/ante/fee_utils_test.go | 14 +++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index f6af3d456d7..c53aa0284e7 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -121,9 +121,8 @@ func (mfd FeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, ne if len(feeCoins) == 0 { if len(zeroCoinFeesDenomReq) != 0 { return next(ctx, tx, simulate) - } else { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String()) } + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInsufficientFee, "insufficient fees; got: %s required: %s", feeCoins.String(), feeRequired.String()) } // when feeCoins != [] diff --git a/x/globalfee/ante/fee_utils_test.go b/x/globalfee/ante/fee_utils_test.go index 00d83be0fc0..8378e467135 100644 --- a/x/globalfee/ante/fee_utils_test.go +++ b/x/globalfee/ante/fee_utils_test.go @@ -164,14 +164,14 @@ func TestCombinedFeeRequirement(t *testing.T) { func TestSplitCoinsByDenoms(t *testing.T) { zeroGlobalFeesDenom0 := map[string]struct{}{} zeroGlobalFeesDenom1 := map[string]struct{}{ - "uatom": struct{}{}, - "photon": struct{}{}, + "uatom": {}, + "photon": {}, } zeroGlobalFeesDenom2 := map[string]struct{}{ - "uatom": struct{}{}, + "uatom": {}, } zeroGlobalFeesDenom3 := map[string]struct{}{ - "stake": struct{}{}, + "stake": {}, } photon := sdk.NewCoin("photon", sdk.OneInt()) @@ -254,15 +254,15 @@ func TestSplitGlobalFees(t *testing.T) { "zero coins global fees": { globalfees: globalFeesZeroCoins, zeroGlobalFeesDenom: map[string]struct{}{ - "photon": struct{}{}, - "uatom": struct{}{}, + "photon": {}, + "uatom": {}, }, globalfeesNonZero: sdk.Coins{}, }, "mix zero, nonzero coins global fees": { globalfees: globalFeesMix, zeroGlobalFeesDenom: map[string]struct{}{ - "photon": struct{}{}, + "photon": {}, }, globalfeesNonZero: sdk.NewCoins(uatom1), }, From 398fe54397b5e9009cf816ab23101e3708fccc72 Mon Sep 17 00:00:00 2001 From: Yaru Wang Date: Wed, 10 May 2023 16:17:43 +0200 Subject: [PATCH 32/34] add key check --- x/globalfee/ante/fee.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index c53aa0284e7..0d0f817ca0e 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -221,7 +221,9 @@ func (mfd FeeDecorator) getBondDenom(ctx sdk.Context) string { } var bondDenom string - mfd.StakingSubspace.Get(ctx, stakingtypes.KeyBondDenom, &bondDenom) + if mfd.StakingSubspace.Has(ctx, stakingtypes.KeyBondDenom) { + mfd.StakingSubspace.Get(ctx, stakingtypes.KeyBondDenom, &bondDenom) + } return bondDenom } From ec83ca24c80967faf6b97361602e7720a9a3597c Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 10 May 2023 16:33:02 +0200 Subject: [PATCH 33/34] remove unnecessary condition and improve test coverage --- x/globalfee/ante/antetest/fee_test.go | 5 ++--- x/globalfee/ante/fee.go | 7 +------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 7964232e141..71005855c22 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -6,7 +6,6 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ibcclienttypes "github.com/cosmos/ibc-go/v4/modules/core/02-client/types" ibcchanneltypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types" @@ -764,8 +763,8 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { // setup tests with default global fee i.e. "0uatom" and empty local min gas prices feeDecorator, _ := s.SetupTestGlobalFeeStoreAndMinGasPrice([]sdk.DecCoin{}, globalfeeParamsEmpty) - // reset decorator staking subspace - feeDecorator.StakingSubspace = paramtypes.Subspace{} + // set a subspace that doesn't have the stakingtypes.KeyBondDenom key registred + feeDecorator.StakingSubspace = s.app.GetSubspace(globfeetypes.ModuleName) // check that an error is returned when staking subspace isn't set _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) diff --git a/x/globalfee/ante/fee.go b/x/globalfee/ante/fee.go index 0d0f817ca0e..f75ccbf9cd2 100644 --- a/x/globalfee/ante/fee.go +++ b/x/globalfee/ante/fee.go @@ -214,13 +214,8 @@ func (mfd FeeDecorator) DefaultZeroGlobalFee(ctx sdk.Context) ([]sdk.DecCoin, er } func (mfd FeeDecorator) getBondDenom(ctx sdk.Context) string { - // prevent the getter above to panic - // when the staking subspace isn't set - if !mfd.StakingSubspace.HasKeyTable() { - return "" - } - var bondDenom string + if mfd.StakingSubspace.Has(ctx, stakingtypes.KeyBondDenom) { mfd.StakingSubspace.Get(ctx, stakingtypes.KeyBondDenom, &bondDenom) } From 952d3ff815cf41b937adaebce0d209194bb082c4 Mon Sep 17 00:00:00 2001 From: Simon Noetzlin Date: Wed, 10 May 2023 17:01:13 +0200 Subject: [PATCH 34/34] Update x/globalfee/ante/antetest/fee_test.go --- x/globalfee/ante/antetest/fee_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/globalfee/ante/antetest/fee_test.go b/x/globalfee/ante/antetest/fee_test.go index 71005855c22..2247cfb98c8 100644 --- a/x/globalfee/ante/antetest/fee_test.go +++ b/x/globalfee/ante/antetest/fee_test.go @@ -766,7 +766,7 @@ func (s *IntegrationTestSuite) TestGetTxFeeRequired() { // set a subspace that doesn't have the stakingtypes.KeyBondDenom key registred feeDecorator.StakingSubspace = s.app.GetSubspace(globfeetypes.ModuleName) - // check that an error is returned when staking subspace isn't set + // check that an error is returned when staking bond denom is empty _, err := feeDecorator.GetTxFeeRequired(s.ctx, nil) s.Require().Equal(err.Error(), "empty staking bond denomination")