From d619786978b2640ded4e9f40b2a493d29625d1b9 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 2 Sep 2022 18:39:46 +0200 Subject: [PATCH 01/51] adding fee stats table --- ante/fee-notes.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 ante/fee-notes.md diff --git a/ante/fee-notes.md b/ante/fee-notes.md new file mode 100644 index 0000000000..9fab32e34d --- /dev/null +++ b/ante/fee-notes.md @@ -0,0 +1,51 @@ +# Notes about Gas prices and gas used + +NOTES: + +- the gas used depends on the current state of the chain +- the gas records below are based on the empty state + +| operation | gas used | +| :--------------------------------------------- | -------: | +| x/bank send | 31029 | +| x/group create | 68908 | +| x/oracle MsgAggregateExchangeRateVote (3 curr) | 66251 | +| x/oracle MsgAggregateExchangeRateVote (6 curr) | 69726 | +| default gas limit | 200000 | + +### Target price (in USD cent) for x/bank send + +| umee price (usd cent) | gas price in uumee | fee (usd cent) | +| --------------------: | -----------------: | -------------: | +| 2 | 0.2 | 0.0124 | +| 2 | 0.1 | 0.0062 | +| 2 | 0.02 | 0.00124 | +| 5 | 0.2 | 0.031 | +| 5 | 0.1 | 0.0155 | +| 5 | 0.02 | 0.0031 | + +### Target price (in USD cent) for validator oracle txs (with 6 currencies) per day + +There are roughly 10tx / minute and 14400 per day. +Validator has to do 2 tx (prevote and vote) every 5 blocks. +Validator will need to do `5760 = 2*14400/5` tx. + +| umee price (usd cent) | gas price in uumee | fee (usd cent) | +| --------------------: | -----------------: | -------------: | +| 2 | 0.2 | 161.28 | +| 2 | 0.1 | 80.64 | +| 2 | 0.02 | 16.128 | +| 5 | 0.2 | 403.2 | +| 5 | 0.1 | 201.6 | +| 5 | 0.02 | 40.32 | + +### Target price (in USD) for default gas limit + +| umee price (usd cent) | gas price in uumee | fee (usd cent) | +| --------------------: | -----------------: | -------------: | +| 2 | 0.2 | 0.08 | +| 2 | 0.1 | 0.04 | +| 2 | 0.02 | 0.008 | +| 5 | 0.2 | 0.2 | +| 5 | 0.1 | 0.1 | +| 5 | 0.02 | 0.02 | From 7061206654fbd29eb794eb9e1fba200463fd3e58 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 2 Sep 2022 19:19:47 +0200 Subject: [PATCH 02/51] update --- ante/fee-notes.md | 1 + ante/spam_prevention.go | 1 + x/oracle/keeper/keeper.go | 13 ++++++------- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ante/fee-notes.md b/ante/fee-notes.md index 9fab32e34d..58cd67c06b 100644 --- a/ante/fee-notes.md +++ b/ante/fee-notes.md @@ -29,6 +29,7 @@ NOTES: There are roughly 10tx / minute and 14400 per day. Validator has to do 2 tx (prevote and vote) every 5 blocks. Validator will need to do `5760 = 2*14400/5` tx. +In table below we assume the same price scheme as above, but in the code most likely we will apply a fixed discount (eg 10x). | umee price (usd cent) | gas price in uumee | fee (usd cent) | | --------------------: | -----------------: | -------------: | diff --git a/ante/spam_prevention.go b/ante/spam_prevention.go index d3d3070650..24bdc07b76 100644 --- a/ante/spam_prevention.go +++ b/ante/spam_prevention.go @@ -64,6 +64,7 @@ func (spd *SpamPreventionDecorator) CheckOracleSpam(ctx sdk.Context, msgs []sdk. err = spd.validate(ctx, msg.Feeder, msg.Validator, spd.oracleVoteMap, curHeight, "vote") default: // non oracle msg: stop validation! + // NOTE: only tx which contain only oracle Msgs are considered oracle-prioritized return nil } if err != nil { diff --git a/x/oracle/keeper/keeper.go b/x/oracle/keeper/keeper.go index d36356bb46..cdffacf0df 100644 --- a/x/oracle/keeper/keeper.go +++ b/x/oracle/keeper/keeper.go @@ -158,19 +158,18 @@ func (k Keeper) IterateExchangeRates(ctx sdk.Context, handler func(string, sdk.D // GetFeederDelegation gets the account address to which the validator operator // delegated oracle vote rights. -func (k Keeper) GetFeederDelegation(ctx sdk.Context, operator sdk.ValAddress) (sdk.AccAddress, error) { +func (k Keeper) GetFeederDelegation(ctx sdk.Context, vAddr sdk.ValAddress) (sdk.AccAddress, error) { // check that the given validator exists - if val := k.StakingKeeper.Validator(ctx, operator); val == nil || !val.IsBonded() { - return nil, stakingtypes.ErrNoValidatorFound.Wrapf("validator %s is not in active set", operator) + if val := k.StakingKeeper.Validator(ctx, vAddr); val == nil || !val.IsBonded() { + return nil, stakingtypes.ErrNoValidatorFound.Wrapf("validator %s is not in active set", vAddr) } store := ctx.KVStore(k.storeKey) - bz := store.Get(types.GetFeederDelegationKey(operator)) + bz := store.Get(types.GetFeederDelegationKey(vAddr)) if bz == nil { - // by default the right is delegated to the validator itself - return sdk.AccAddress(operator), nil + // no delegation, so validator itself must provide price feed + return sdk.AccAddress(vAddr), nil } - return sdk.AccAddress(bz), nil } From 8b323d0439d4f2e020e085a0dd3dce109c076827 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 2 Sep 2022 20:07:31 +0200 Subject: [PATCH 03/51] move app constants to app/params --- ante/fee.go | 1 + app/app.go | 16 ---------------- app/modules.go | 22 ++++++++++++---------- app/params/app_settings.go | 22 ++++++++++++++++++++++ app/test_helpers.go | 19 ++++++++++--------- 5 files changed, 45 insertions(+), 35 deletions(-) create mode 100644 app/params/app_settings.go diff --git a/ante/fee.go b/ante/fee.go index 3505826ded..f9a92887e7 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -6,6 +6,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) diff --git a/app/app.go b/app/app.go index a858a62182..0948fff390 100644 --- a/app/app.go +++ b/app/app.go @@ -121,22 +121,6 @@ import ( oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) -const ( - // Name defines the application name of the Umee network. - Name = "umee" - - // BondDenom defines the native staking token denomination. - BondDenom = "uumee" - - // DisplayDenom defines the name, symbol, and display value of the umee token. - DisplayDenom = "UMEE" - - // MaxAddrLen is the maximum allowed length (in bytes) for an address. - // - // NOTE: In the SDK, the default value is 255. - MaxAddrLen = 20 -) - var ( _ CosmosApp = (*UmeeApp)(nil) _ servertypes.Application = (*UmeeApp)(nil) diff --git a/app/modules.go b/app/modules.go index c1cc68a792..69553cdde9 100644 --- a/app/modules.go +++ b/app/modules.go @@ -20,6 +20,8 @@ import ( slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + + "github.com/umee-network/umee/v3/app/params" ) // BankModule defines a custom wrapper around the x/bank module's AppModuleBasic @@ -32,20 +34,20 @@ type BankModule struct { func (BankModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { umeeMetadata := banktypes.Metadata{ Description: "The native staking token of the Umee network.", - Base: BondDenom, - Name: DisplayDenom, - Display: DisplayDenom, - Symbol: DisplayDenom, + Base: params.BondDenom, + Name: params.DisplayDenom, + Display: params.DisplayDenom, + Symbol: params.DisplayDenom, DenomUnits: []*banktypes.DenomUnit{ { - Denom: BondDenom, + Denom: params.BondDenom, Exponent: 0, Aliases: []string{ "microumee", }, }, { - Denom: DisplayDenom, + Denom: params.DisplayDenom, Exponent: 6, Aliases: []string{}, }, @@ -67,7 +69,7 @@ type StakingModule struct { // DefaultGenesis returns custom Umee x/staking module genesis state. func (StakingModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { params := stakingtypes.DefaultParams() - params.BondDenom = BondDenom + params.BondDenom = params.BondDenom return cdc.MustMarshalJSON(&stakingtypes.GenesisState{ Params: params, @@ -83,7 +85,7 @@ type CrisisModule struct { // DefaultGenesis returns custom Umee x/crisis module genesis state. func (CrisisModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(&crisistypes.GenesisState{ - ConstantFee: sdk.NewCoin(BondDenom, sdk.NewInt(1000)), + ConstantFee: sdk.NewCoin(params.BondDenom, sdk.NewInt(1000)), }) } @@ -96,7 +98,7 @@ type MintModule struct { // DefaultGenesis returns custom Umee x/mint module genesis state. func (MintModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { genState := minttypes.DefaultGenesisState() - genState.Params.MintDenom = BondDenom + genState.Params.MintDenom = params.BondDenom return cdc.MustMarshalJSON(genState) } @@ -109,7 +111,7 @@ type GovModule struct { // DefaultGenesis returns custom Umee x/gov module genesis state. func (GovModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - minDeposit := sdk.NewCoins(sdk.NewCoin(BondDenom, govv1.DefaultMinDepositTokens)) + minDeposit := sdk.NewCoins(sdk.NewCoin(params.BondDenom, govv1.DefaultMinDepositTokens)) genState := govv1.DefaultGenesisState() genState.DepositParams.MinDeposit = minDeposit diff --git a/app/params/app_settings.go b/app/params/app_settings.go new file mode 100644 index 0000000000..635e461493 --- /dev/null +++ b/app/params/app_settings.go @@ -0,0 +1,22 @@ +package params + +import sdk "github.com/cosmos/cosmos-sdk/types" + +const ( + // Name defines the application name of the Umee network. + Name = "umee" + + // BondDenom defines the native staking token denomination. + BondDenom = "uumee" + + // DisplayDenom defines the name, symbol, and display value of the umee token. + DisplayDenom = "UMEE" + + // MaxAddrLen is the maximum allowed length (in bytes) for an address. + // + // NOTE: In the SDK, the default value is 255. + MaxAddrLen = 20 +) + +// MinMinGasPrice is the minimum value a validator can set for `minimum-gas-prices` his app.toml config +var MinMinGasPrice = sdk.NewDecCoinFromDec(BondDenom, sdk.MustNewDecFromStr("0.05")) diff --git a/app/test_helpers.go b/app/test_helpers.go index 1e076b6784..23bb46c6ff 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -28,6 +28,7 @@ import ( tmtypes "github.com/tendermint/tendermint/types" dbm "github.com/tendermint/tm-db" + "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -71,7 +72,7 @@ func Setup(t *testing.T, isCheckTx bool, invCheckPeriod uint) *UmeeApp { acc := authtypes.NewBaseAccount(senderPrivKey.PubKey().Address().Bytes(), senderPrivKey.PubKey(), 0, 0) balance := banktypes.Balance{ Address: acc.GetAddress().String(), - Coins: sdk.NewCoins(sdk.NewCoin(BondDenom, sdk.NewInt(10000000000000000))), + Coins: sdk.NewCoins(sdk.NewCoin(params.BondDenom, sdk.NewInt(10000000000000000))), } app := SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, balance) @@ -168,7 +169,7 @@ func GenesisStateWithValSet(codec codec.Codec, genesisState map[string]json.RawM defaultStParams.MaxValidators, defaultStParams.MaxEntries, defaultStParams.HistoricalEntries, - BondDenom, + params.BondDenom, defaultStParams.MinCommissionRate, ) // set validators and delegations @@ -183,13 +184,13 @@ func GenesisStateWithValSet(codec codec.Codec, genesisState map[string]json.RawM for range delegations { // add delegated tokens to total supply - totalSupply = totalSupply.Add(sdk.NewCoin(BondDenom, bondAmt)) + totalSupply = totalSupply.Add(sdk.NewCoin(params.BondDenom, bondAmt)) } // add bonded amount to bonded pool module account balances = append(balances, banktypes.Balance{ Address: authtypes.NewModuleAddress(stakingtypes.BondedPoolName).String(), - Coins: sdk.Coins{sdk.NewCoin(BondDenom, bondAmt)}, + Coins: sdk.Coins{sdk.NewCoin(params.BondDenom, bondAmt)}, }) // update total supply @@ -241,8 +242,8 @@ func IntegrationTestNetworkConfig() network.Config { panic(err) } leverageGenState.Registry = append(leverageGenState.Registry, leveragetypes.Token{ - BaseDenom: BondDenom, - SymbolDenom: DisplayDenom, + BaseDenom: params.BondDenom, + SymbolDenom: params.DisplayDenom, Exponent: 6, ReserveFactor: sdk.MustNewDecFromStr("0.1"), CollateralWeight: sdk.MustNewDecFromStr("0.05"), @@ -276,7 +277,7 @@ func IntegrationTestNetworkConfig() network.Config { // are not running a price-feeder. oracleGenState.Params.VotePeriod = 1000 oracleGenState.ExchangeRates = append(oracleGenState.ExchangeRates, oracletypes.NewExchangeRateTuple( - DisplayDenom, sdk.MustNewDecFromStr("34.21"), + params.DisplayDenom, sdk.MustNewDecFromStr("34.21"), )) bz, err = cdc.MarshalJSON(&oracleGenState) @@ -304,8 +305,8 @@ func IntegrationTestNetworkConfig() network.Config { cfg.LegacyAmino = encCfg.Amino cfg.InterfaceRegistry = encCfg.InterfaceRegistry cfg.GenesisState = appGenState - cfg.BondDenom = BondDenom - cfg.MinGasPrices = fmt.Sprintf("0.000006%s", BondDenom) + cfg.BondDenom = params.BondDenom + cfg.MinGasPrices = fmt.Sprintf("0.000006%s", params.BondDenom) cfg.AppConstructor = func(val network.Validator) servertypes.Application { return New( val.Ctx.Logger, From 9cd92d143eb8795df263340af999b59297a5097e Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 2 Sep 2022 23:04:00 +0200 Subject: [PATCH 04/51] use appparams --- ante/fee.go | 2 +- app/app.go | 4 +-- app/modules.go | 27 +++++++++---------- app/params/app_settings.go | 10 ++++--- cmd/umeed/cmd/root.go | 5 ++-- cmd/umeed/main.go | 3 ++- tests/simulation/sim_test.go | 3 ++- x/leverage/client/tests/tests.go | 14 +++++----- x/leverage/keeper/exchange_rate_test.go | 4 +-- x/leverage/keeper/interest_test.go | 34 ++++++++++++------------ x/leverage/keeper/invariants_test.go | 10 +++---- x/leverage/keeper/oracle_test.go | 18 ++++++------- x/leverage/keeper/reserves_test.go | 8 +++--- x/leverage/keeper/suite_test.go | 5 ++-- x/leverage/simulation/operations_test.go | 19 ++++++------- x/leverage/types/keys_test.go | 8 +++--- x/oracle/client/tests/suite.go | 4 +-- x/oracle/keeper/grpc_query_test.go | 4 +-- x/oracle/keeper/hooks_test.go | 6 ++--- x/oracle/keeper/keeper_test.go | 7 ++--- x/oracle/types/asset.go | 4 ++- x/oracle/types/keys_test.go | 5 ++-- 22 files changed, 108 insertions(+), 96 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index f9a92887e7..6d185124d6 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -6,7 +6,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - "github.com/umee-network/umee/v3/app/params" + // appparmas "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) diff --git a/app/app.go b/app/app.go index 0948fff390..e91ea4b788 100644 --- a/app/app.go +++ b/app/app.go @@ -239,7 +239,7 @@ func init() { panic(fmt.Sprintf("failed to get user home directory: %s", err)) } - DefaultNodeHome = filepath.Join(userHomeDir, fmt.Sprintf(".%s", Name)) + DefaultNodeHome = filepath.Join(userHomeDir, fmt.Sprintf(".%s", appparams.Name)) // XXX: If other upstream or external application's depend on any of Umee's // CLI or command functionality, then this would require us to move the @@ -264,7 +264,7 @@ func New( legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry - bApp := baseapp.NewBaseApp(Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) + bApp := baseapp.NewBaseApp(appparams.Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...) bApp.SetCommitMultiStoreTracer(traceStore) // TODO // bApp.SetVersion(version.Version) diff --git a/app/modules.go b/app/modules.go index 69553cdde9..08e552d5e8 100644 --- a/app/modules.go +++ b/app/modules.go @@ -21,7 +21,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/staking" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" - "github.com/umee-network/umee/v3/app/params" + appparams "github.com/umee-network/umee/v3/app/params" ) // BankModule defines a custom wrapper around the x/bank module's AppModuleBasic @@ -34,20 +34,20 @@ type BankModule struct { func (BankModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { umeeMetadata := banktypes.Metadata{ Description: "The native staking token of the Umee network.", - Base: params.BondDenom, - Name: params.DisplayDenom, - Display: params.DisplayDenom, - Symbol: params.DisplayDenom, + Base: appparams.BondDenom, + Name: appparams.DisplayDenom, + Display: appparams.DisplayDenom, + Symbol: appparams.DisplayDenom, DenomUnits: []*banktypes.DenomUnit{ { - Denom: params.BondDenom, + Denom: appparams.BondDenom, Exponent: 0, Aliases: []string{ "microumee", }, }, { - Denom: params.DisplayDenom, + Denom: appparams.DisplayDenom, Exponent: 6, Aliases: []string{}, }, @@ -68,11 +68,10 @@ type StakingModule struct { // DefaultGenesis returns custom Umee x/staking module genesis state. func (StakingModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - params := stakingtypes.DefaultParams() - params.BondDenom = params.BondDenom - + p := stakingtypes.DefaultParams() + p.BondDenom = appparams.BondDenom return cdc.MustMarshalJSON(&stakingtypes.GenesisState{ - Params: params, + Params: p, }) } @@ -85,7 +84,7 @@ type CrisisModule struct { // DefaultGenesis returns custom Umee x/crisis module genesis state. func (CrisisModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(&crisistypes.GenesisState{ - ConstantFee: sdk.NewCoin(params.BondDenom, sdk.NewInt(1000)), + ConstantFee: sdk.NewCoin(appparams.BondDenom, sdk.NewInt(1000)), }) } @@ -98,7 +97,7 @@ type MintModule struct { // DefaultGenesis returns custom Umee x/mint module genesis state. func (MintModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { genState := minttypes.DefaultGenesisState() - genState.Params.MintDenom = params.BondDenom + genState.Params.MintDenom = appparams.BondDenom return cdc.MustMarshalJSON(genState) } @@ -111,7 +110,7 @@ type GovModule struct { // DefaultGenesis returns custom Umee x/gov module genesis state. func (GovModule) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - minDeposit := sdk.NewCoins(sdk.NewCoin(params.BondDenom, govv1.DefaultMinDepositTokens)) + minDeposit := sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, govv1.DefaultMinDepositTokens)) genState := govv1.DefaultGenesisState() genState.DepositParams.MinDeposit = minDeposit diff --git a/app/params/app_settings.go b/app/params/app_settings.go index 635e461493..2e8edb66e0 100644 --- a/app/params/app_settings.go +++ b/app/params/app_settings.go @@ -1,6 +1,8 @@ package params -import sdk "github.com/cosmos/cosmos-sdk/types" +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) const ( // Name defines the application name of the Umee network. @@ -18,5 +20,7 @@ const ( MaxAddrLen = 20 ) -// MinMinGasPrice is the minimum value a validator can set for `minimum-gas-prices` his app.toml config -var MinMinGasPrice = sdk.NewDecCoinFromDec(BondDenom, sdk.MustNewDecFromStr("0.05")) +var ( + // MinMinGasPrice is the minimum value a validator can set for `minimum-gas-prices` his app.toml config + MinMinGasPrice = sdk.NewDecCoinFromDec(BondDenom, sdk.MustNewDecFromStr("0.05")) +) diff --git a/cmd/umeed/cmd/root.go b/cmd/umeed/cmd/root.go index c94ba1c47c..472624953a 100644 --- a/cmd/umeed/cmd/root.go +++ b/cmd/umeed/cmd/root.go @@ -24,6 +24,7 @@ import ( umeeapp "github.com/umee-network/umee/v3/app" "github.com/umee-network/umee/v3/app/params" + appparams "github.com/umee-network/umee/v3/app/params" ) // NewRootCmd returns the root command handler for the Umee daemon. @@ -40,10 +41,10 @@ func NewRootCmd() (*cobra.Command, params.EncodingConfig) { WithAccountRetriever(types.AccountRetriever{}). WithBroadcastMode(flags.BroadcastBlock). WithHomeDir(umeeapp.DefaultNodeHome). - WithViper(umeeapp.Name) + WithViper(appparams.Name) rootCmd := &cobra.Command{ - Use: umeeapp.Name + "d", + Use: appparams.Name + "d", Short: "Umee application network daemon and client", Long: `A daemon and client for interacting with the Umee network. Umee is a Universal Capital Facility that can collateralize assets on one blockchain diff --git a/cmd/umeed/main.go b/cmd/umeed/main.go index 8483e7d4a0..dea9658196 100644 --- a/cmd/umeed/main.go +++ b/cmd/umeed/main.go @@ -7,12 +7,13 @@ import ( svrcmd "github.com/cosmos/cosmos-sdk/server/cmd" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/cmd/umeed/cmd" ) func main() { rootCmd, _ := cmd.NewRootCmd() - if err := svrcmd.Execute(rootCmd, strings.ToUpper(umeeapp.Name), umeeapp.DefaultNodeHome); err != nil { + if err := svrcmd.Execute(rootCmd, strings.ToUpper(appparams.Name), umeeapp.DefaultNodeHome); err != nil { os.Exit(1) } } diff --git a/tests/simulation/sim_test.go b/tests/simulation/sim_test.go index ee2091f95d..a70c767cb5 100644 --- a/tests/simulation/sim_test.go +++ b/tests/simulation/sim_test.go @@ -20,6 +20,7 @@ import ( dbm "github.com/tendermint/tm-db" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) func init() { @@ -75,7 +76,7 @@ func TestFullAppSimulation(t *testing.T) { umeeapp.EmptyAppOptions{}, fauxMerkleModeOpt, ) - require.Equal(t, umeeapp.Name, app.Name()) + require.Equal(t, appparams.Name, app.Name()) // run randomized simulation _, simParams, simErr := simulation.SimulateFromSeed( diff --git a/x/leverage/client/tests/tests.go b/x/leverage/client/tests/tests.go index e05ca96012..20fafbb45f 100644 --- a/x/leverage/client/tests/tests.go +++ b/x/leverage/client/tests/tests.go @@ -3,7 +3,7 @@ package tests import ( sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage/client/cli" "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -72,8 +72,8 @@ func (s *IntegrationTestSuite) TestLeverageScenario() { Registry: []types.Token{ { // must match app/test_helpers.go/IntegrationTestNetworkConfig - BaseDenom: umeeapp.BondDenom, - SymbolDenom: umeeapp.DisplayDenom, + BaseDenom: appparams.BondDenom, + SymbolDenom: appparams.DisplayDenom, Exponent: 6, ReserveFactor: sdk.MustNewDecFromStr("0.1"), CollateralWeight: sdk.MustNewDecFromStr("0.05"), @@ -98,7 +98,7 @@ func (s *IntegrationTestSuite) TestLeverageScenario() { "query market summary - zero supply", cli.GetCmdQueryMarketSummary(), []string{ - umeeapp.BondDenom, + appparams.BondDenom, }, false, &types.QueryMarketSummaryResponse{}, @@ -213,13 +213,13 @@ func (s *IntegrationTestSuite) TestLeverageScenario() { &types.QueryAccountBalancesResponse{}, &types.QueryAccountBalancesResponse{ Supplied: sdk.NewCoins( - sdk.NewInt64Coin(umeeapp.BondDenom, 1000), + sdk.NewInt64Coin(appparams.BondDenom, 1000), ), Collateral: sdk.NewCoins( - sdk.NewInt64Coin(types.ToUTokenDenom(umeeapp.BondDenom), 1000), + sdk.NewInt64Coin(types.ToUTokenDenom(appparams.BondDenom), 1000), ), Borrowed: sdk.NewCoins( - sdk.NewInt64Coin(umeeapp.BondDenom, 51), + sdk.NewInt64Coin(appparams.BondDenom, 51), ), }, }, diff --git a/x/leverage/keeper/exchange_rate_test.go b/x/leverage/keeper/exchange_rate_test.go index d215b73351..f7088e6398 100644 --- a/x/leverage/keeper/exchange_rate_test.go +++ b/x/leverage/keeper/exchange_rate_test.go @@ -3,7 +3,7 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) func (s *IntegrationTestSuite) TestDeriveExchangeRate() { @@ -27,6 +27,6 @@ func (s *IntegrationTestSuite) TestDeriveExchangeRate() { // = 2.7 // get derived exchange rate - rate := app.LeverageKeeper.DeriveExchangeRate(ctx, umeeapp.BondDenom) + rate := app.LeverageKeeper.DeriveExchangeRate(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("2.7"), rate) } diff --git a/x/leverage/keeper/interest_test.go b/x/leverage/keeper/interest_test.go index a88fc6da9a..140943f5e7 100644 --- a/x/leverage/keeper/interest_test.go +++ b/x/leverage/keeper/interest_test.go @@ -3,7 +3,7 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) func (s *IntegrationTestSuite) TestAccrueZeroInterest() { @@ -15,11 +15,11 @@ func (s *IntegrationTestSuite) TestAccrueZeroInterest() { s.collateralize(addr, coin("u/"+umeeDenom, 1000_000000)) // user borrows 40 umee - s.borrow(addr, coin(umeeapp.BondDenom, 40_000000)) + s.borrow(addr, coin(appparams.BondDenom, 40_000000)) // verify user's loan amount (40 umee) - loanBalance := app.LeverageKeeper.GetBorrow(ctx, addr, umeeapp.BondDenom) - require.Equal(coin(umeeapp.BondDenom, 40_000000), loanBalance) + loanBalance := app.LeverageKeeper.GetBorrow(ctx, addr, appparams.BondDenom) + require.Equal(coin(appparams.BondDenom, 40_000000), loanBalance) // Because no time has passed since genesis (due to test setup) this will not // increase borrowed amount. @@ -27,18 +27,18 @@ func (s *IntegrationTestSuite) TestAccrueZeroInterest() { require.NoError(err) // verify user's loan amount (40 umee) - loanBalance = app.LeverageKeeper.GetBorrow(ctx, addr, umeeapp.BondDenom) - require.Equal(coin(umeeapp.BondDenom, 40_000000), loanBalance) + loanBalance = app.LeverageKeeper.GetBorrow(ctx, addr, appparams.BondDenom) + require.Equal(coin(appparams.BondDenom, 40_000000), loanBalance) // borrow APY at utilization = 4% // when kink utilization = 80%, and base/kink APY are 0.02 and 0.22 - borrowAPY := app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + borrowAPY := app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.03"), borrowAPY) // supply APY when borrow APY is 3% // and utilization is 4%, and reservefactor is 20%, and OracleRewardFactor is 1% // 0.03 * 0.04 * (1 - 0.21) = 0.000948 - supplyAPY := app.LeverageKeeper.DeriveSupplyAPY(ctx, umeeapp.BondDenom) + supplyAPY := app.LeverageKeeper.DeriveSupplyAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.000948"), supplyAPY) } @@ -51,35 +51,35 @@ func (s *IntegrationTestSuite) TestDynamicInterest() { s.collateralize(addr, coin("u/"+umeeDenom, 1000_000000)) // Base interest rate (0% utilization) - rate := app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + rate := app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.02"), rate) // user borrows 200 umee, utilization 200/1000 - s.borrow(addr, coin(umeeapp.BondDenom, 200_000000)) + s.borrow(addr, coin(appparams.BondDenom, 200_000000)) // Between base interest and kink (20% utilization) - rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.07"), rate) // user borrows 600 more umee (ignores collateral), utilization 800/1000 - s.forceBorrow(addr, coin(umeeapp.BondDenom, 600_000000)) + s.forceBorrow(addr, coin(appparams.BondDenom, 600_000000)) // Kink interest rate (80% utilization) - rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.22"), rate) // user borrows 100 more umee (ignores collateral), utilization 900/1000 - s.forceBorrow(addr, coin(umeeapp.BondDenom, 100_000000)) + s.forceBorrow(addr, coin(appparams.BondDenom, 100_000000)) // Between kink interest and max (90% utilization) - rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("0.87"), rate) // user borrows 100 more umee (ignores collateral), utilization 1000/1000 - s.forceBorrow(addr, coin(umeeapp.BondDenom, 100_000000)) + s.forceBorrow(addr, coin(appparams.BondDenom, 100_000000)) // Max interest rate (100% utilization) - rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, umeeapp.BondDenom) + rate = app.LeverageKeeper.DeriveBorrowAPY(ctx, appparams.BondDenom) require.Equal(sdk.MustNewDecFromStr("1.52"), rate) } diff --git a/x/leverage/keeper/invariants_test.go b/x/leverage/keeper/invariants_test.go index b398454ab5..a25138628b 100644 --- a/x/leverage/keeper/invariants_test.go +++ b/x/leverage/keeper/invariants_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage/keeper" "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -10,7 +10,7 @@ func (s *IntegrationTestSuite) TestReserveAmountInvariant() { app, ctx, require := s.app, s.ctx, s.Require() // artificially set reserves - s.setReserves(coin(umeeapp.BondDenom, 300_000000)) + s.setReserves(coin(appparams.BondDenom, 300_000000)) // check invariants _, broken := keeper.ReserveAmountInvariant(app.LeverageKeeper)(ctx) @@ -29,7 +29,7 @@ func (s *IntegrationTestSuite) TestCollateralAmountInvariant() { _, broken := keeper.CollateralAmountInvariant(app.LeverageKeeper)(ctx) require.False(broken) - uTokenDenom := types.ToUTokenDenom(umeeapp.BondDenom) + uTokenDenom := types.ToUTokenDenom(appparams.BondDenom) // withdraw the supplied umee in the initBorrowScenario s.withdraw(addr, coin(uTokenDenom, 1000_000000)) @@ -48,7 +48,7 @@ func (s *IntegrationTestSuite) TestBorrowAmountInvariant() { s.collateralize(addr, coin("u/"+umeeDenom, 1000_000000)) // user borrows 20 umee - s.borrow(addr, coin(umeeapp.BondDenom, 20_000000)) + s.borrow(addr, coin(appparams.BondDenom, 20_000000)) // check invariant _, broken := keeper.BorrowAmountInvariant(app.LeverageKeeper)(ctx) @@ -56,7 +56,7 @@ func (s *IntegrationTestSuite) TestBorrowAmountInvariant() { // user repays 30 umee, actually only 20 because is the min between // the amount borrowed and the amount repaid - _, err := app.LeverageKeeper.Repay(ctx, addr, coin(umeeapp.BondDenom, 30_000000)) + _, err := app.LeverageKeeper.Repay(ctx, addr, coin(appparams.BondDenom, 30_000000)) require.NoError(err) // check invariant diff --git a/x/leverage/keeper/oracle_test.go b/x/leverage/keeper/oracle_test.go index 3c6bacfddc..2cdb682c21 100644 --- a/x/leverage/keeper/oracle_test.go +++ b/x/leverage/keeper/oracle_test.go @@ -5,7 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -43,15 +43,15 @@ func (m *mockOracleKeeper) GetExchangeRateBase(ctx sdk.Context, denom string) (s func (m *mockOracleKeeper) Reset() { m.exchangeRates = map[string]sdk.Dec{ - umeeapp.BondDenom: sdk.MustNewDecFromStr("4.21"), - atomDenom: sdk.MustNewDecFromStr("39.38"), + appparams.BondDenom: sdk.MustNewDecFromStr("4.21"), + atomDenom: sdk.MustNewDecFromStr("39.38"), } } func (s *IntegrationTestSuite) TestOracle_TokenPrice() { app, ctx, require := s.app, s.ctx, s.Require() - p, err := app.LeverageKeeper.TokenPrice(ctx, umeeapp.BondDenom) + p, err := app.LeverageKeeper.TokenPrice(ctx, appparams.BondDenom) require.NoError(err) require.Equal(sdk.MustNewDecFromStr("0.00000421"), p) @@ -68,7 +68,7 @@ func (s *IntegrationTestSuite) TestOracle_TokenValue() { app, ctx, require := s.app, s.ctx, s.Require() // 2.4 UMEE * $4.21 - v, err := app.LeverageKeeper.TokenValue(ctx, coin(umeeapp.BondDenom, 2_400000)) + v, err := app.LeverageKeeper.TokenValue(ctx, coin(appparams.BondDenom, 2_400000)) require.NoError(err) require.Equal(sdk.MustNewDecFromStr("10.104"), v) @@ -84,7 +84,7 @@ func (s *IntegrationTestSuite) TestOracle_TotalTokenValue() { v, err := app.LeverageKeeper.TotalTokenValue( ctx, sdk.NewCoins( - coin(umeeapp.BondDenom, 2_400000), + coin(appparams.BondDenom, 2_400000), coin(atomDenom, 4_700000), ), ) @@ -95,7 +95,7 @@ func (s *IntegrationTestSuite) TestOracle_TotalTokenValue() { v, err = app.LeverageKeeper.TotalTokenValue( ctx, sdk.NewCoins( - coin(umeeapp.BondDenom, 2_400000), + coin(appparams.BondDenom, 2_400000), coin(atomDenom, 4_700000), coin("foo", 4_700000), ), @@ -107,7 +107,7 @@ func (s *IntegrationTestSuite) TestOracle_TotalTokenValue() { func (s *IntegrationTestSuite) TestOracle_PriceRatio() { app, ctx, require := s.app, s.ctx, s.Require() - r, err := app.LeverageKeeper.PriceRatio(ctx, umeeapp.BondDenom, atomDenom) + r, err := app.LeverageKeeper.PriceRatio(ctx, appparams.BondDenom, atomDenom) require.NoError(err) // $4.21 / $39.38 require.Equal(sdk.MustNewDecFromStr("0.106907059421025901"), r) @@ -115,6 +115,6 @@ func (s *IntegrationTestSuite) TestOracle_PriceRatio() { _, err = app.LeverageKeeper.PriceRatio(ctx, "foo", atomDenom) require.ErrorIs(err, types.ErrNotRegisteredToken) - _, err = app.LeverageKeeper.PriceRatio(ctx, umeeapp.BondDenom, "foo") + _, err = app.LeverageKeeper.PriceRatio(ctx, appparams.BondDenom, "foo") require.ErrorIs(err, types.ErrNotRegisteredToken) } diff --git a/x/leverage/keeper/reserves_test.go b/x/leverage/keeper/reserves_test.go index f098bb3992..24f94ecccc 100644 --- a/x/leverage/keeper/reserves_test.go +++ b/x/leverage/keeper/reserves_test.go @@ -3,20 +3,20 @@ package keeper_test import ( sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) func (s *IntegrationTestSuite) TestSetReserves() { app, ctx, require := s.app, s.ctx, s.Require() // get initial reserves - amount := app.LeverageKeeper.GetReserveAmount(ctx, umeeapp.BondDenom) + amount := app.LeverageKeeper.GetReserveAmount(ctx, appparams.BondDenom) require.Equal(sdk.ZeroInt(), amount) // artifically reserve 200 umee - s.setReserves(coin(umeeapp.BondDenom, 200_000000)) + s.setReserves(coin(appparams.BondDenom, 200_000000)) // get new reserves - amount = app.LeverageKeeper.GetReserveAmount(ctx, umeeapp.BondDenom) + amount = app.LeverageKeeper.GetReserveAmount(ctx, appparams.BondDenom) require.Equal(sdk.NewInt(200_000000), amount) } diff --git a/x/leverage/keeper/suite_test.go b/x/leverage/keeper/suite_test.go index 55e3f1f9ab..b79e3c0260 100644 --- a/x/leverage/keeper/suite_test.go +++ b/x/leverage/keeper/suite_test.go @@ -14,6 +14,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage" "github.com/umee-network/umee/v3/x/leverage/fixtures" "github.com/umee-network/umee/v3/x/leverage/keeper" @@ -21,7 +22,7 @@ import ( ) const ( - umeeDenom = umeeapp.BondDenom + umeeDenom = appparams.BondDenom atomDenom = fixtures.AtomDenom ) @@ -48,7 +49,7 @@ func (s *IntegrationTestSuite) SetupTest() { Time: time.Unix(0, 0), }) - umeeToken := newToken(umeeapp.BondDenom, "UMEE") + umeeToken := newToken(appparams.BondDenom, "UMEE") atomIBCToken := newToken(atomDenom, "ATOM") // we only override the Leverage keeper so we can supply a custom mock oracle diff --git a/x/leverage/simulation/operations_test.go b/x/leverage/simulation/operations_test.go index 5a16644ea3..38328cc593 100644 --- a/x/leverage/simulation/operations_test.go +++ b/x/leverage/simulation/operations_test.go @@ -13,6 +13,7 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage" "github.com/umee-network/umee/v3/x/leverage/fixtures" "github.com/umee-network/umee/v3/x/leverage/simulation" @@ -132,7 +133,7 @@ func (s *SimTestSuite) TestSimulateMsgSupply() { func (s *SimTestSuite) TestSimulateMsgWithdraw() { r := rand.New(rand.NewSource(1)) - supplyToken := sdk.NewCoin(umeeapp.BondDenom, sdk.NewInt(10_000000)) + supplyToken := sdk.NewCoin(appparams.BondDenom, sdk.NewInt(10_000000)) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { _, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) @@ -155,7 +156,7 @@ func (s *SimTestSuite) TestSimulateMsgWithdraw() { func (s *SimTestSuite) TestSimulateMsgBorrow() { r := rand.New(rand.NewSource(8)) - supplyToken := sdk.NewCoin(umeeapp.BondDenom, sdk.NewInt(10_000000)) + supplyToken := sdk.NewCoin(appparams.BondDenom, sdk.NewInt(10_000000)) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { uToken, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) @@ -180,7 +181,7 @@ func (s *SimTestSuite) TestSimulateMsgBorrow() { func (s *SimTestSuite) TestSimulateMsgCollateralize() { r := rand.New(rand.NewSource(1)) - supplyToken := sdk.NewInt64Coin(umeeapp.BondDenom, 10_000000) + supplyToken := sdk.NewInt64Coin(appparams.BondDenom, 10_000000) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { _, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) @@ -202,7 +203,7 @@ func (s *SimTestSuite) TestSimulateMsgCollateralize() { func (s *SimTestSuite) TestSimulateMsgDecollateralize() { r := rand.New(rand.NewSource(1)) - supplyToken := sdk.NewInt64Coin(umeeapp.BondDenom, 10_000000) + supplyToken := sdk.NewInt64Coin(appparams.BondDenom, 10_000000) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { uToken, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) @@ -225,8 +226,8 @@ func (s *SimTestSuite) TestSimulateMsgDecollateralize() { func (s *SimTestSuite) TestSimulateMsgRepay() { r := rand.New(rand.NewSource(1)) - supplyToken := sdk.NewInt64Coin(umeeapp.BondDenom, 10_000000) - borrowToken := sdk.NewInt64Coin(umeeapp.BondDenom, 1_000000) + supplyToken := sdk.NewInt64Coin(appparams.BondDenom, 10_000000) + borrowToken := sdk.NewInt64Coin(appparams.BondDenom, 1_000000) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { uToken, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) @@ -250,9 +251,9 @@ func (s *SimTestSuite) TestSimulateMsgRepay() { func (s *SimTestSuite) TestSimulateMsgLiquidate() { r := rand.New(rand.NewSource(1)) - supplyToken := sdk.NewCoin(umeeapp.BondDenom, sdk.NewInt(10_000000)) - uToken := sdk.NewCoin("u/"+umeeapp.BondDenom, sdk.NewInt(10_000000)) - borrowToken := sdk.NewCoin(umeeapp.BondDenom, sdk.NewInt(1_000000)) + supplyToken := sdk.NewCoin(appparams.BondDenom, sdk.NewInt(10_000000)) + uToken := sdk.NewCoin("u/"+appparams.BondDenom, sdk.NewInt(10_000000)) + borrowToken := sdk.NewCoin(appparams.BondDenom, sdk.NewInt(1_000000)) accs := s.getTestingAccounts(r, 3, func(fundedAccount simtypes.Account) { _, err := s.app.LeverageKeeper.Supply(s.ctx, fundedAccount.Address, supplyToken) diff --git a/x/leverage/types/keys_test.go b/x/leverage/types/keys_test.go index d1f0050587..90d66e431a 100644 --- a/x/leverage/types/keys_test.go +++ b/x/leverage/types/keys_test.go @@ -7,13 +7,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/leverage/types" ) func TestAddressFromKey(t *testing.T) { address := sdk.AccAddress([]byte("addr________________")) - key := types.CreateAdjustedBorrowKey(address, umeeapp.BondDenom) + key := types.CreateAdjustedBorrowKey(address, appparams.BondDenom) expectedAddress := types.AddressFromKey(key, types.KeyPrefixAdjustedBorrow) require.Equal(t, address, expectedAddress) @@ -27,7 +27,7 @@ func TestAddressFromKey(t *testing.T) { func TestDenomFromKeyWithAddress(t *testing.T) { address := sdk.AccAddress([]byte("addr________________")) - denom := umeeapp.BondDenom + denom := appparams.BondDenom key := types.CreateAdjustedBorrowKey(address, denom) expectedDenom := types.DenomFromKeyWithAddress(key, types.KeyPrefixAdjustedBorrow) @@ -41,7 +41,7 @@ func TestDenomFromKeyWithAddress(t *testing.T) { } func TestDenomFromKey(t *testing.T) { - denom := umeeapp.BondDenom + denom := appparams.BondDenom key := types.CreateReserveAmountKey(denom) expectedDenom := types.DenomFromKey(key, types.KeyPrefixReserveAmount) diff --git a/x/oracle/client/tests/suite.go b/x/oracle/client/tests/suite.go index d5c83a0cac..253dc291f7 100644 --- a/x/oracle/client/tests/suite.go +++ b/x/oracle/client/tests/suite.go @@ -12,7 +12,7 @@ import ( "github.com/tendermint/tendermint/crypto/secp256k1" tmcli "github.com/tendermint/tendermint/libs/cli" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/oracle/client/cli" "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -176,7 +176,7 @@ func (s *IntegrationTestSuite) TestQueryExchangeRates() { s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &res)) s.Require().Len(res.ExchangeRates, 1) - s.Require().Equal(res.ExchangeRates[0].Denom, umeeapp.DisplayDenom) + s.Require().Equal(res.ExchangeRates[0].Denom, appparams.DisplayDenom) s.Require().False(res.ExchangeRates[0].Amount.IsZero()) } diff --git a/x/oracle/keeper/grpc_query_test.go b/x/oracle/keeper/grpc_query_test.go index f804908835..ea87300922 100644 --- a/x/oracle/keeper/grpc_query_test.go +++ b/x/oracle/keeper/grpc_query_test.go @@ -6,7 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/tendermint/tendermint/crypto/secp256k1" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/oracle/keeper" "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -117,7 +117,7 @@ func (s *IntegrationTestSuite) TestQuerier_AggregatePrevotes() { func (s *IntegrationTestSuite) TestQuerier_AggregateVote() { var tuples types.ExchangeRateTuples tuples = append(tuples, types.ExchangeRateTuple{ - Denom: umeeapp.DisplayDenom, + Denom: appparams.DisplayDenom, ExchangeRate: sdk.ZeroDec(), }) diff --git a/x/oracle/keeper/hooks_test.go b/x/oracle/keeper/hooks_test.go index 3338dccab5..1616ad570d 100644 --- a/x/oracle/keeper/hooks_test.go +++ b/x/oracle/keeper/hooks_test.go @@ -1,7 +1,7 @@ package keeper_test import ( - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -11,8 +11,8 @@ func (s *IntegrationTestSuite) TestHooks_AfterTokenRegistered() { // require that an existing token does not change the accept list h.AfterTokenRegistered(s.ctx, leveragetypes.Token{ - BaseDenom: umeeapp.BondDenom, - SymbolDenom: umeeapp.DisplayDenom, + BaseDenom: appparams.BondDenom, + SymbolDenom: appparams.DisplayDenom, Exponent: 6, }) s.Require().Len(s.app.OracleKeeper.AcceptList(s.ctx), 1) diff --git a/x/oracle/keeper/keeper_test.go b/x/oracle/keeper/keeper_test.go index 61ff0a1e82..ec63b00356 100644 --- a/x/oracle/keeper/keeper_test.go +++ b/x/oracle/keeper/keeper_test.go @@ -20,13 +20,14 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/oracle/keeper" "github.com/umee-network/umee/v3/x/oracle/types" ) const ( - displayDenom string = umeeapp.DisplayDenom - bondDenom string = umeeapp.BondDenom + displayDenom string = appparams.DisplayDenom + bondDenom string = appparams.BondDenom ) type IntegrationTestSuite struct { @@ -90,7 +91,7 @@ var ( valAddr2 = sdk.ValAddress(pubKey2.Address()) initTokens = sdk.TokensFromConsensusPower(initialPower, sdk.DefaultPowerReduction) - initCoins = sdk.NewCoins(sdk.NewCoin(umeeapp.BondDenom, initTokens)) + initCoins = sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, initTokens)) ) // NewTestMsgCreateValidator test msg creator diff --git a/x/oracle/types/asset.go b/x/oracle/types/asset.go index 251088c8cd..73110cd50f 100644 --- a/x/oracle/types/asset.go +++ b/x/oracle/types/asset.go @@ -2,10 +2,12 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" + + appparams "github.com/umee-network/umee/v3/app/params" ) const ( - UmeeDenom string = "uumee" + UmeeDenom string = appparams.BondDenom UmeeSymbol string = "umee" UmeeExponent = uint32(6) USDDenom string = "USD" diff --git a/x/oracle/types/keys_test.go b/x/oracle/types/keys_test.go index 905e57d678..9b20412966 100644 --- a/x/oracle/types/keys_test.go +++ b/x/oracle/types/keys_test.go @@ -5,7 +5,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/umee-network/umee/v3/app" + + appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -16,7 +17,7 @@ func TestGetExchangeRateKey(t *testing.T) { expectedKey []byte }{ { - denom: app.BondDenom, + denom: appparams.BondDenom, expectedKey: []byte{0x1, 0x75, 0x75, 0x6d, 0x65, 0x65, 0x0}, }, { From 3cede551a7b2f511742390ade289033433acfb44 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Fri, 2 Sep 2022 23:47:44 +0200 Subject: [PATCH 05/51] move prefix settings to appparams --- app/app.go | 8 +------- app/params/app_settings.go | 14 ++++++++++++++ app/{ => params}/prefix.go | 2 +- cmd/umeed/cmd/debug.go | 4 ++-- 4 files changed, 18 insertions(+), 10 deletions(-) rename app/{ => params}/prefix.go (98%) diff --git a/app/app.go b/app/app.go index e91ea4b788..4b8814dc95 100644 --- a/app/app.go +++ b/app/app.go @@ -240,12 +240,6 @@ func init() { } DefaultNodeHome = filepath.Join(userHomeDir, fmt.Sprintf(".%s", appparams.Name)) - - // XXX: If other upstream or external application's depend on any of Umee's - // CLI or command functionality, then this would require us to move the - // SetAddressConfig call to somewhere external such as the root command - // constructor and anywhere else we contract the app. - SetAddressConfig() } func New( @@ -331,7 +325,7 @@ func New( app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms, - AccountAddressPrefix, + appparams.AccountAddressPrefix, ) app.BankKeeper = bankkeeper.NewBaseKeeper( appCodec, diff --git a/app/params/app_settings.go b/app/params/app_settings.go index 2e8edb66e0..1adbe95202 100644 --- a/app/params/app_settings.go +++ b/app/params/app_settings.go @@ -1,6 +1,8 @@ package params import ( + "log" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -24,3 +26,15 @@ var ( // MinMinGasPrice is the minimum value a validator can set for `minimum-gas-prices` his app.toml config MinMinGasPrice = sdk.NewDecCoinFromDec(BondDenom, sdk.MustNewDecFromStr("0.05")) ) + +func init() { + // XXX: If other upstream or external application's depend on any of Umee's + // CLI or command functionality, then this would require us to move the + // SetAddressConfig call to somewhere external such as the root command + // constructor and anywhere else we contract the app. + SetAddressConfig() + + if AccountAddressPrefix != Name { + log.Fatal("AccountAddresPrefix must equal Name") + } +} diff --git a/app/prefix.go b/app/params/prefix.go similarity index 98% rename from app/prefix.go rename to app/params/prefix.go index 6015ea9705..db75fd93e6 100644 --- a/app/prefix.go +++ b/app/params/prefix.go @@ -1,4 +1,4 @@ -package app +package params import ( sdk "github.com/cosmos/cosmos-sdk/types" diff --git a/cmd/umeed/cmd/debug.go b/cmd/umeed/cmd/debug.go index 14201983df..8b5af3a45c 100644 --- a/cmd/umeed/cmd/debug.go +++ b/cmd/umeed/cmd/debug.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/version" "github.com/spf13/cobra" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) const ( @@ -80,7 +80,7 @@ $ %s debug addr cosmos1e0jnq2sun3dzjh8p2xq95kk0expwmd7shwjpfg }, } - cmd.Flags().String(flagBech32HRP, umeeapp.AccountAddressPrefix, + cmd.Flags().String(flagBech32HRP, appparams.AccountAddressPrefix, "Input Bech32 HRP (use only when address input is a Bech32 address") return cmd } From 150d566cdf13f186d6a4151fafb9be14fbf5c698 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Sat, 3 Sep 2022 00:31:08 +0200 Subject: [PATCH 06/51] markdown linting --- ante/fee-notes.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ante/fee-notes.md b/ante/fee-notes.md index 58cd67c06b..c2fd7eedd4 100644 --- a/ante/fee-notes.md +++ b/ante/fee-notes.md @@ -4,6 +4,7 @@ NOTES: - the gas used depends on the current state of the chain - the gas records below are based on the empty state +- user is charged the gas-limit, even if tx consumed less gas | operation | gas used | | :--------------------------------------------- | -------: | @@ -13,7 +14,7 @@ NOTES: | x/oracle MsgAggregateExchangeRateVote (6 curr) | 69726 | | default gas limit | 200000 | -### Target price (in USD cent) for x/bank send +## Target price (in USD cent) for x/bank send | umee price (usd cent) | gas price in uumee | fee (usd cent) | | --------------------: | -----------------: | -------------: | @@ -24,7 +25,7 @@ NOTES: | 5 | 0.1 | 0.0155 | | 5 | 0.02 | 0.0031 | -### Target price (in USD cent) for validator oracle txs (with 6 currencies) per day +## Target price (in USD cent) for validator oracle txs (with 6 currencies) per day There are roughly 10tx / minute and 14400 per day. Validator has to do 2 tx (prevote and vote) every 5 blocks. @@ -40,7 +41,7 @@ In table below we assume the same price scheme as above, but in the code most li | 5 | 0.1 | 201.6 | | 5 | 0.02 | 40.32 | -### Target price (in USD) for default gas limit +## Target price (in USD) for default gas limit | umee price (usd cent) | gas price in uumee | fee (usd cent) | | --------------------: | -----------------: | -------------: | From 195332a1fc6baf5a9c97167a5cc617531ec32a5a Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Sat, 3 Sep 2022 00:41:20 +0200 Subject: [PATCH 07/51] check consensus min-gas-price in app creator --- ante/fee.go | 3 +++ cmd/umeed/cmd/app_creator.go | 26 ++++++++++++++++--- cmd/umeed/cmd/root.go | 48 +++++++++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index 6d185124d6..44989c3dfc 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -49,6 +49,9 @@ func FeeAndPriority(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { "insufficient fees; got: %s required: %s", feeCoins, requiredFees) } } + } else { + // TODO + // check if consensus mingas is in fees } priority := getTxPriority(isOracleOrGravity, msgs) diff --git a/cmd/umeed/cmd/app_creator.go b/cmd/umeed/cmd/app_creator.go index ec34236218..aef22ca6d1 100644 --- a/cmd/umeed/cmd/app_creator.go +++ b/cmd/umeed/cmd/app_creator.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "io" + stdlog "log" "path/filepath" "github.com/cosmos/cosmos-sdk/baseapp" @@ -20,11 +21,11 @@ import ( dbm "github.com/tendermint/tm-db" umeeapp "github.com/umee-network/umee/v3/app" - "github.com/umee-network/umee/v3/app/params" + appparams "github.com/umee-network/umee/v3/app/params" ) type appCreator struct { - encCfg params.EncodingConfig + encCfg appparams.EncodingConfig moduleManager module.BasicManager } @@ -65,6 +66,9 @@ func (a appCreator) newApp( cast.ToUint32(appOpts.Get(server.FlagStateSyncSnapshotKeepRecent)), ) + minGasPrices := cast.ToString(appOpts.Get(server.FlagMinGasPrices)) + assertMinUmeeGasPrice(minGasPrices) + return umeeapp.New( logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), @@ -72,7 +76,7 @@ func (a appCreator) newApp( a.encCfg, appOpts, baseapp.SetPruning(pruningOpts), - baseapp.SetMinGasPrices(cast.ToString(appOpts.Get(server.FlagMinGasPrices))), + baseapp.SetMinGasPrices(minGasPrices), baseapp.SetMinRetainBlocks(cast.ToUint64(appOpts.Get(server.FlagMinRetainBlocks))), baseapp.SetHaltHeight(cast.ToUint64(appOpts.Get(server.FlagHaltHeight))), baseapp.SetHaltTime(cast.ToUint64(appOpts.Get(server.FlagHaltTime))), @@ -83,6 +87,22 @@ func (a appCreator) newApp( ) } +func assertMinUmeeGasPrice(minGasPrices string) { + gasPrices, err := sdk.ParseDecCoins(minGasPrices) + if err != nil { + stdlog.Fatalf("invalid minimum gas prices: %v", err) + } + for _, c := range gasPrices { + if c.Denom == appparams.BondDenom { + if c.Amount.LT(appparams.MinMinGasPrice.Amount) { + break // go to Fatal below + } + return + } + } + stdlog.Fatal("minimum-gas-price config in app.toml must be at least", appparams.MinMinGasPrice) +} + // appExport creates a new simapp, optionally at a given height. func (a appCreator) appExport( logger log.Logger, diff --git a/cmd/umeed/cmd/root.go b/cmd/umeed/cmd/root.go index 472624953a..dbae6ab85b 100644 --- a/cmd/umeed/cmd/root.go +++ b/cmd/umeed/cmd/root.go @@ -11,6 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/client/keys" "github.com/cosmos/cosmos-sdk/client/rpc" "github.com/cosmos/cosmos-sdk/server" + serverconfig "github.com/cosmos/cosmos-sdk/server/config" authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli" "github.com/cosmos/cosmos-sdk/x/auth/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -23,12 +24,11 @@ import ( tmcli "github.com/tendermint/tendermint/libs/cli" umeeapp "github.com/umee-network/umee/v3/app" - "github.com/umee-network/umee/v3/app/params" appparams "github.com/umee-network/umee/v3/app/params" ) // NewRootCmd returns the root command handler for the Umee daemon. -func NewRootCmd() (*cobra.Command, params.EncodingConfig) { +func NewRootCmd() (*cobra.Command, appparams.EncodingConfig) { encodingConfig := umeeapp.MakeEncodingConfig() moduleManager := umeeapp.ModuleBasics @@ -67,8 +67,9 @@ towards borrowing assets on another blockchain.`, return err } - tmConfig := initTendermintConfig() - return server.InterceptConfigsPreRunHandler(cmd, "", nil, tmConfig) + appTmpl, appCfg := initAppConfig() + tmCfg := initTendermintConfig() + return server.InterceptConfigsPreRunHandler(cmd, appTmpl, appCfg, tmCfg) }, } @@ -94,6 +95,45 @@ func initTendermintConfig() *tmcfg.Config { return cfg } +// initAppConfig helps to override default appConfig template and configs. +// return "", nil if no custom configuration is required for the application. +func initAppConfig() (string, interface{}) { + // WASMConfig defines configuration for the wasm module. + type WASMConfig struct { + // This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries + QueryGasLimit uint64 `mapstructure:"query_gas_limit"` + + LruSize uint64 `mapstructure:"lru_size"` + } + + type CustomAppConfig struct { + serverconfig.Config + WASM WASMConfig `mapstructure:"wasm"` + } + + // here we set a default initial app.toml values for validators. + srvCfg := serverconfig.DefaultConfig() + srvCfg.MinGasPrices = "" // validators MUST set mininum-gas-prices in their app.toml, otherwise the app will halt. + + customAppConfig := CustomAppConfig{ + Config: *srvCfg, + WASM: WASMConfig{ + LruSize: 1, + QueryGasLimit: 300000, + }, + } + + customAppTemplate := serverconfig.DefaultConfigTemplate + ` +[wasm] +# This is the maximum sdk gas (wasm and storage) that we allow for any x/wasm "smart" queries +query_gas_limit = 300000 +# This is the number of wasm vm instances we keep cached in memory for speed-up +# Warning: this is currently unstable and may lead to crashes, best to keep for 0 unless testing locally +lru_size = 0` + + return customAppTemplate, customAppConfig +} + func initRootCmd(rootCmd *cobra.Command, a appCreator) { // We allow two variants of the gentx command: // From ddaf8863af986c7a713ca3b3aaa78e32c50870f2 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Sat, 3 Sep 2022 11:08:30 +0200 Subject: [PATCH 08/51] fix e2e tests --- tests/e2e/e2e_setup_test.go | 8 ++++---- tests/e2e/e2e_test.go | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 919378a88b..8be0d18c95 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -33,7 +33,7 @@ import ( tmjson "github.com/tendermint/tendermint/libs/json" rpchttp "github.com/tendermint/tendermint/rpc/client/http" - umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -49,7 +49,7 @@ const ( var ( stakeAmount, _ = sdk.NewIntFromString("100000000000") - stakeAmountCoin = sdk.NewCoin(umeeapp.BondDenom, stakeAmount) + stakeAmountCoin = sdk.NewCoin(appparams.BondDenom, stakeAmount) ) type IntegrationTestSuite struct { @@ -250,8 +250,8 @@ func (s *IntegrationTestSuite) initGenesis() { s.Require().NoError(cdc.UnmarshalJSON(appGenState[leveragetypes.ModuleName], &leverageGenState)) leverageGenState.Registry = append(leverageGenState.Registry, leveragetypes.Token{ - BaseDenom: umeeapp.BondDenom, - SymbolDenom: umeeapp.DisplayDenom, + BaseDenom: appparams.BondDenom, + SymbolDenom: appparams.DisplayDenom, Exponent: 6, ReserveFactor: sdk.MustNewDecFromStr("0.1"), CollateralWeight: sdk.MustNewDecFromStr("0.05"), diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 42261b0f8a..6da6774acc 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -7,7 +7,8 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - umeeapp "github.com/umee-network/umee/v3/app" + + appparams "github.com/umee-network/umee/v3/app/params" ) func (s *IntegrationTestSuite) TestIBCTokenTransfer() { @@ -115,9 +116,9 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { s.Run("send_uumee_tokens_to_eth", func() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 - amount := sdk.NewCoin(umeeapp.BondDenom, math.NewInt(300)) + amount := sdk.NewCoin(appparams.BondDenom, math.NewInt(300)) umeeFee := sdk.NewCoin(photonDenom, math.NewInt(10)) - gravityFee := sdk.NewCoin(umeeapp.BondDenom, math.NewInt(7)) + gravityFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(7)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, umeeERC20Addr, amount, umeeFee, gravityFee) }) @@ -128,6 +129,6 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { orchestratorIdxSender := 1 amount := uint64(300) - s.sendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, umeeERC20Addr, umeeapp.BondDenom, amount) + s.sendFromEthToUmeeCheck(orchestratorIdxSender, umeeValIdxReceiver, umeeERC20Addr, appparams.BondDenom, amount) }) } From 895a3ad5ecef36c6b4f9ec384c2dd7fd639f51b7 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Sat, 3 Sep 2022 12:42:36 +0200 Subject: [PATCH 09/51] remove MaxAddrLen --- app/params/app_settings.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/params/app_settings.go b/app/params/app_settings.go index 1adbe95202..8de8af9d81 100644 --- a/app/params/app_settings.go +++ b/app/params/app_settings.go @@ -15,11 +15,6 @@ const ( // DisplayDenom defines the name, symbol, and display value of the umee token. DisplayDenom = "UMEE" - - // MaxAddrLen is the maximum allowed length (in bytes) for an address. - // - // NOTE: In the SDK, the default value is 255. - MaxAddrLen = 20 ) var ( From 9df787f461c9a42f423012ad8cd70c05c76cc7bc Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Tue, 6 Sep 2022 16:26:16 +0200 Subject: [PATCH 10/51] use consensus protected gas price --- ante/fee.go | 80 ++++++++++++++++++++++++------------ cmd/umeed/cmd/app_creator.go | 16 +++----- 2 files changed, 59 insertions(+), 37 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index 44989c3dfc..3f49a190a2 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -6,7 +6,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - // appparmas "github.com/umee-network/umee/v3/app/params" + appparams "github.com/umee-network/umee/v3/app/params" leveragetypes "github.com/umee-network/umee/v3/x/leverage/types" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -25,40 +25,51 @@ func FeeAndPriority(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { return nil, 0, sdkerrors.ErrTxDecode.Wrap("Tx must be a FeeTx") } - feeCoins := feeTx.GetFee() - gas := feeTx.GetGas() + providedFees := feeTx.GetFee() + gasLimit := feeTx.GetGas() msgs := feeTx.GetMsgs() isOracleOrGravity := IsOracleOrGravityTx(msgs) - chargeFees := !isOracleOrGravity || gas > uint64(len(msgs))*MaxMsgGasUsage - - if ctx.IsCheckTx() && chargeFees { - minGasPrices := ctx.MinGasPrices() - if !minGasPrices.IsZero() { - requiredFees := make(sdk.Coins, len(minGasPrices)) - - // Determine the required fees by multiplying each required minimum gas - // price by the gas limit, where fee = ceil(minGasPrice * gasLimit). - glDec := sdk.NewDec(int64(gas)) - for i, gp := range minGasPrices { - fee := gp.Amount.Mul(glDec) - requiredFees[i] = sdk.NewCoin(gp.Denom, fee.Ceil().RoundInt()) - } + priority := getTxPriority(isOracleOrGravity, msgs) + chargeFees := !isOracleOrGravity || gasLimit > uint64(len(msgs))*MaxMsgGasUsage + if !chargeFees { + return sdk.Coins{}, priority, nil + } - if !feeCoins.IsAnyGTE(requiredFees) { - return nil, 0, sdkerrors.ErrInsufficientFee.Wrapf( - "insufficient fees; got: %s required: %s", feeCoins, requiredFees) - } + var err error + if ctx.IsCheckTx() { + err = checkFees(ctx.MinGasPrices(), providedFees, gasLimit) + } else { + err = checkFees(nil, providedFees, gasLimit) + } + return providedFees, priority, err +} + +func checkFees(minGasPrices sdk.DecCoins, fees sdk.Coins, gasLimit uint64) error { + if minGasPrices != nil { + // check minGasPrices set by validator + if err := AssertMinProtocolGasPrice(minGasPrices); err != nil { + return err } } else { - // TODO - // check if consensus mingas is in fees + // in deliverTx = use protocol min gas price + minGasPrices = sdk.DecCoins{appparams.MinMinGasPrice} } - priority := getTxPriority(isOracleOrGravity, msgs) - if !chargeFees { - return sdk.Coins{}, priority, nil + requiredFees := make(sdk.Coins, len(minGasPrices)) + + // Determine the required fees by multiplying each required minimum gas + // price by the gas limit, where fee = ceil(minGasPrice * gasLimit). + glDec := sdk.NewDec(int64(gasLimit)) + for i, gp := range minGasPrices { + fee := gp.Amount.Mul(glDec) + requiredFees[i] = sdk.NewCoin(gp.Denom, fee.Ceil().RoundInt()) + } + + if !fees.IsAnyGTE(requiredFees) { + return sdkerrors.ErrInsufficientFee.Wrapf( + "insufficient fees; got: %s required: %s", fees, requiredFees) } - return feeCoins, priority, nil + return nil } // IsOracleOrGravityTx checks if all messages are oracle messages @@ -94,6 +105,21 @@ func IsOracleOrGravityTx(msgs []sdk.Msg) bool { return true } +// AssertMinProtocolGasPrice returns an error if the provided gasPrices are lower then +// the required by protocol. +func AssertMinProtocolGasPrice(gasPrices sdk.DecCoins) error { + for _, c := range gasPrices { + if c.Denom == appparams.MinMinGasPrice.Denom { + if c.Amount.LT(appparams.MinMinGasPrice.Amount) { + break // go to error below + } + return nil + } + } + return sdkerrors.ErrInsufficientFee.Wrapf( + "gas price too small; got: %v required min: %v", gasPrices, appparams.MinMinGasPrice) +} + // getTxPriority returns naive tx priority based on the lowest fee amount (regardless of the // denom) and oracle tx check. // Dirty optimization: since we already check if msgs are oracle or gravity messages, then we diff --git a/cmd/umeed/cmd/app_creator.go b/cmd/umeed/cmd/app_creator.go index aef22ca6d1..80d9fb1948 100644 --- a/cmd/umeed/cmd/app_creator.go +++ b/cmd/umeed/cmd/app_creator.go @@ -20,6 +20,7 @@ import ( "github.com/tendermint/tendermint/libs/log" dbm "github.com/tendermint/tm-db" + "github.com/umee-network/umee/v3/ante" umeeapp "github.com/umee-network/umee/v3/app" appparams "github.com/umee-network/umee/v3/app/params" ) @@ -67,7 +68,7 @@ func (a appCreator) newApp( ) minGasPrices := cast.ToString(appOpts.Get(server.FlagMinGasPrices)) - assertMinUmeeGasPrice(minGasPrices) + mustMinUmeeGasPrice(minGasPrices) return umeeapp.New( logger, db, traceStore, true, skipUpgradeHeights, @@ -87,20 +88,15 @@ func (a appCreator) newApp( ) } -func assertMinUmeeGasPrice(minGasPrices string) { +func mustMinUmeeGasPrice(minGasPrices string) { gasPrices, err := sdk.ParseDecCoins(minGasPrices) if err != nil { stdlog.Fatalf("invalid minimum gas prices: %v", err) } - for _, c := range gasPrices { - if c.Denom == appparams.BondDenom { - if c.Amount.LT(appparams.MinMinGasPrice.Amount) { - break // go to Fatal below - } - return - } + if err := ante.AssertMinProtocolGasPrice(gasPrices); err != nil { + stdlog.Fatal("minimum-gas-price config in app.toml must be at least", + appparams.MinMinGasPrice, " [", err, "]") } - stdlog.Fatal("minimum-gas-price config in app.toml must be at least", appparams.MinMinGasPrice) } // appExport creates a new simapp, optionally at a given height. From 5a75ad3d42ff5f194de7b6150ec4d5c83ed64f44 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 00:06:30 +0200 Subject: [PATCH 11/51] update tests --- ante/fee_test.go | 71 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/ante/fee_test.go b/ante/fee_test.go index 4323a23b7b..7ba5e46bb4 100644 --- a/ante/fee_test.go +++ b/ante/fee_test.go @@ -7,6 +7,7 @@ import ( sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/umee-network/umee/v3/ante" + appparams "github.com/umee-network/umee/v3/app/params" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -18,32 +19,67 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { msgs := testdata.NewTestMsg(addr1) require.NoError(suite.txBuilder.SetMsgs(msgs)) - fee := sdk.NewCoins(sdk.NewInt64Coin("atom", 150)) gasLimit := 200000 + minG := appparams.MinMinGasPrice + mkFee := func(factor string) sdk.Coins { + f := sdk.MustNewDecFromStr(factor) + return sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, + minG.Amount.MulInt64(int64(gasLimit)).Mul(f).Ceil().RoundInt())) + } + mkGas := func(denom, factor string) sdk.DecCoins { + if denom == "" { + denom = minG.Denom + } + f := sdk.MustNewDecFromStr(factor) + return sdk.DecCoins{sdk.NewDecCoinFromDec(denom, minG.Amount.Mul(f))} + } + + // we set fee to 2*gasLimit*minGasPrice + fee := mkFee("2") suite.txBuilder.SetFeeAmount(fee) suite.txBuilder.SetGasLimit(uint64(gasLimit)) + tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) + require.NoError(err) - // Test1: validator min gas price check - // Ante should fail when validator min gas price is above the transaction gas limit - minGasPrice := sdk.NewDecCoinFromDec("atom", sdk.NewDecFromInt(fee[0].Amount).QuoInt64(int64(gasLimit/2))) + // Test CheckTX // + + // min-gas-settings should work ctx := suite.ctx. - WithMinGasPrices([]sdk.DecCoin{minGasPrice}). + WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice}). WithIsCheckTx(true) - tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) - require.NoError(err) + suite.checkFeeAnte(tx, fee, ctx) + + // should work when exact fee is provided + suite.checkFeeAnte(tx, fee, ctx.WithMinGasPrices(mkGas("", "2"))) + + // should fail when not enough fee is provided + suite.checkFeeFailed(tx, ctx.WithMinGasPrices(mkGas("", "3"))) + + // should fail when other denom is required + suite.checkFeeFailed(tx, ctx.WithMinGasPrices(mkGas("other", "1"))) + + // should fail when some fee doesn't include all gas denoms + ctx = ctx.WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice, + sdk.NewDecCoinFromDec("other", sdk.NewDec(10))}) _, _, err = ante.FeeAndPriority(ctx, tx) require.ErrorIs(sdkerrors.ErrInsufficientFee, err) - // Test2: min gas price not checked in DeliverTx - ctx = suite.ctx.WithIsCheckTx(false) - suite.checkFeeAnte(tx, fee, ctx) + /* + // Test2: validator min gas price check during the + // Ante should fail when validator min gas price is above the transaction gas limit + ctx = ctx.WithMinGasPrices(sdk.NewDecCoinsFromCoins(fee...)) + _, _, err = ante.FeeAndPriority(ctx, tx) + require.ErrorIs(sdkerrors.ErrInsufficientFee, err) - // Test3: should not error when min gas price is same or lower than the fee - ctx = ctx.WithMinGasPrices(sdk.NewDecCoinsFromCoins(fee...)) - suite.checkFeeAnte(tx, fee, ctx) + // Test2: min gas price not checked in DeliverTx + ctx = suite.ctx.WithIsCheckTx(false) + suite.checkFeeAnte(tx, fee, ctx) - ctx = ctx.WithMinGasPrices([]sdk.DecCoin{sdk.NewDecCoin(fee[0].Denom, fee[0].Amount.QuoRaw(2))}) - suite.checkFeeAnte(tx, fee, ctx) + ctx = ctx.WithMinGasPrices([]sdk.DecCoin{sdk.NewDecCoin(fee[0].Denom, fee[0].Amount.QuoRaw(2))}) + suite.checkFeeAnte(tx, fee, ctx) + + + */ // Test4: ensure no fees for oracle msgs require.NoError(suite.txBuilder.SetMsgs( @@ -62,6 +98,11 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { suite.checkFeeAnte(oracleTx, sdk.Coins{}, suite.ctx.WithIsCheckTx(false)) } +func (suite *IntegrationTestSuite) checkFeeFailed(tx sdk.Tx, ctx sdk.Context) { + _, _, err := ante.FeeAndPriority(ctx, tx) + suite.Require().ErrorIs(sdkerrors.ErrInsufficientFee, err) +} + func (suite *IntegrationTestSuite) checkFeeAnte(tx sdk.Tx, feeExpected sdk.Coins, ctx sdk.Context) { require := suite.Require() fee, _, err := ante.FeeAndPriority(ctx, tx) From 949b0ba3836349607d42bbfb7239780f5a8082e0 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 00:08:00 +0200 Subject: [PATCH 12/51] formatting --- ante/fee-notes.md | 10 +++++----- ante/fee.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ante/fee-notes.md b/ante/fee-notes.md index c2fd7eedd4..e0c4894171 100644 --- a/ante/fee-notes.md +++ b/ante/fee-notes.md @@ -8,11 +8,11 @@ NOTES: | operation | gas used | | :--------------------------------------------- | -------: | -| x/bank send | 31029 | -| x/group create | 68908 | -| x/oracle MsgAggregateExchangeRateVote (3 curr) | 66251 | -| x/oracle MsgAggregateExchangeRateVote (6 curr) | 69726 | -| default gas limit | 200000 | +| x/bank send | 31'029 | +| x/group create | 68'908 | +| x/oracle MsgAggregateExchangeRateVote (3 curr) | 66'251 | +| x/oracle MsgAggregateExchangeRateVote (6 curr) | 69'726 | +| default gas limit | 200'000 | ## Target price (in USD cent) for x/bank send diff --git a/ante/fee.go b/ante/fee.go index 3f49a190a2..c49e36dfb0 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -12,7 +12,7 @@ import ( ) // MaxMsgGasUsage defines the maximum gas allowed for an oracle transaction. -const MaxMsgGasUsage = uint64(100000) +const MaxMsgGasUsage = uint64(100_000) // FeeAndPriority ensures tx has enough fee coins to pay for the gas at the CheckTx time // to early remove transactions from the mempool without enough attached fee. From 0adee69dc81919c2b3cdbe0e5ca111cd1b094f9b Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 00:24:32 +0200 Subject: [PATCH 13/51] test update --- ante/fee_test.go | 54 ++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/ante/fee_test.go b/ante/fee_test.go index 7ba5e46bb4..8cfc7db37f 100644 --- a/ante/fee_test.go +++ b/ante/fee_test.go @@ -5,6 +5,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + signing "github.com/cosmos/cosmos-sdk/x/auth/signing" "github.com/umee-network/umee/v3/ante" appparams "github.com/umee-network/umee/v3/app/params" @@ -33,20 +34,26 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { f := sdk.MustNewDecFromStr(factor) return sdk.DecCoins{sdk.NewDecCoinFromDec(denom, minG.Amount.Mul(f))} } + mkTx := func(fee sdk.Coins) signing.Tx { + suite.txBuilder.SetFeeAmount(fee) + tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) + require.NoError(err) + return tx + } + suite.txBuilder.SetGasLimit(uint64(gasLimit)) // we set fee to 2*gasLimit*minGasPrice fee := mkFee("2") - suite.txBuilder.SetFeeAmount(fee) - suite.txBuilder.SetGasLimit(uint64(gasLimit)) - tx, err := suite.CreateTestTx(privs, accNums, accSeqs, suite.ctx.ChainID()) - require.NoError(err) - - // Test CheckTX // + tx := mkTx(fee) - // min-gas-settings should work + // + // Test CheckTX + // ctx := suite.ctx. WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice}). WithIsCheckTx(true) + + // min-gas-settings should work suite.checkFeeAnte(tx, fee, ctx) // should work when exact fee is provided @@ -61,25 +68,28 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { // should fail when some fee doesn't include all gas denoms ctx = ctx.WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice, sdk.NewDecCoinFromDec("other", sdk.NewDec(10))}) - _, _, err = ante.FeeAndPriority(ctx, tx) - require.ErrorIs(sdkerrors.ErrInsufficientFee, err) - - /* - // Test2: validator min gas price check during the - // Ante should fail when validator min gas price is above the transaction gas limit - ctx = ctx.WithMinGasPrices(sdk.NewDecCoinsFromCoins(fee...)) - _, _, err = ante.FeeAndPriority(ctx, tx) - require.ErrorIs(sdkerrors.ErrInsufficientFee, err) + suite.checkFeeFailed(tx, ctx) - // Test2: min gas price not checked in DeliverTx - ctx = suite.ctx.WithIsCheckTx(false) - suite.checkFeeAnte(tx, fee, ctx) + // + // Test DeliverTx + // + ctx = suite.ctx. + WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice}). + WithIsCheckTx(false) - ctx = ctx.WithMinGasPrices([]sdk.DecCoin{sdk.NewDecCoin(fee[0].Denom, fee[0].Amount.QuoRaw(2))}) - suite.checkFeeAnte(tx, fee, ctx) + // ctx.MinGasPrice shouldn't matter + suite.checkFeeAnte(tx, fee, ctx) + suite.checkFeeAnte(tx, fee, ctx.WithMinGasPrices(mkGas("", "3"))) + suite.checkFeeAnte(tx, fee, ctx.WithMinGasPrices(mkGas("other", "1"))) + suite.checkFeeAnte(tx, fee, ctx.WithMinGasPrices(sdk.DecCoins{})) + // should fail when not enough fee is provided + suite.checkFeeFailed(mkTx(mkFee("0.5")), ctx) + suite.checkFeeFailed(mkTx(sdk.Coins{}), ctx) - */ + // should work when more fees are applied + fee = append(fee, sdk.NewInt64Coin("other", 10)) + suite.checkFeeAnte(mkTx(fee), fee, ctx) // Test4: ensure no fees for oracle msgs require.NoError(suite.txBuilder.SetMsgs( From 20e6770c1175e651530b59c794946f96788ff6bf Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 15:42:23 +0200 Subject: [PATCH 14/51] don't charge fee for txs in the first block (genesis) --- ante/fee.go | 3 ++- app/test_helpers.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index c49e36dfb0..1ae53c97f2 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -31,7 +31,8 @@ func FeeAndPriority(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { isOracleOrGravity := IsOracleOrGravityTx(msgs) priority := getTxPriority(isOracleOrGravity, msgs) chargeFees := !isOracleOrGravity || gasLimit > uint64(len(msgs))*MaxMsgGasUsage - if !chargeFees { + // we also don't charge transaction fees for the first block, for the genesis transactions. + if !chargeFees || ctx.BlockHeight() == 0 { return sdk.Coins{}, priority, nil } diff --git a/app/test_helpers.go b/app/test_helpers.go index 23bb46c6ff..770549fcb9 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -306,7 +306,7 @@ func IntegrationTestNetworkConfig() network.Config { cfg.InterfaceRegistry = encCfg.InterfaceRegistry cfg.GenesisState = appGenState cfg.BondDenom = params.BondDenom - cfg.MinGasPrices = fmt.Sprintf("0.000006%s", params.BondDenom) + cfg.MinGasPrices = params.MinMinGasPrice.String() cfg.AppConstructor = func(val network.Validator) servertypes.Application { return New( val.Ctx.Logger, From ebe83dbe006726dd0c49777343c39453ba08a603 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 15:59:29 +0200 Subject: [PATCH 15/51] fix leverage tests --- x/leverage/client/tests/suite.go | 24 ++++++++++++------------ x/oracle/client/tests/suite.go | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/x/leverage/client/tests/suite.go b/x/leverage/client/tests/suite.go index 3a22697bdc..bf920bb98c 100644 --- a/x/leverage/client/tests/suite.go +++ b/x/leverage/client/tests/suite.go @@ -12,6 +12,8 @@ import ( "github.com/spf13/cobra" "github.com/stretchr/testify/suite" tmcli "github.com/tendermint/tendermint/libs/cli" + + appparams "github.com/umee-network/umee/v3/app/params" ) type IntegrationTestSuite struct { @@ -74,28 +76,27 @@ type testQuery struct { func (t testTransaction) Run(s *IntegrationTestSuite) { clientCtx := s.network.Validators[0].ClientCtx - txFlags := []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, s.network.Validators[0].Address), fmt.Sprintf("--%s=json", tmcli.OutputFlag), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, appparams.MinMinGasPrice), } + args := append(t.args, txFlags...) + require := s.Require() - t.args = append(t.args, txFlags...) - - out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, t.args) - s.Require().NoError(err, t.msg) + out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, args) + require.NoError(err, t.msg) resp := &sdk.TxResponse{} err = clientCtx.Codec.UnmarshalJSON(out.Bytes(), resp) - s.Require().NoError(err, t.msg) + require.NoError(err, t.msg) if t.expectedErr == nil { - s.Require().Equal(0, int(resp.Code), t.msg) + require.Equal(0, int(resp.Code), "msg", t.msg, "resp", resp) } else { - s.Require().Equal(int(t.expectedErr.ABCICode()), int(resp.Code), t.msg) + require.Equal(int(t.expectedErr.ABCICode()), int(resp.Code), t.msg) } } @@ -105,10 +106,9 @@ func (t testQuery) Run(s *IntegrationTestSuite) { queryFlags := []string{ fmt.Sprintf("--%s=json", tmcli.OutputFlag), } + args := append(t.args, queryFlags...) - t.args = append(t.args, queryFlags...) - - out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, t.args) + out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, args) if t.expectErr { s.Require().Error(err, t.msg) diff --git a/x/oracle/client/tests/suite.go b/x/oracle/client/tests/suite.go index 253dc291f7..249166c89a 100644 --- a/x/oracle/client/tests/suite.go +++ b/x/oracle/client/tests/suite.go @@ -81,7 +81,7 @@ func (s *IntegrationTestSuite) TestDelegateFeedConsent() { s.network.Validators[1].Address.String(), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + fmt.Sprintf("--%s=%s", flags.FlagGasPrices, appparams.MinMinGasPrice), }, expectErr: false, expectedCode: 0, From e8ad4f5159efa8cab49faa810d7b9e02ed383f26 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 16:50:02 +0200 Subject: [PATCH 16/51] update gas settings for leverage simtest --- app/params/app_settings.go | 4 ++++ x/leverage/simulation/operations.go | 32 ++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/params/app_settings.go b/app/params/app_settings.go index 8de8af9d81..5283de0bdd 100644 --- a/app/params/app_settings.go +++ b/app/params/app_settings.go @@ -15,6 +15,10 @@ const ( // DisplayDenom defines the name, symbol, and display value of the umee token. DisplayDenom = "UMEE" + + // DefaultGasLimit - set to the same value as cosmos-sdk flags.DefaultGasLimit + // this value is currently only used in tests. + DefaultGasLimit = 200000 ) var ( diff --git a/x/leverage/simulation/operations.go b/x/leverage/simulation/operations.go index f415dcfea5..4a671bada3 100644 --- a/x/leverage/simulation/operations.go +++ b/x/leverage/simulation/operations.go @@ -10,6 +10,8 @@ import ( simtypes "github.com/cosmos/cosmos-sdk/types/simulation" "github.com/cosmos/cosmos-sdk/x/simulation" + appparams "github.com/umee-network/umee/v3/app/params" + "github.com/umee-network/umee/v3/util/coin" "github.com/umee-network/umee/v3/x/leverage/keeper" "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -121,14 +123,14 @@ func SimulateMsgSupply(ak simulation.AccountKeeper, bk types.BankKeeper) simtype r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - from, coin, skip := randomSupplyFields(r, ctx, accs, bk) + from, c, skip := randomSupplyFields(r, ctx, accs, bk) if skip { typename := sdk.MsgTypeURL(new(types.MsgSupply)) return simtypes.NoOpMsg(types.ModuleName, typename, "skip all transfers"), nil, nil } - msg := types.NewMsgSupply(from.Address, coin) - return deliver(r, app, ctx, ak, bk, from, msg, sdk.NewCoins(coin)) + msg := types.NewMsgSupply(from.Address, c) + return deliver(r, app, ctx, ak, bk, from, msg, sdk.NewCoins(c)) } } @@ -439,7 +441,7 @@ func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation. bk types.BankKeeper, from simtypes.Account, msg sdk.Msg, coins sdk.Coins, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { cfg := simappparams.MakeTestEncodingConfig() - txCtx := simulation.OperationInput{ + o := simulation.OperationInput{ R: r, App: app, TxGen: cfg.TxConfig, @@ -454,5 +456,25 @@ func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation. CoinsSpentInMsg: coins, } - return simulation.GenAndDeliverTxWithRandFees(txCtx) + // note: leverage operations are more expensive! + return GenAndDeliver(o, appparams.DefaultGasLimit*50) +} + +// GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. +// If gasLimit==0 then appparams default gas limit is used. +func GenAndDeliver(o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if gasLimit == 0 { + gasLimit = appparams.DefaultGasLimit + } + account := o.AccountKeeper.GetAccount(o.Context, o.SimAccount.Address) + spendable := o.Bankkeeper.SpendableCoins(o.Context, account.GetAddress()) + + _, hasNeg := spendable.SafeSub(o.CoinsSpentInMsg...) + if hasNeg { + return simtypes.NoOpMsg(o.ModuleName, o.MsgType, "message doesn't leave room for fees"), nil, nil + } + + fees := coin.NewDecBld(appparams.MinMinGasPrice). + Scale(int64(gasLimit)).ToCoins() + return simulation.GenAndDeliverTx(o, fees) } From 751d357e93a9e4157f002630a1cd12d021519277 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 17:08:58 +0200 Subject: [PATCH 17/51] add coin math util lib --- util/coin/math.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 util/coin/math.go diff --git a/util/coin/math.go b/util/coin/math.go new file mode 100644 index 0000000000..bc6a035de3 --- /dev/null +++ b/util/coin/math.go @@ -0,0 +1,43 @@ +package coin + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// DecBld is a Builder pattern for dec coin +type DecBld struct { + D sdk.DecCoin +} + +// NewDecBld is a constructor for DecBld type +func NewDecBld(d sdk.DecCoin) *DecBld { + return &DecBld{D: d} +} + +// Scale scales dec coin by given factor +func (d *DecBld) Scale(f int64) *DecBld { + d.D = sdk.DecCoin{Denom: d.D.Denom, Amount: d.D.Amount.MulInt64(f)} + return d +} + +// Scale scales dec coin by given factor provided as string. +// Panics if f is not a correct decimal number. +func (d *DecBld) ScaleStr(f string) *DecBld { + d.D = sdk.DecCoin{Denom: d.D.Denom, Amount: d.D.Amount.Mul(sdk.MustNewDecFromStr(f))} + return d +} + +// ToCoin converts DecCoin to sdk.Coin rounding up +func (d *DecBld) ToCoin() sdk.Coin { + return sdk.NewCoin(d.D.Denom, d.D.Amount.Ceil().RoundInt()) +} + +// ToCoins converts DecCoin to sdk.Coins rounding up +func (d *DecBld) ToCoins() sdk.Coins { + return sdk.Coins{d.ToCoin()} +} + +// ToCoin converts DecCoin to sdk.DecCoins +func (d *DecBld) ToDecCoins() sdk.DecCoins { + return sdk.DecCoins{d.D} +} From 332f79aa53e0b6da4ebad4e34578e89649d538f0 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 17:09:05 +0200 Subject: [PATCH 18/51] update fee tests --- ante/fee_test.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ante/fee_test.go b/ante/fee_test.go index 8cfc7db37f..3a8d6230fa 100644 --- a/ante/fee_test.go +++ b/ante/fee_test.go @@ -9,6 +9,7 @@ import ( "github.com/umee-network/umee/v3/ante" appparams "github.com/umee-network/umee/v3/app/params" + "github.com/umee-network/umee/v3/util/coin" oracletypes "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -20,19 +21,16 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { msgs := testdata.NewTestMsg(addr1) require.NoError(suite.txBuilder.SetMsgs(msgs)) - gasLimit := 200000 - minG := appparams.MinMinGasPrice + minGas := appparams.MinMinGasPrice mkFee := func(factor string) sdk.Coins { - f := sdk.MustNewDecFromStr(factor) - return sdk.NewCoins(sdk.NewCoin(appparams.BondDenom, - minG.Amount.MulInt64(int64(gasLimit)).Mul(f).Ceil().RoundInt())) + return coin.NewDecBld(minGas).Scale(int64(appparams.DefaultGasLimit)).ScaleStr(factor).ToCoins() } mkGas := func(denom, factor string) sdk.DecCoins { if denom == "" { - denom = minG.Denom + denom = minGas.Denom } f := sdk.MustNewDecFromStr(factor) - return sdk.DecCoins{sdk.NewDecCoinFromDec(denom, minG.Amount.Mul(f))} + return sdk.DecCoins{sdk.NewDecCoinFromDec(denom, minGas.Amount.Mul(f))} } mkTx := func(fee sdk.Coins) signing.Tx { suite.txBuilder.SetFeeAmount(fee) @@ -41,7 +39,7 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { return tx } - suite.txBuilder.SetGasLimit(uint64(gasLimit)) + suite.txBuilder.SetGasLimit(appparams.DefaultGasLimit) // we set fee to 2*gasLimit*minGasPrice fee := mkFee("2") tx := mkTx(fee) @@ -50,7 +48,7 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { // Test CheckTX // ctx := suite.ctx. - WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice}). + WithMinGasPrices(sdk.DecCoins{minGas}). WithIsCheckTx(true) // min-gas-settings should work @@ -66,7 +64,7 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { suite.checkFeeFailed(tx, ctx.WithMinGasPrices(mkGas("other", "1"))) // should fail when some fee doesn't include all gas denoms - ctx = ctx.WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice, + ctx = ctx.WithMinGasPrices(sdk.DecCoins{minGas, sdk.NewDecCoinFromDec("other", sdk.NewDec(10))}) suite.checkFeeFailed(tx, ctx) @@ -74,7 +72,7 @@ func (suite *IntegrationTestSuite) TestFeeAndPriority() { // Test DeliverTx // ctx = suite.ctx. - WithMinGasPrices(sdk.DecCoins{appparams.MinMinGasPrice}). + WithMinGasPrices(sdk.DecCoins{minGas}). WithIsCheckTx(false) // ctx.MinGasPrice shouldn't matter From 42c7643aff019ed6249cd145f5e6dfc0e4e7d84e Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 17:52:57 +0200 Subject: [PATCH 19/51] linting --- x/leverage/client/tests/suite.go | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/x/leverage/client/tests/suite.go b/x/leverage/client/tests/suite.go index bf920bb98c..a0ff09ddc8 100644 --- a/x/leverage/client/tests/suite.go +++ b/x/leverage/client/tests/suite.go @@ -75,6 +75,7 @@ type testQuery struct { } func (t testTransaction) Run(s *IntegrationTestSuite) { + require := s.Require() clientCtx := s.network.Validators[0].ClientCtx txFlags := []string{ fmt.Sprintf("--%s=%s", flags.FlagFrom, s.network.Validators[0].Address), @@ -83,10 +84,8 @@ func (t testTransaction) Run(s *IntegrationTestSuite) { fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), fmt.Sprintf("--%s=%s", flags.FlagGasPrices, appparams.MinMinGasPrice), } - args := append(t.args, txFlags...) - require := s.Require() - out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, args) + out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, append(t.args, txFlags...)) require.NoError(err, t.msg) resp := &sdk.TxResponse{} @@ -101,23 +100,22 @@ func (t testTransaction) Run(s *IntegrationTestSuite) { } func (t testQuery) Run(s *IntegrationTestSuite) { + require := s.Require() clientCtx := s.network.Validators[0].ClientCtx - queryFlags := []string{ fmt.Sprintf("--%s=json", tmcli.OutputFlag), } - args := append(t.args, queryFlags...) - - out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, args) + out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, append(t.args, queryFlags...)) + require.Error(err, t.msg) if t.expectErr { - s.Require().Error(err, t.msg) + require.Error(err, t.msg) } else { - s.Require().NoError(err, t.msg) + require.NoError(err, t.msg) err = clientCtx.Codec.UnmarshalJSON(out.Bytes(), t.responseType) - s.Require().NoError(err, t.msg) + require.NoError(err, t.msg) - s.Require().Equal(t.expectedResponse, t.responseType) + require.Equal(t.expectedResponse, t.responseType) } } From 9ddc8553645af83f80facdda6061f179ad181066 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 19:24:50 +0200 Subject: [PATCH 20/51] adding new genmap module --- util/genmap/doc.go | 2 ++ util/genmap/genmap.go | 14 ++++++++++++++ util/genmap/genmap_test.go | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 util/genmap/doc.go create mode 100644 util/genmap/genmap.go create mode 100644 util/genmap/genmap_test.go diff --git a/util/genmap/doc.go b/util/genmap/doc.go new file mode 100644 index 0000000000..17a6022fb8 --- /dev/null +++ b/util/genmap/doc.go @@ -0,0 +1,2 @@ +// Package genmap provides generic functions for manipulating maps. +package genmap diff --git a/util/genmap/genmap.go b/util/genmap/genmap.go new file mode 100644 index 0000000000..c50ddda236 --- /dev/null +++ b/util/genmap/genmap.go @@ -0,0 +1,14 @@ +package genmap + +// Pick creats a new map based on `m` by selecting entries from `keys`. +// If a key is in keys, but not map, then it's not included. +// Map keys and values are copied. +func Pick[K comparable, V any](m map[K]V, keys []K) map[K]V { + picked := make(map[K]V) + for i := range keys { + if v, ok := m[keys[i]]; ok { + picked[keys[i]] = v + } + } + return picked +} diff --git a/util/genmap/genmap_test.go b/util/genmap/genmap_test.go new file mode 100644 index 0000000000..e0e3be994c --- /dev/null +++ b/util/genmap/genmap_test.go @@ -0,0 +1,25 @@ +package genmap + +import "testing" +import "github.com/stretchr/testify/require" + +func TestPick(t *testing.T) { + require := require.New(t) + m := map[string]int{ + "one": 1, "two": 2, "three": 3} + + m2 := Pick(m, []string{"one"}) + require.Equal(map[string]int{"one": 1}, m2) + + m2 = Pick(m, []string{"two"}) + require.Equal(map[string]int{"two": 2}, m2) + + m2 = Pick(m, []string{"one", "three"}) + require.Equal(map[string]int{"one": 1, "three": 3}, m2) + + m2 = Pick(m, []string{}) + require.Equal(map[string]int{}, m2) + + m2 = Pick(m, []string{"other"}) + require.Equal(map[string]int{}, m2) +} From 83ad415e44ead27e1a178574f2708422e68eb4ba Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 19:26:11 +0200 Subject: [PATCH 21/51] filter sim modules --- app/app.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/app.go b/app/app.go index 4b8814dc95..85579148fc 100644 --- a/app/app.go +++ b/app/app.go @@ -626,8 +626,12 @@ func New( overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), } - // TODO: Ensure x/leverage implements simulator and then use app.mm.Modules directly. - simModules := map[string]module.AppModule{} + + // TODO: Ensure x/leverage implements simulator and add it here: + simModules := map[string]module.AppModule{ + leveragetypes.ModuleName: app.mm.Modules + } + for name, m := range app.mm.Modules { if name != leveragetypes.ModuleName { simModules[name] = m From 427614771aeb6b876c7faeaca6531257e5a70d9c Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 22:25:29 +0200 Subject: [PATCH 22/51] add util/sim package --- util/sim/deliver.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 util/sim/deliver.go diff --git a/util/sim/deliver.go b/util/sim/deliver.go new file mode 100644 index 0000000000..d155b2cb1a --- /dev/null +++ b/util/sim/deliver.go @@ -0,0 +1,32 @@ +package sim + +import ( + "math/rand" + + "github.com/cosmos/cosmos-sdk/baseapp" + sdk "github.com/cosmos/cosmos-sdk/types" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/simulation" + + appparams "github.com/umee-network/umee/v3/app/params" + "github.com/umee-network/umee/v3/util/coin" +) + +// GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. +// If gasLimit==0 then appparams default gas limit is used. +func GenAndDeliver(o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if gasLimit == 0 { + gasLimit = appparams.DefaultGasLimit + } + account := o.AccountKeeper.GetAccount(o.Context, o.SimAccount.Address) + spendable := o.Bankkeeper.SpendableCoins(o.Context, account.GetAddress()) + + _, hasNeg := spendable.SafeSub(o.CoinsSpentInMsg...) + if hasNeg { + return simtypes.NoOpMsg(o.ModuleName, o.MsgType, "message doesn't leave room for fees"), nil, nil + } + + fees := coin.NewDecBld(appparams.MinMinGasPrice). + Scale(int64(gasLimit)).ToCoins() + return simulation.GenAndDeliverTx(o, fees) +} From 6cc051f2a8e537620ff5f080ea6fd6a4659e6985 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Wed, 7 Sep 2022 22:25:48 +0200 Subject: [PATCH 23/51] refactor sim module manager --- app/app.go | 20 +++++++++----------- tests/simulation/sim_test.go | 6 +++--- x/leverage/simulation/operations.go | 23 ++--------------------- 3 files changed, 14 insertions(+), 35 deletions(-) diff --git a/app/app.go b/app/app.go index 85579148fc..1a2ae4ed3c 100644 --- a/app/app.go +++ b/app/app.go @@ -110,6 +110,7 @@ import ( customante "github.com/umee-network/umee/v3/ante" appparams "github.com/umee-network/umee/v3/app/params" "github.com/umee-network/umee/v3/swagger" + "github.com/umee-network/umee/v3/util/genmap" uibctransfer "github.com/umee-network/umee/v3/x/ibctransfer" uibctransferkeeper "github.com/umee-network/umee/v3/x/ibctransfer/keeper" "github.com/umee-network/umee/v3/x/leverage" @@ -228,6 +229,8 @@ type UmeeApp struct { // simulation manager sm *module.SimulationManager + // simulation manager to create state + StateSimulationManager *module.SimulationManager // module configurator configurator module.Configurator @@ -626,18 +629,13 @@ func New( overrideModules := map[string]module.AppModuleSimulation{ authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), } - + + simStateModules := genmap.Pick(app.mm.Modules, []string{stakingtypes.ModuleName, authtypes.ModuleName, oracletypes.ModuleName}) // TODO: Ensure x/leverage implements simulator and add it here: - simModules := map[string]module.AppModule{ - leveragetypes.ModuleName: app.mm.Modules - } - - for name, m := range app.mm.Modules { - if name != leveragetypes.ModuleName { - simModules[name] = m - } - } - app.sm = module.NewSimulationManagerFromAppModules(simModules, overrideModules) + simTestModules := genmap.Pick(simStateModules, []string{oracletypes.ModuleName}) + + app.StateSimulationManager = module.NewSimulationManagerFromAppModules(simStateModules, overrideModules) + app.sm = module.NewSimulationManagerFromAppModules(simTestModules, nil) app.sm.RegisterStoreDecoders() diff --git a/tests/simulation/sim_test.go b/tests/simulation/sim_test.go index a70c767cb5..6eab1b1065 100644 --- a/tests/simulation/sim_test.go +++ b/tests/simulation/sim_test.go @@ -83,7 +83,7 @@ func TestFullAppSimulation(t *testing.T) { t, os.Stdout, app.BaseApp, - appStateFn(app.AppCodec(), app.SimulationManager()), + appStateFn(app.AppCodec(), app.StateSimulationManager), simtypes.RandomAccounts, simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), @@ -157,7 +157,7 @@ func TestAppStateDeterminism(t *testing.T) { t, os.Stdout, app.BaseApp, - appStateFn(app.AppCodec(), app.SimulationManager()), + appStateFn(app.AppCodec(), app.StateSimulationManager), simtypes.RandomAccounts, simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), @@ -228,7 +228,7 @@ func BenchmarkFullAppSimulation(b *testing.B) { b, os.Stdout, app.BaseApp, - appStateFn(app.AppCodec(), app.SimulationManager()), + appStateFn(app.AppCodec(), app.StateSimulationManager), simtypes.RandomAccounts, simapp.SimulationOperations(app, app.AppCodec(), config), app.ModuleAccountAddrs(), diff --git a/x/leverage/simulation/operations.go b/x/leverage/simulation/operations.go index 4a671bada3..1bc230c8ed 100644 --- a/x/leverage/simulation/operations.go +++ b/x/leverage/simulation/operations.go @@ -11,7 +11,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/simulation" appparams "github.com/umee-network/umee/v3/app/params" - "github.com/umee-network/umee/v3/util/coin" + umeesim "github.com/umee-network/umee/v3/util/sim" "github.com/umee-network/umee/v3/x/leverage/keeper" "github.com/umee-network/umee/v3/x/leverage/types" ) @@ -457,24 +457,5 @@ func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation. } // note: leverage operations are more expensive! - return GenAndDeliver(o, appparams.DefaultGasLimit*50) -} - -// GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. -// If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver(o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - if gasLimit == 0 { - gasLimit = appparams.DefaultGasLimit - } - account := o.AccountKeeper.GetAccount(o.Context, o.SimAccount.Address) - spendable := o.Bankkeeper.SpendableCoins(o.Context, account.GetAddress()) - - _, hasNeg := spendable.SafeSub(o.CoinsSpentInMsg...) - if hasNeg { - return simtypes.NoOpMsg(o.ModuleName, o.MsgType, "message doesn't leave room for fees"), nil, nil - } - - fees := coin.NewDecBld(appparams.MinMinGasPrice). - Scale(int64(gasLimit)).ToCoins() - return simulation.GenAndDeliverTx(o, fees) + return umeesim.GenAndDeliver(o, appparams.DefaultGasLimit*50) } From de9709efed1852c8e478687aca82ff75bfdb1590 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 00:10:22 +0200 Subject: [PATCH 24/51] add account funding to umee sim tests --- ante/fee.go | 3 + util/sim/deliver.go | 17 +++- x/leverage/module.go | 5 +- x/leverage/simulation/operations.go | 35 +++----- x/oracle/module.go | 5 +- x/oracle/simulations/operations.go | 131 +++++++--------------------- x/oracle/types/expected_keeper.go | 3 - 7 files changed, 67 insertions(+), 132 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index 1ae53c97f2..819d2ba22d 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -42,6 +42,9 @@ func FeeAndPriority(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { } else { err = checkFees(nil, providedFees, gasLimit) } + if err != nil { + err = sdkerrors.Wrap(err, msgs[0].String()) + } return providedFees, priority, err } diff --git a/util/sim/deliver.go b/util/sim/deliver.go index d155b2cb1a..d16b147963 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -1,11 +1,12 @@ package sim import ( - "math/rand" + "fmt" - "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" "github.com/cosmos/cosmos-sdk/x/simulation" appparams "github.com/umee-network/umee/v3/app/params" @@ -14,7 +15,7 @@ import ( // GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. // If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver(o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { +func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { if gasLimit == 0 { gasLimit = appparams.DefaultGasLimit } @@ -28,5 +29,15 @@ func GenAndDeliver(o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.Oper fees := coin.NewDecBld(appparams.MinMinGasPrice). Scale(int64(gasLimit)).ToCoins() + if _, hasNeg = spendable.SafeSub(fees...); hasNeg { + fund := coin.NewDecBld(appparams.MinMinGasPrice). + Scale(int64(gasLimit * 1000)).ToCoins() + err := banktestutil.FundAccount(bk, o.Context, o.SimAccount.Address, fund) + if err != nil { + return simtypes.NewOperationMsg(o.Msg, false, o.ModuleName, o.Cdc), nil, + fmt.Errorf("Can't fund account [%s] to pay fees; [%w]", o.SimAccount.Address, err) + } + } + return simulation.GenAndDeliverTx(o, fees) } diff --git a/x/leverage/module.go b/x/leverage/module.go index b146cb5cdb..c9f1fa0b45 100644 --- a/x/leverage/module.go +++ b/x/leverage/module.go @@ -11,6 +11,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -103,10 +104,10 @@ type AppModule struct { keeper keeper.Keeper accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + bankKeeper bankkeeper.Keeper } -func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper, bk types.BankKeeper) AppModule { +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper, ak types.AccountKeeper, bk bankkeeper.Keeper) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), keeper: keeper, diff --git a/x/leverage/simulation/operations.go b/x/leverage/simulation/operations.go index 1bc230c8ed..2dea443b95 100644 --- a/x/leverage/simulation/operations.go +++ b/x/leverage/simulation/operations.go @@ -8,6 +8,7 @@ import ( simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/cosmos/cosmos-sdk/x/simulation" appparams "github.com/umee-network/umee/v3/app/params" @@ -36,7 +37,7 @@ const ( // WeightedOperations returns all the operations from the leverage module with their respective weights func WeightedOperations( - appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk types.BankKeeper, + appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, bk bankkeeper.Keeper, lk keeper.Keeper, ) simulation.WeightedOperations { var ( @@ -118,7 +119,7 @@ func WeightedOperations( // SimulateMsgSupply tests and runs a single msg supply where // an account supplies some available assets. -func SimulateMsgSupply(ak simulation.AccountKeeper, bk types.BankKeeper) simtypes.Operation { +func SimulateMsgSupply(ak simulation.AccountKeeper, bk bankkeeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -136,7 +137,7 @@ func SimulateMsgSupply(ak simulation.AccountKeeper, bk types.BankKeeper) simtype // SimulateMsgWithdraw tests and runs a single msg withdraw where // an account attempts to withdraw some supplied assets. -func SimulateMsgWithdraw(ak simulation.AccountKeeper, bk types.BankKeeper, lk keeper.Keeper) simtypes.Operation { +func SimulateMsgWithdraw(ak simulation.AccountKeeper, bk bankkeeper.Keeper, lk keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -154,7 +155,7 @@ func SimulateMsgWithdraw(ak simulation.AccountKeeper, bk types.BankKeeper, lk ke // SimulateMsgBorrow tests and runs a single msg borrow where // an account attempts to borrow some assets. -func SimulateMsgBorrow(ak simulation.AccountKeeper, bk types.BankKeeper, lk keeper.Keeper) simtypes.Operation { +func SimulateMsgBorrow(ak simulation.AccountKeeper, bk bankkeeper.Keeper, lk keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -174,7 +175,7 @@ func SimulateMsgBorrow(ak simulation.AccountKeeper, bk types.BankKeeper, lk keep // some collateral to a user. func SimulateMsgCollateralize( ak simulation.AccountKeeper, - bk types.BankKeeper, + bk bankkeeper.Keeper, lk keeper.Keeper, ) simtypes.Operation { return func( @@ -196,7 +197,7 @@ func SimulateMsgCollateralize( // some collateral from a user. func SimulateMsgDecollateralize( ak simulation.AccountKeeper, - bk types.BankKeeper, + bk bankkeeper.Keeper, lk keeper.Keeper, ) simtypes.Operation { return func( @@ -216,7 +217,7 @@ func SimulateMsgDecollateralize( // SimulateMsgRepay tests and runs a single msg repay where // an account repays some borrowed assets. -func SimulateMsgRepay(ak simulation.AccountKeeper, bk types.BankKeeper, lk keeper.Keeper) simtypes.Operation { +func SimulateMsgRepay(ak simulation.AccountKeeper, bk bankkeeper.Keeper, lk keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -234,7 +235,7 @@ func SimulateMsgRepay(ak simulation.AccountKeeper, bk types.BankKeeper, lk keepe // SimulateMsgLiquidate tests and runs a single msg liquidate where // one user attempts to liquidate another user's borrow. -func SimulateMsgLiquidate(ak simulation.AccountKeeper, bk types.BankKeeper, lk keeper.Keeper) simtypes.Operation { +func SimulateMsgLiquidate(ak simulation.AccountKeeper, bk bankkeeper.Keeper, lk keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, @@ -288,9 +289,7 @@ func randomSupplyFields( r *rand.Rand, ctx sdk.Context, accs []simtypes.Account, bk types.BankKeeper, ) (acc simtypes.Account, spendableToken sdk.Coin, skip bool) { acc, _ = simtypes.RandomAcc(r, accs) - tokens := getSpendableTokens(ctx, acc.Address, bk) - spendableTokens := simtypes.RandSubsetCoins(r, tokens) if spendableTokens.Empty() { return acc, sdk.Coin{}, true @@ -307,12 +306,9 @@ func randomWithdrawFields( bk types.BankKeeper, lk keeper.Keeper, ) (acc simtypes.Account, withdrawal sdk.Coin, skip bool) { acc, _ = simtypes.RandomAcc(r, accs) - uTokens := getSpendableUTokens(ctx, acc.Address, bk) uTokens = uTokens.Add(lk.GetBorrowerCollateral(ctx, acc.Address)...) - uTokens = simtypes.RandSubsetCoins(r, uTokens) - if uTokens.Empty() { return acc, sdk.Coin{}, true } @@ -326,11 +322,8 @@ func randomCollateralizeFields( r *rand.Rand, ctx sdk.Context, accs []simtypes.Account, bk types.BankKeeper, ) (acc simtypes.Account, spendableToken sdk.Coin, skip bool) { acc, _ = simtypes.RandomAcc(r, accs) - uTokens := getSpendableUTokens(ctx, acc.Address, bk) - uTokens = simtypes.RandSubsetCoins(r, uTokens) - if uTokens.Empty() { return acc, sdk.Coin{}, true } @@ -344,11 +337,8 @@ func randomDecollateralizeFields( r *rand.Rand, ctx sdk.Context, accs []simtypes.Account, lk keeper.Keeper, ) (acc simtypes.Account, spendableToken sdk.Coin, skip bool) { acc, _ = simtypes.RandomAcc(r, accs) - uTokens := lk.GetBorrowerCollateral(ctx, acc.Address) - uTokens = simtypes.RandSubsetCoins(r, uTokens) - if uTokens.Empty() { return acc, sdk.Coin{}, true } @@ -363,7 +353,6 @@ func randomBorrowFields( r *rand.Rand, ctx sdk.Context, accs []simtypes.Account, lk keeper.Keeper, ) (acc simtypes.Account, token sdk.Coin, skip bool) { acc, _ = simtypes.RandomAcc(r, accs) - allTokens := lk.GetAllRegisteredTokens(ctx) if len(allTokens) == 0 { return acc, sdk.Coin{}, true @@ -406,14 +395,12 @@ func randomLiquidateFields( // note: liquidator and borrower might even be the same account liquidator, _ = simtypes.RandomAcc(r, accs) borrower, _ = simtypes.RandomAcc(r, accs) - collateral := lk.GetBorrowerCollateral(ctx, borrower.Address) if collateral.Empty() { return liquidator, borrower, sdk.Coin{}, "", true } borrowed := lk.GetBorrowerBorrows(ctx, borrower.Address) - borrowed = simtypes.RandSubsetCoins(r, borrowed) if borrowed.Empty() { return liquidator, borrower, sdk.Coin{}, "", true @@ -438,7 +425,7 @@ func randomLiquidateFields( } func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation.AccountKeeper, - bk types.BankKeeper, from simtypes.Account, msg sdk.Msg, coins sdk.Coins, + bk bankkeeper.Keeper, from simtypes.Account, msg sdk.Msg, coins sdk.Coins, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { cfg := simappparams.MakeTestEncodingConfig() o := simulation.OperationInput{ @@ -457,5 +444,5 @@ func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation. } // note: leverage operations are more expensive! - return umeesim.GenAndDeliver(o, appparams.DefaultGasLimit*50) + return umeesim.GenAndDeliver(bk, o, appparams.DefaultGasLimit*50) } diff --git a/x/oracle/module.go b/x/oracle/module.go index 2bccbaaa9c..5f73bcd7f4 100644 --- a/x/oracle/module.go +++ b/x/oracle/module.go @@ -11,6 +11,7 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -105,14 +106,14 @@ type AppModule struct { keeper keeper.Keeper accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + bankKeeper bankkeeper.Keeper } func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, + bankKeeper bankkeeper.Keeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), diff --git a/x/oracle/simulations/operations.go b/x/oracle/simulations/operations.go index 224ae9b7b5..91bba2a005 100644 --- a/x/oracle/simulations/operations.go +++ b/x/oracle/simulations/operations.go @@ -8,12 +8,14 @@ import ( "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/simapp/helpers" simappparams "github.com/cosmos/cosmos-sdk/simapp/params" sdk "github.com/cosmos/cosmos-sdk/types" simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" "github.com/cosmos/cosmos-sdk/x/simulation" + appparams "github.com/umee-network/umee/v3/app/params" + umeesim "github.com/umee-network/umee/v3/util/sim" "github.com/umee-network/umee/v3/x/oracle/keeper" "github.com/umee-network/umee/v3/x/oracle/types" ) @@ -54,7 +56,7 @@ func WeightedOperations( appParams simtypes.AppParams, cdc codec.JSONCodec, ak types.AccountKeeper, - bk types.BankKeeper, + bk bankkeeper.Keeper, k keeper.Keeper, ) simulation.WeightedOperations { var ( @@ -101,14 +103,14 @@ func WeightedOperations( // SimulateMsgAggregateExchangeRatePrevote generates a MsgAggregateExchangeRatePrevote with random values. func SimulateMsgAggregateExchangeRatePrevote( ak types.AccountKeeper, - bk types.BankKeeper, + bk bankkeeper.Keeper, k keeper.Keeper, voteHashMap map[string]string, ) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { - simAccount, _ := simtypes.RandomAcc(r, accs) + simAccount := accs[1] // , _ := simtypes.RandomAcc(r, accs) address := sdk.ValAddress(simAccount.Address) noop := func(comment string) simtypes.OperationMsg { return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(new(types.MsgAggregateExchangeRatePrevote)), comment) @@ -133,51 +135,19 @@ func SimulateMsgAggregateExchangeRatePrevote( exchangeRatesStr := GenerateExchangeRatesString(prices) voteHash := types.GetAggregateVoteHash(salt, exchangeRatesStr, address) - feederAddr, _ := k.GetFeederDelegation(ctx, address) feederSimAccount, _ := simtypes.FindAccount(accs, feederAddr) - - feederAccount := ak.GetAccount(ctx, feederAddr) - spendable := bk.SpendableCoins(ctx, feederAccount.GetAddress()) - - fees, err := simtypes.RandomFees(r, ctx, spendable) - if err != nil { - return noop("unable to generate fees"), nil, err - } - msg := types.NewMsgAggregateExchangeRatePrevote(voteHash, feederAddr, address) - cfg := simappparams.MakeTestEncodingConfig() - txGen := cfg.TxConfig - tx, err := helpers.GenSignedMockTx( - r, - txGen, - []sdk.Msg{msg}, - fees, - helpers.DefaultGenTxGas, - chainID, - []uint64{feederAccount.GetAccountNumber()}, - []uint64{feederAccount.GetSequence()}, - feederSimAccount.PrivKey, - ) - if err != nil { - return noop("unable to generate mock tx"), nil, err - } - - _, _, err = app.SimDeliver(txGen.TxEncoder(), tx) - if err != nil { - return noop("unable to deliver tx"), nil, err - } - voteHashMap[address.String()] = exchangeRatesStr - return simtypes.NewOperationMsg(msg, true, "", cfg.Codec.(*codec.ProtoCodec)), nil, nil + return deliver(r, app, ctx, ak, bk, feederSimAccount, msg, nil) } } // SimulateMsgAggregateExchangeRateVote generates a MsgAggregateExchangeRateVote with random values. func SimulateMsgAggregateExchangeRateVote( ak types.AccountKeeper, - bk types.BankKeeper, + bk bankkeeper.Keeper, k keeper.Keeper, voteHashMap map[string]string, ) simtypes.Operation { @@ -215,43 +185,14 @@ func SimulateMsgAggregateExchangeRateVote( feederAddr, _ := k.GetFeederDelegation(ctx, address) feederSimAccount, _ := simtypes.FindAccount(accs, feederAddr) - feederAccount := ak.GetAccount(ctx, feederAddr) - spendableCoins := bk.SpendableCoins(ctx, feederAddr) - - fees, err := simtypes.RandomFees(r, ctx, spendableCoins) - if err != nil { - return noop("unable to generate fees"), nil, err - } - msg := types.NewMsgAggregateExchangeRateVote(salt, exchangeRatesStr, feederAddr, address) - cfg := simappparams.MakeTestEncodingConfig() - txGen := cfg.TxConfig - tx, err := helpers.GenSignedMockTx( - r, - txGen, - []sdk.Msg{msg}, - fees, - helpers.DefaultGenTxGas, - chainID, - []uint64{feederAccount.GetAccountNumber()}, - []uint64{feederAccount.GetSequence()}, - feederSimAccount.PrivKey, - ) - if err != nil { - return noop("unable to generate mock tx"), nil, err - } - - _, _, err = app.SimDeliver(txGen.TxEncoder(), tx) - if err != nil { - return noop("unable to deliver tx"), nil, err - } - return simtypes.NewOperationMsg(msg, true, "", cfg.Codec.(*codec.ProtoCodec)), nil, nil + return deliver(r, app, ctx, ak, bk, feederSimAccount, msg, nil) } } // SimulateMsgDelegateFeedConsent generates a MsgDelegateFeedConsent with random values. -func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { +func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk bankkeeper.Keeper, k keeper.Keeper) simtypes.Operation { return func( r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, ) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { @@ -259,7 +200,6 @@ func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk types.BankKeeper, delegateAccount, _ := simtypes.RandomAcc(r, accs) valAddress := sdk.ValAddress(simAccount.Address) delegateValAddress := sdk.ValAddress(delegateAccount.Address) - account := ak.GetAccount(ctx, simAccount.Address) noop := func(comment string) simtypes.OperationMsg { return simtypes.NoOpMsg(types.ModuleName, sdk.MsgTypeURL(new(types.MsgDelegateFeedConsent)), comment) } @@ -276,35 +216,30 @@ func SimulateMsgDelegateFeedConsent(ak types.AccountKeeper, bk types.BankKeeper, return noop("unable to delegate to validator"), nil, nil } - spendableCoins := bk.SpendableCoins(ctx, account.GetAddress()) - fees, err := simtypes.RandomFees(r, ctx, spendableCoins) - if err != nil { - return noop("unable to generate fees"), nil, err - } - msg := types.NewMsgDelegateFeedConsent(valAddress, delegateAccount.Address) - cfg := simappparams.MakeTestEncodingConfig() - txGen := cfg.TxConfig - tx, err := helpers.GenSignedMockTx( - r, - txGen, - []sdk.Msg{msg}, - fees, - helpers.DefaultGenTxGas, - chainID, - []uint64{account.GetAccountNumber()}, - []uint64{account.GetSequence()}, - simAccount.PrivKey, - ) - if err != nil { - return noop("unable to generate mock tx"), nil, err - } - - _, _, err = app.SimDeliver(txGen.TxEncoder(), tx) - if err != nil { - return noop("unable to deliver tx"), nil, err - } + return deliver(r, app, ctx, ak, bk, simAccount, msg, nil) + } +} - return simtypes.NewOperationMsg(msg, true, "", cfg.Codec.(*codec.ProtoCodec)), nil, nil +func deliver(r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, ak simulation.AccountKeeper, + bk bankkeeper.Keeper, from simtypes.Account, msg sdk.Msg, coins sdk.Coins, +) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + cfg := simappparams.MakeTestEncodingConfig() + o := simulation.OperationInput{ + R: r, + App: app, + TxGen: cfg.TxConfig, + Cdc: cfg.Codec.(*codec.ProtoCodec), + Msg: msg, + MsgType: sdk.MsgTypeURL(msg), + Context: ctx, + SimAccount: from, + AccountKeeper: ak, + Bankkeeper: bk, + ModuleName: types.ModuleName, + CoinsSpentInMsg: coins, } + + // note: leverage operations are more expensive! + return umeesim.GenAndDeliver(bk, o, appparams.DefaultGasLimit*50) } diff --git a/x/oracle/types/expected_keeper.go b/x/oracle/types/expected_keeper.go index ec492b8f05..ac4b640249 100644 --- a/x/oracle/types/expected_keeper.go +++ b/x/oracle/types/expected_keeper.go @@ -45,7 +45,4 @@ type BankKeeper interface { SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error GetDenomMetaData(ctx sdk.Context, denom string) (banktypes.Metadata, bool) SetDenomMetaData(ctx sdk.Context, denomMetaData banktypes.Metadata) - - // only used for simulation - SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins } From a3d355f827751289ec59127e6afa1ac2a94c6195 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 00:18:34 +0200 Subject: [PATCH 25/51] fix leverage query test --- x/leverage/client/tests/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/leverage/client/tests/suite.go b/x/leverage/client/tests/suite.go index a0ff09ddc8..697e792419 100644 --- a/x/leverage/client/tests/suite.go +++ b/x/leverage/client/tests/suite.go @@ -106,7 +106,7 @@ func (t testQuery) Run(s *IntegrationTestSuite) { fmt.Sprintf("--%s=json", tmcli.OutputFlag), } out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, append(t.args, queryFlags...)) - require.Error(err, t.msg) + require.NoError(err, t.msg) if t.expectErr { require.Error(err, t.msg) From 007f80c4aaeef6a673741f3bc40edb4b14f5dbcf Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 00:22:36 +0200 Subject: [PATCH 26/51] comment back err check --- ante/spam_prevention.go | 2 +- x/leverage/client/tests/suite.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ante/spam_prevention.go b/ante/spam_prevention.go index 24bdc07b76..794cb855ea 100644 --- a/ante/spam_prevention.go +++ b/ante/spam_prevention.go @@ -64,7 +64,7 @@ func (spd *SpamPreventionDecorator) CheckOracleSpam(ctx sdk.Context, msgs []sdk. err = spd.validate(ctx, msg.Feeder, msg.Validator, spd.oracleVoteMap, curHeight, "vote") default: // non oracle msg: stop validation! - // NOTE: only tx which contain only oracle Msgs are considered oracle-prioritized + // NOTE: only tx which contains only oracle Msgs are considered oracle-prioritized return nil } if err != nil { diff --git a/x/leverage/client/tests/suite.go b/x/leverage/client/tests/suite.go index 697e792419..bbb0adc443 100644 --- a/x/leverage/client/tests/suite.go +++ b/x/leverage/client/tests/suite.go @@ -106,7 +106,8 @@ func (t testQuery) Run(s *IntegrationTestSuite) { fmt.Sprintf("--%s=json", tmcli.OutputFlag), } out, err := clitestutil.ExecTestCLICmd(clientCtx, t.command, append(t.args, queryFlags...)) - require.NoError(err, t.msg) + // TODO: enable err check https://github.com/umee-network/umee/issues/1351 + // require.NoError(err, t.msg) if t.expectErr { require.Error(err, t.msg) From 994bf47facecca55b427c8a7a92eaffcb0e6fbac Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 01:53:49 +0200 Subject: [PATCH 27/51] linting --- app/app.go | 3 ++- util/sim/deliver.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/app.go b/app/app.go index 1a2ae4ed3c..babe3a8576 100644 --- a/app/app.go +++ b/app/app.go @@ -630,7 +630,8 @@ func New( authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts), } - simStateModules := genmap.Pick(app.mm.Modules, []string{stakingtypes.ModuleName, authtypes.ModuleName, oracletypes.ModuleName}) + simStateModules := genmap.Pick(app.mm.Modules, + []string{stakingtypes.ModuleName, authtypes.ModuleName, oracletypes.ModuleName}) // TODO: Ensure x/leverage implements simulator and add it here: simTestModules := genmap.Pick(simStateModules, []string{oracletypes.ModuleName}) diff --git a/util/sim/deliver.go b/util/sim/deliver.go index d16b147963..60912f2ac2 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -35,7 +35,7 @@ func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit s err := banktestutil.FundAccount(bk, o.Context, o.SimAccount.Address, fund) if err != nil { return simtypes.NewOperationMsg(o.Msg, false, o.ModuleName, o.Cdc), nil, - fmt.Errorf("Can't fund account [%s] to pay fees; [%w]", o.SimAccount.Address, err) + fmt.Errorf("can't fund account [%s] to pay fees; [%w]", o.SimAccount.Address, err) } } From 10436c54f26ea2fb9c3310187f96d8c0426b6a26 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 02:05:27 +0200 Subject: [PATCH 28/51] lint --- util/sim/deliver.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/sim/deliver.go b/util/sim/deliver.go index 60912f2ac2..c2dacbb099 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -15,7 +15,8 @@ import ( // GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. // If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { +func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas +) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { if gasLimit == 0 { gasLimit = appparams.DefaultGasLimit } From 225f3383ef0aa4a682aeb1bb2198e9327296bcc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keith=20H=C3=B6rling?= Date: Wed, 7 Sep 2022 19:38:56 -0700 Subject: [PATCH 29/51] fix: extra carriage-return, syntax --- util/sim/deliver.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/util/sim/deliver.go b/util/sim/deliver.go index c2dacbb099..60912f2ac2 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -15,8 +15,7 @@ import ( // GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. // If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas -) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { +func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { if gasLimit == 0 { gasLimit = appparams.DefaultGasLimit } From e0513c76313221f9e64cd009c222499a1ef7baca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keith=20H=C3=B6rling?= Date: Wed, 7 Sep 2022 19:47:56 -0700 Subject: [PATCH 30/51] fix: syntax + lint - newline between func signature and return was borked --- util/sim/deliver.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/util/sim/deliver.go b/util/sim/deliver.go index 60912f2ac2..ef2125bb4b 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -15,7 +15,10 @@ import ( // GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. // If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { +func GenAndDeliver( + bk bankkeeper.Keeper, + o simulation.OperationInput, + gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { if gasLimit == 0 { gasLimit = appparams.DefaultGasLimit } From 8797415347af634f0fce27c41d4fb7d3c239242d Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 11:33:48 +0200 Subject: [PATCH 31/51] style --- util/sim/deliver.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/util/sim/deliver.go b/util/sim/deliver.go index ef2125bb4b..4c2f25bcc1 100644 --- a/util/sim/deliver.go +++ b/util/sim/deliver.go @@ -15,10 +15,9 @@ import ( // GenAndDeliverTxWithRandFees generates a transaction with a random fee and delivers it. // If gasLimit==0 then appparams default gas limit is used. -func GenAndDeliver( - bk bankkeeper.Keeper, - o simulation.OperationInput, - gasLimit sdk.Gas) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { +func GenAndDeliver(bk bankkeeper.Keeper, o simulation.OperationInput, gasLimit sdk.Gas, +) (simtypes.OperationMsg, []simtypes.FutureOperation, error) { + if gasLimit == 0 { gasLimit = appparams.DefaultGasLimit } From bc5c7b53d31a42b2e2b4d351e0bbc64d31401241 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 08:55:26 -0300 Subject: [PATCH 32/51] add log check to single node - testing ci --- contrib/scripts/single-node.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contrib/scripts/single-node.sh b/contrib/scripts/single-node.sh index a57f393879..4af465f794 100755 --- a/contrib/scripts/single-node.sh +++ b/contrib/scripts/single-node.sh @@ -182,3 +182,7 @@ echo "Command Line Access:" echo " * $NODE_BIN --home $hdir status" $NODE_BIN $home0 start --api.enable true --grpc.address="0.0.0.0:9090" --grpc-web.enable=false --log_level trace > $log_path 2>&1 & + +sleep 10 + +cat $log_path \ No newline at end of file From 742479b16c3eab8ffa4ef215cdcd25bd3fefad62 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 09:06:20 -0300 Subject: [PATCH 33/51] set min gas price in app.toml to 0.05uumee --- cmd/umeed/cmd/app_creator.go | 2 +- contrib/scripts/single-node.sh | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/cmd/umeed/cmd/app_creator.go b/cmd/umeed/cmd/app_creator.go index 80d9fb1948..bb45b595c0 100644 --- a/cmd/umeed/cmd/app_creator.go +++ b/cmd/umeed/cmd/app_creator.go @@ -94,7 +94,7 @@ func mustMinUmeeGasPrice(minGasPrices string) { stdlog.Fatalf("invalid minimum gas prices: %v", err) } if err := ante.AssertMinProtocolGasPrice(gasPrices); err != nil { - stdlog.Fatal("minimum-gas-price config in app.toml must be at least", + stdlog.Fatal("minimum-gas-price config in app.toml must be at least ", appparams.MinMinGasPrice, " [", err, "]") } } diff --git a/contrib/scripts/single-node.sh b/contrib/scripts/single-node.sh index 4af465f794..86ae25e49a 100755 --- a/contrib/scripts/single-node.sh +++ b/contrib/scripts/single-node.sh @@ -158,7 +158,7 @@ if [[ ! -d "$hdir" ]]; then perl -i -pe 's|timeout_commit = ".*?"|timeout_commit = "5s"|g' $n0cfg echo "--- Modifying app..." - perl -i -pe 's|minimum-gas-prices = ""|minimum-gas-prices = "0.0001uumee"|g' $n0app + perl -i -pe 's|minimum-gas-prices = ""|minimum-gas-prices = "0.05uumee"|g' $n0app # Don't need to set peers if just one node, right? else @@ -183,6 +183,7 @@ echo " * $NODE_BIN --home $hdir status" $NODE_BIN $home0 start --api.enable true --grpc.address="0.0.0.0:9090" --grpc-web.enable=false --log_level trace > $log_path 2>&1 & -sleep 10 +# Adds 1 sec to create the log and makes it easier to debug it on CI +sleep 1 -cat $log_path \ No newline at end of file +cat $log_path From 40d8eca4190f5c246ff950f105651f989972f1d1 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 10:40:31 -0300 Subject: [PATCH 34/51] update e2e to use uumee --- tests/e2e/e2e_setup_test.go | 4 ++-- tests/e2e/e2e_test.go | 6 +++--- tests/e2e/e2e_util_test.go | 2 +- tests/e2e/scripts/hermes_bootstrap.sh | 4 ++-- tests/e2e/validator.go | 3 ++- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 8be0d18c95..76060e029a 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -39,8 +39,8 @@ import ( const ( photonDenom = "photon" - initBalanceStr = "110000000000uumee,100000000000photon" - minGasPrice = "0.00001" + photonDenom + initBalanceStr = "110000000000" + appparams.BondDenom + ",100000000000" + photonDenom + minGasPrice = "0.05" + appparams.BondDenom gaiaChainID = "test-gaia-chain" ethChainID uint = 15 diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 6da6774acc..8fcd568f4e 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -61,7 +61,7 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(ibcStakeDenom, math.NewInt(300)) - umeeFee := sdk.NewCoin(photonDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) gravityFee := sdk.NewCoin(ibcStakeDenom, math.NewInt(7)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, ibcStakeERC20Addr, amount, umeeFee, gravityFee) @@ -89,7 +89,7 @@ func (s *IntegrationTestSuite) TestPhotonTokenTransfers() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(photonDenom, math.NewInt(100)) - umeeFee := sdk.NewCoin(photonDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) gravityFee := sdk.NewCoin(photonDenom, math.NewInt(3)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, photonERC20Addr, amount, umeeFee, gravityFee) @@ -117,7 +117,7 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(appparams.BondDenom, math.NewInt(300)) - umeeFee := sdk.NewCoin(photonDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) gravityFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(7)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, umeeERC20Addr, amount, umeeFee, gravityFee) diff --git a/tests/e2e/e2e_util_test.go b/tests/e2e/e2e_util_test.go index 5244e4c180..81ab237c10 100644 --- a/tests/e2e/e2e_util_test.go +++ b/tests/e2e/e2e_util_test.go @@ -608,7 +608,7 @@ func (s *IntegrationTestSuite) queryUmeeEthBalance( s.Require().NoError(err) s.T().Logf( "ETh Balance of tokens; index: %d, addr: %s, amount: %d, denom: %s, erc20Addr: %s", - orchestratorIdx, ethAddr, ethBalance, photonDenom, ethTokenAddr, + orchestratorIdx, ethAddr, ethBalance, umeeTokenDenom, ethTokenAddr, ) return umeeBalance, ethBalance, umeeAddr, ethAddr diff --git a/tests/e2e/scripts/hermes_bootstrap.sh b/tests/e2e/scripts/hermes_bootstrap.sh index 18bd9261d9..5039207e8e 100755 --- a/tests/e2e/scripts/hermes_bootstrap.sh +++ b/tests/e2e/scripts/hermes_bootstrap.sh @@ -49,8 +49,8 @@ rpc_timeout = '10s' account_prefix = 'umee' key_name = 'val01-umee' store_prefix = 'ibc' -max_gas = 6000000 -gas_price = { price = 0.001, denom = 'photon' } +max_gas = 200000 +gas_price = { price = 0.05, denom = 'uumee' } gas_adjustment = 1.0 clock_drift = '1m' # to accomdate docker containers trusting_period = '14days' diff --git a/tests/e2e/validator.go b/tests/e2e/validator.go index 8d3ec315e3..32ac97a632 100644 --- a/tests/e2e/validator.go +++ b/tests/e2e/validator.go @@ -26,6 +26,7 @@ import ( "github.com/tendermint/tendermint/privval" umeeapp "github.com/umee-network/umee/v3/app" + appparams "github.com/umee-network/umee/v3/app/params" ) type validator struct { @@ -223,7 +224,7 @@ func (v *validator) signMsg(msgs ...sdk.Msg) (*sdktx.Tx, error) { txBuilder.SetMemo(fmt.Sprintf("%s@%s:26656", v.nodeKey.ID(), v.instanceName())) txBuilder.SetFeeAmount(sdk.NewCoins()) - txBuilder.SetGasLimit(200000) + txBuilder.SetGasLimit(appparams.DefaultGasLimit) signerData := authsigning.SignerData{ ChainID: v.chain.id, From f9c3d71c7aaac7fe5138f4cf374fa432a8c15b9f Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 10:52:35 -0300 Subject: [PATCH 35/51] set fee to 10000uumee as needed by the transaction --- tests/e2e/e2e_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 8fcd568f4e..3e5d921525 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -61,7 +61,7 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(ibcStakeDenom, math.NewInt(300)) - umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) gravityFee := sdk.NewCoin(ibcStakeDenom, math.NewInt(7)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, ibcStakeERC20Addr, amount, umeeFee, gravityFee) @@ -89,7 +89,7 @@ func (s *IntegrationTestSuite) TestPhotonTokenTransfers() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(photonDenom, math.NewInt(100)) - umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) gravityFee := sdk.NewCoin(photonDenom, math.NewInt(3)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, photonERC20Addr, amount, umeeFee, gravityFee) @@ -117,7 +117,7 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { umeeValIdxSender := 0 orchestratorIdxReceiver := 1 amount := sdk.NewCoin(appparams.BondDenom, math.NewInt(300)) - umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10)) + umeeFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(10000)) gravityFee := sdk.NewCoin(appparams.BondDenom, math.NewInt(7)) s.sendFromUmeeToEthCheck(umeeValIdxSender, orchestratorIdxReceiver, umeeERC20Addr, amount, umeeFee, gravityFee) From c7e0628f6f745caa32c9885db85d6d18f80c1a9f Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 11:03:15 -0300 Subject: [PATCH 36/51] improve dockerfile to have base-builder --- umee.e2e.Dockerfile | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/umee.e2e.Dockerfile b/umee.e2e.Dockerfile index 649a3009db..c76b07b4d5 100644 --- a/umee.e2e.Dockerfile +++ b/umee.e2e.Dockerfile @@ -1,21 +1,24 @@ ARG IMG_TAG=latest +# Fetch base packages +FROM golang:1.19-alpine AS base-builder +ENV PACKAGES make git libc-dev gcc linux-headers +RUN apk add --no-cache $PACKAGES + # Compile the umeed binary -FROM golang:1.19-alpine AS umeed-builder +FROM base-builder AS umeed-builder WORKDIR /src/app/ COPY go.mod go.sum* ./ RUN go mod download COPY . . -ENV PACKAGES curl make git libc-dev bash gcc linux-headers eudev-dev python3 +ENV PACKAGES curl bash eudev-dev python3 RUN apk add --no-cache $PACKAGES RUN CGO_ENABLED=0 make install RUN cd price-feeder && make install # Fetch peggo (gravity bridge) binary -FROM golang:1.19-alpine AS peggo-builder +FROM base-builder AS peggo-builder ARG PEGGO_VERSION=v0.3.0 -ENV PACKAGES make git libc-dev gcc linux-headers -RUN apk add --no-cache $PACKAGES WORKDIR /downloads/ RUN git clone https://github.com/umee-network/peggo.git RUN cd peggo && git checkout ${PEGGO_VERSION} && make build && cp ./build/peggo /usr/local/bin/ From 36e42745ad849e20d92b90bec76491f6bcafd8f6 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 13:16:15 -0300 Subject: [PATCH 37/51] add double check for non empty ibcStakeDenom, somehow was passing --- tests/e2e/e2e_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 3e5d921525..3dea9b2e2f 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -52,7 +52,8 @@ func (s *IntegrationTestSuite) TestIBCTokenTransfer() { }) var ibcStakeERC20Addr string - s.Run("deploy_stake_erc20", func() { + s.Run("deploy_stake_erc20 ibcStakeERC20Addr", func() { + s.Require().NotEmpty(ibcStakeDenom) ibcStakeERC20Addr = s.deployERC20Token(ibcStakeDenom) }) @@ -81,7 +82,7 @@ func (s *IntegrationTestSuite) TestPhotonTokenTransfers() { // deploy photon ERC20 token contact var photonERC20Addr string s.Run("deploy_photon_erc20", func() { - photonERC20Addr = s.deployERC20Token("photon") + photonERC20Addr = s.deployERC20Token(photonDenom) }) // send 100 photon tokens from Umee to Ethereum @@ -109,7 +110,7 @@ func (s *IntegrationTestSuite) TestUmeeTokenTransfers() { // deploy umee ERC20 token contract var umeeERC20Addr string s.Run("deploy_umee_erc20", func() { - umeeERC20Addr = s.deployERC20Token("uumee") + umeeERC20Addr = s.deployERC20Token(appparams.BondDenom) }) // send 300 umee tokens from Umee to Ethereum From 539e202da7981134823998a7ce4955e9b3b7e434 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 13:16:36 -0300 Subject: [PATCH 38/51] revoked the max_gas to 6000000 on hermes --- tests/e2e/scripts/hermes_bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/scripts/hermes_bootstrap.sh b/tests/e2e/scripts/hermes_bootstrap.sh index 5039207e8e..0bbf6a72bd 100755 --- a/tests/e2e/scripts/hermes_bootstrap.sh +++ b/tests/e2e/scripts/hermes_bootstrap.sh @@ -49,7 +49,7 @@ rpc_timeout = '10s' account_prefix = 'umee' key_name = 'val01-umee' store_prefix = 'ibc' -max_gas = 200000 +max_gas = 6000000 gas_price = { price = 0.05, denom = 'uumee' } gas_adjustment = 1.0 clock_drift = '1m' # to accomdate docker containers From cdc51296b64224acdbce74f5c51a3dc29dbf2c60 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 13:19:05 -0300 Subject: [PATCH 39/51] add one more step to docker helping to cache more packages and improve dev-ux --- umee.e2e.Dockerfile | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/umee.e2e.Dockerfile b/umee.e2e.Dockerfile index c76b07b4d5..3eabf15037 100644 --- a/umee.e2e.Dockerfile +++ b/umee.e2e.Dockerfile @@ -5,14 +5,17 @@ FROM golang:1.19-alpine AS base-builder ENV PACKAGES make git libc-dev gcc linux-headers RUN apk add --no-cache $PACKAGES +# Fetch base umee packages +FROM base-builder AS umee-base-builder +ENV PACKAGES curl bash eudev-dev python3 +RUN apk add --no-cache $PACKAGES + # Compile the umeed binary -FROM base-builder AS umeed-builder +FROM umee-base-builder AS umeed-builder WORKDIR /src/app/ COPY go.mod go.sum* ./ RUN go mod download COPY . . -ENV PACKAGES curl bash eudev-dev python3 -RUN apk add --no-cache $PACKAGES RUN CGO_ENABLED=0 make install RUN cd price-feeder && make install From c27c7328e4f56f1166984a5b682c6a3c6668e7f1 Mon Sep 17 00:00:00 2001 From: Rafael Tenfen Date: Thu, 8 Sep 2022 13:49:47 -0300 Subject: [PATCH 40/51] Update util/coin/math.go --- util/coin/math.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/coin/math.go b/util/coin/math.go index bc6a035de3..653591a90e 100644 --- a/util/coin/math.go +++ b/util/coin/math.go @@ -3,7 +3,7 @@ package coin import ( sdk "github.com/cosmos/cosmos-sdk/types" ) - +// TODO: add unit tests for `util/coin/math.go` // DecBld is a Builder pattern for dec coin type DecBld struct { D sdk.DecCoin From 0fbeab079bdb875a60167ab48c6927148bd4c11c Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 15:15:33 -0300 Subject: [PATCH 41/51] fix lint --- util/coin/math.go | 1 + 1 file changed, 1 insertion(+) diff --git a/util/coin/math.go b/util/coin/math.go index 653591a90e..2ea3535df1 100644 --- a/util/coin/math.go +++ b/util/coin/math.go @@ -3,6 +3,7 @@ package coin import ( sdk "github.com/cosmos/cosmos-sdk/types" ) + // TODO: add unit tests for `util/coin/math.go` // DecBld is a Builder pattern for dec coin type DecBld struct { From 898f6272cdaa58e6e3f5733d09f39fdf402b4bc9 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 20:43:10 +0200 Subject: [PATCH 42/51] reus mingasfee variable --- tests/e2e/e2e_setup_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/e2e_setup_test.go b/tests/e2e/e2e_setup_test.go index 76060e029a..f689df2d3b 100644 --- a/tests/e2e/e2e_setup_test.go +++ b/tests/e2e/e2e_setup_test.go @@ -40,7 +40,6 @@ import ( const ( photonDenom = "photon" initBalanceStr = "110000000000" + appparams.BondDenom + ",100000000000" + photonDenom - minGasPrice = "0.05" + appparams.BondDenom gaiaChainID = "test-gaia-chain" ethChainID uint = 15 @@ -48,6 +47,7 @@ const ( ) var ( + minGasPrice = appparams.MinMinGasPrice.String() stakeAmount, _ = sdk.NewIntFromString("100000000000") stakeAmountCoin = sdk.NewCoin(appparams.BondDenom, stakeAmount) ) From fb5df4d656a03c6d4c58c86bc60927409b307c92 Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 20:48:47 +0200 Subject: [PATCH 43/51] update free gravity msg set --- ante/fee.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/ante/fee.go b/ante/fee.go index 819d2ba22d..fff2bf2439 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -87,9 +87,7 @@ func IsOracleOrGravityTx(msgs []sdk.Msg) bool { *oracletypes.MsgAggregateExchangeRateVote: continue - // TODO: remove messages which should not be "free": case *gbtypes.MsgValsetConfirm, - *gbtypes.MsgRequestBatch, *gbtypes.MsgConfirmBatch, *gbtypes.MsgERC20DeployedClaim, *gbtypes.MsgConfirmLogicCall, From 5fea4ea2583bc417a5fcc0462716643f9926b9fd Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 20:51:04 +0200 Subject: [PATCH 44/51] update comment --- ante/fee-notes.md | 3 +++ ante/fee.go | 1 + 2 files changed, 4 insertions(+) diff --git a/ante/fee-notes.md b/ante/fee-notes.md index e0c4894171..82379a7835 100644 --- a/ante/fee-notes.md +++ b/ante/fee-notes.md @@ -32,6 +32,9 @@ Validator has to do 2 tx (prevote and vote) every 5 blocks. Validator will need to do `5760 = 2*14400/5` tx. In table below we assume the same price scheme as above, but in the code most likely we will apply a fixed discount (eg 10x). +The prices are indicative. For some transactions (especially oracle) fees can be disabled. +See fee.go file for details. + | umee price (usd cent) | gas price in uumee | fee (usd cent) | | --------------------: | -----------------: | -------------: | | 2 | 0.2 | 161.28 | diff --git a/ante/fee.go b/ante/fee.go index fff2bf2439..1ddba04b41 100644 --- a/ante/fee.go +++ b/ante/fee.go @@ -87,6 +87,7 @@ func IsOracleOrGravityTx(msgs []sdk.Msg) bool { *oracletypes.MsgAggregateExchangeRateVote: continue + // TODO: revisit free gravity msg set case *gbtypes.MsgValsetConfirm, *gbtypes.MsgConfirmBatch, *gbtypes.MsgERC20DeployedClaim, From 016e22353a1ffc1427ca4314c87f59bbd0b9db4c Mon Sep 17 00:00:00 2001 From: Adam Wozniak <29418299+adamewozniak@users.noreply.github.com> Date: Thu, 8 Sep 2022 12:59:43 -0700 Subject: [PATCH 45/51] fix tests --- x/leverage/client/tests/tests.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/leverage/client/tests/tests.go b/x/leverage/client/tests/tests.go index 54f846f686..a72666674f 100644 --- a/x/leverage/client/tests/tests.go +++ b/x/leverage/client/tests/tests.go @@ -253,10 +253,10 @@ func (s *IntegrationTestSuite) TestLeverageScenario() { &types.QueryAccountBalancesResponse{}, &types.QueryAccountBalancesResponse{ Supplied: sdk.NewCoins( - sdk.NewInt64Coin(umeeapp.BondDenom, 201), // slightly increased uToken exchange rate + sdk.NewInt64Coin(appparams.BondDenom, 201), // slightly increased uToken exchange rate ), Collateral: sdk.NewCoins( - sdk.NewInt64Coin(types.ToUTokenDenom(umeeapp.BondDenom), 100), + sdk.NewInt64Coin(types.ToUTokenDenom(appparams.BondDenom), 100), ), Borrowed: sdk.NewCoins(), }, From c630563bbb028262dd3b5be9f0a6aea90e96d43f Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 17:17:55 -0300 Subject: [PATCH 46/51] removed min-gas-price flag from upgrade test single node --- .gitignore | 2 ++ contrib/scripts/upgrade-test-single-node.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e47e396595..bdbdc57200 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ contrib/scripts/cosmos-genesis-tinkerer contrib/scripts/tinkered_genesis.json contrib/scripts/preprocessing.json contrib/scripts/umeed-releases +# preprocessing can appear from the shell curdir that is cosmos-genesis-tinkerer is running +preprocessing.json # Dependency directories (remove the comment below to include it) # vendor/ diff --git a/contrib/scripts/upgrade-test-single-node.sh b/contrib/scripts/upgrade-test-single-node.sh index 8379a8f8b6..79fdca6bff 100755 --- a/contrib/scripts/upgrade-test-single-node.sh +++ b/contrib/scripts/upgrade-test-single-node.sh @@ -86,7 +86,7 @@ sleep $VOTING_PERIOD # Starts a different file for logging nodeLogPath=$hdir.umeed-v2.log -$UMEED_BIN_V2 $nodeHomeFlag start --minimum-gas-prices=0.001uumee --grpc.address="0.0.0.0:9090" --grpc-web.enable=false --log_level $LOG_LEVEL > $nodeLogPath 2>&1 & +$UMEED_BIN_V2 $nodeHomeFlag start --grpc.address="0.0.0.0:9090" --grpc-web.enable=false --log_level $LOG_LEVEL > $nodeLogPath 2>&1 & # Gets the node pid echo $! > $UMEED_V1_PID_FILE From 5b6d44f6f8b24007a6a4f0fb56f5fdc9ca502261 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 17:22:11 -0300 Subject: [PATCH 47/51] add min gas price to app.toml --- contrib/scripts/umeemainnet_fork.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/scripts/umeemainnet_fork.sh b/contrib/scripts/umeemainnet_fork.sh index 5ae7c3ce9c..98ad6790d8 100755 --- a/contrib/scripts/umeemainnet_fork.sh +++ b/contrib/scripts/umeemainnet_fork.sh @@ -132,6 +132,7 @@ perl -i -pe 's|"tcp://127.0.0.1:26657"|"tcp://0.0.0.0:26657"|g' $nodeCfg perl -i -pe 's|allow_duplicate_ip = false|allow_duplicate_ip = true|g' $nodeCfg perl -i -pe 's|log_level = "info"|log_level = "'$LOG_LEVEL'"|g' $nodeCfg perl -i -pe 's|timeout_commit = ".*?"|timeout_commit = "5s"|g' $nodeCfg +perl -i -pe 's|minimum-gas-prices = ""|minimum-gas-prices = "0.05uumee"|g' $nodeApp nodeLogPath=$hdir.umeed-main.log unset UMEE_ENABLE_BETA From aa6ce4fa351f3353aa58aafc7bcb4644ad41df8d Mon Sep 17 00:00:00 2001 From: Robert Zaremba Date: Thu, 8 Sep 2022 22:27:39 +0200 Subject: [PATCH 48/51] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aac3bdbccb..c2d1fd0bac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +### State Machine Breaking + +- [#1326](https://github.com/umee-network/umee/pull/1326) Setting protocol controlled min gas price. + ### API Breaking - [1029](https://github.com/umee-network/umee/pull/1029) Removed MsgSetCollateral(addr,denom,bool), and replaced with MsgAddCollateral(addr,coin) and MsgRemoveCollateral(addr,coin) From dc3645bddda3d2096a1f2cb76a88d18128c42f35 Mon Sep 17 00:00:00 2001 From: RafilxTenfen Date: Thu, 8 Sep 2022 17:41:22 -0300 Subject: [PATCH 49/51] removes print for CI performance --- contrib/scripts/blocks.sh | 2 +- contrib/scripts/process_genesis.sh | 2 +- contrib/scripts/single-node.sh | 2 +- contrib/scripts/test_localnet_liveness.sh | 2 +- contrib/scripts/umeemainnet_fork.sh | 2 +- contrib/scripts/upgrade-test-single-node.sh | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/scripts/blocks.sh b/contrib/scripts/blocks.sh index 52207d1a9b..bb42b592e2 100755 --- a/contrib/scripts/blocks.sh +++ b/contrib/scripts/blocks.sh @@ -1,4 +1,4 @@ -#!/bin/bash -eux +#!/bin/bash -eu # File with commonly used functions for other scripts diff --git a/contrib/scripts/process_genesis.sh b/contrib/scripts/process_genesis.sh index 44acf6980b..d52df03584 100755 --- a/contrib/scripts/process_genesis.sh +++ b/contrib/scripts/process_genesis.sh @@ -1,4 +1,4 @@ -#!/bin/bash -eux +#!/bin/bash -eu CWD="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" diff --git a/contrib/scripts/single-node.sh b/contrib/scripts/single-node.sh index 86ae25e49a..771303287b 100755 --- a/contrib/scripts/single-node.sh +++ b/contrib/scripts/single-node.sh @@ -1,4 +1,4 @@ -#!/bin/bash -eux +#!/bin/bash -eu # USAGE: # ./single-gen.sh