From 6a01abe5c99e26a1d17d96f359d06d61bc1e6e70 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:19:24 -0500 Subject: [PATCH 01/99] chore(perp): remove perp --- app/ante/commission_test.go | 2 +- app/ante/testutil_test.go | 3 +- app/app.go | 3 +- app/codec/codec.go | 11 +- app/encoding.go | 16 +- app/ibc_test.go | 2 +- app/keepers.go | 19 - app/modules_test.go | 5 +- cmd/nibid/cmd/genaccounts_test.go | 2 +- cmd/nibid/cmd/root.go | 4 +- cmd/nibid/cmd/testnet_test.go | 2 +- simapp/sim_test.go | 4 +- wasmbinding/bindings/marshalling_test.go | 28 - wasmbinding/bindings/query.go | 54 - wasmbinding/exec_oracle_test.go | 5 +- wasmbinding/exec_perp.go | 248 - wasmbinding/exec_perp_test.go | 358 -- wasmbinding/exec_test.go | 271 +- wasmbinding/message_plugin.go | 62 - wasmbinding/querier.go | 247 +- wasmbinding/querier_perp_test.go | 319 -- wasmbinding/querier_test.go | 192 +- wasmbinding/test/cli_test.go | 37 +- wasmbinding/wasm.go | 6 +- x/common/testutil/cli/network.go | 2 +- x/common/testutil/cli/network_test.go | 2 +- x/common/testutil/cli/query.go | 48 - x/common/testutil/genesis/oracle_genesis.go | 10 +- x/common/testutil/genesis/perp_genesis.go | 232 - x/common/testutil/genesis/sudo_genesis.go | 2 +- x/common/testutil/mock/perp_amm.go | 37 - x/common/testutil/mock/perp_market.go | 31 - x/common/testutil/testapp/testapp.go | 4 +- x/devgas/v1/ante/ante_test.go | 2 +- x/epochs/genesis_test.go | 2 +- x/genmsg/integration_test.go | 2 +- x/oracle/integration/app_test.go | 2 +- x/oracle/keeper/hooks.go | 44 - x/oracle/keeper/hooks_test.go | 77 - x/oracle/types/genesis_test.go | 2 +- x/perp/README.md | 3 - x/perp/v2/client/cli/cli_test.go | 749 --- x/perp/v2/client/cli/gen_market.go | 204 - x/perp/v2/client/cli/gen_market_test.go | 130 - x/perp/v2/client/cli/query.go | 186 - x/perp/v2/client/cli/tx.go | 354 -- x/perp/v2/integration/action/dnr.go | 209 - x/perp/v2/integration/action/liquidation.go | 73 - x/perp/v2/integration/action/margin.go | 137 - x/perp/v2/integration/action/market.go | 192 - x/perp/v2/integration/action/params.go | 24 - x/perp/v2/integration/action/position.go | 387 -- x/perp/v2/integration/action/query.go | 308 -- x/perp/v2/integration/action/settlement.go | 26 - x/perp/v2/integration/action/snapshot.go | 60 - x/perp/v2/integration/action/tx.go | 235 - x/perp/v2/integration/action/withdraw.go | 36 - x/perp/v2/integration/assertion/bank.go | 32 - x/perp/v2/integration/assertion/event.go | 147 - x/perp/v2/integration/assertion/market.go | 174 - x/perp/v2/integration/assertion/notional.go | 46 - x/perp/v2/integration/assertion/position.go | 80 - x/perp/v2/integration/assertion/twap.go | 47 - x/perp/v2/keeper/admin.go | 116 - x/perp/v2/keeper/admin_test.go | 160 - x/perp/v2/keeper/amm.go | 178 - x/perp/v2/keeper/amm_test.go | 467 -- x/perp/v2/keeper/calc.go | 98 - x/perp/v2/keeper/calc_test.go | 395 -- x/perp/v2/keeper/clearing_house.go | 910 ---- x/perp/v2/keeper/clearing_house_test.go | 2104 -------- x/perp/v2/keeper/dnr.go | 174 - x/perp/v2/keeper/dnr_int_encoder_test.go | 59 - x/perp/v2/keeper/dnr_test.go | 205 - x/perp/v2/keeper/grpc_query.go | 192 - x/perp/v2/keeper/grpc_query_test.go | 442 -- x/perp/v2/keeper/hooks.go | 89 - x/perp/v2/keeper/hooks_test.go | 153 - x/perp/v2/keeper/keeper.go | 124 - x/perp/v2/keeper/liquidate.go | 429 -- x/perp/v2/keeper/liquidate_test.go | 404 -- x/perp/v2/keeper/margin.go | 197 - x/perp/v2/keeper/margin_test.go | 312 -- x/perp/v2/keeper/msg_server.go | 122 - x/perp/v2/keeper/msg_server_test.go | 338 -- x/perp/v2/keeper/position.go | 32 - x/perp/v2/keeper/position_test.go | 1 - x/perp/v2/keeper/settlement.go | 33 - x/perp/v2/keeper/settlement_test.go | 116 - x/perp/v2/keeper/swap.go | 113 - x/perp/v2/keeper/swap_test.go | 213 - x/perp/v2/keeper/twap.go | 184 - x/perp/v2/keeper/twap_test.go | 404 -- x/perp/v2/keeper/withdraw.go | 130 - x/perp/v2/keeper/withdraw_test.go | 95 - x/perp/v2/module/abci.go | 69 - x/perp/v2/module/abci_test.go | 145 - x/perp/v2/module/genesis.go | 138 - x/perp/v2/module/genesis_test.go | 162 - x/perp/v2/module/module.go | 169 - x/perp/v2/types/amm.go | 428 -- x/perp/v2/types/amm_test.go | 803 --- x/perp/v2/types/change_reason.go | 61 - x/perp/v2/types/change_reason_test.go | 59 - x/perp/v2/types/codec.go | 35 - x/perp/v2/types/codec_test.go | 42 - x/perp/v2/types/errors.go | 50 - x/perp/v2/types/event.pb.go | 2663 ---------- x/perp/v2/types/expected_keepers.go | 50 - x/perp/v2/types/genesis.go | 78 - x/perp/v2/types/genesis.pb.go | 1987 -------- x/perp/v2/types/genesis_test.go | 187 - x/perp/v2/types/keys.go | 31 - x/perp/v2/types/market.go | 190 - x/perp/v2/types/market_test.go | 177 - x/perp/v2/types/msgs.go | 256 - x/perp/v2/types/msgs_test.go | 538 -- x/perp/v2/types/position.go | 156 - x/perp/v2/types/position_test.go | 143 - x/perp/v2/types/query.pb.go | 2890 ----------- x/perp/v2/types/query.pb.gw.go | 485 -- x/perp/v2/types/snapshot.go | 43 - x/perp/v2/types/snapshot_test.go | 130 - x/perp/v2/types/state.pb.go | 2432 --------- x/perp/v2/types/tx.pb.go | 5089 ------------------- x/spot/client/testutil/cli_test.go | 2 +- x/spot/client/testutil/test_helpers.go | 2 +- x/sudo/cli/cli_test.go | 4 +- x/sudo/keeper/msg_server_test.go | 3 +- x/tokenfactory/cli/cli_test.go | 2 +- 130 files changed, 124 insertions(+), 34802 deletions(-) delete mode 100644 wasmbinding/exec_perp.go delete mode 100644 wasmbinding/exec_perp_test.go delete mode 100644 wasmbinding/querier_perp_test.go delete mode 100644 x/common/testutil/genesis/perp_genesis.go delete mode 100644 x/common/testutil/mock/perp_amm.go delete mode 100644 x/common/testutil/mock/perp_market.go delete mode 100644 x/oracle/keeper/hooks_test.go delete mode 100644 x/perp/README.md delete mode 100644 x/perp/v2/client/cli/cli_test.go delete mode 100644 x/perp/v2/client/cli/gen_market.go delete mode 100644 x/perp/v2/client/cli/gen_market_test.go delete mode 100644 x/perp/v2/client/cli/query.go delete mode 100644 x/perp/v2/client/cli/tx.go delete mode 100644 x/perp/v2/integration/action/dnr.go delete mode 100644 x/perp/v2/integration/action/liquidation.go delete mode 100644 x/perp/v2/integration/action/margin.go delete mode 100644 x/perp/v2/integration/action/market.go delete mode 100644 x/perp/v2/integration/action/params.go delete mode 100644 x/perp/v2/integration/action/position.go delete mode 100644 x/perp/v2/integration/action/query.go delete mode 100644 x/perp/v2/integration/action/settlement.go delete mode 100644 x/perp/v2/integration/action/snapshot.go delete mode 100644 x/perp/v2/integration/action/tx.go delete mode 100644 x/perp/v2/integration/action/withdraw.go delete mode 100644 x/perp/v2/integration/assertion/bank.go delete mode 100644 x/perp/v2/integration/assertion/event.go delete mode 100644 x/perp/v2/integration/assertion/market.go delete mode 100644 x/perp/v2/integration/assertion/notional.go delete mode 100644 x/perp/v2/integration/assertion/position.go delete mode 100644 x/perp/v2/integration/assertion/twap.go delete mode 100644 x/perp/v2/keeper/admin.go delete mode 100644 x/perp/v2/keeper/admin_test.go delete mode 100644 x/perp/v2/keeper/amm.go delete mode 100644 x/perp/v2/keeper/amm_test.go delete mode 100644 x/perp/v2/keeper/calc.go delete mode 100644 x/perp/v2/keeper/calc_test.go delete mode 100644 x/perp/v2/keeper/clearing_house.go delete mode 100644 x/perp/v2/keeper/clearing_house_test.go delete mode 100644 x/perp/v2/keeper/dnr.go delete mode 100644 x/perp/v2/keeper/dnr_int_encoder_test.go delete mode 100644 x/perp/v2/keeper/dnr_test.go delete mode 100644 x/perp/v2/keeper/grpc_query.go delete mode 100644 x/perp/v2/keeper/grpc_query_test.go delete mode 100644 x/perp/v2/keeper/hooks.go delete mode 100644 x/perp/v2/keeper/hooks_test.go delete mode 100644 x/perp/v2/keeper/keeper.go delete mode 100644 x/perp/v2/keeper/liquidate.go delete mode 100644 x/perp/v2/keeper/liquidate_test.go delete mode 100644 x/perp/v2/keeper/margin.go delete mode 100644 x/perp/v2/keeper/margin_test.go delete mode 100644 x/perp/v2/keeper/msg_server.go delete mode 100644 x/perp/v2/keeper/msg_server_test.go delete mode 100644 x/perp/v2/keeper/position.go delete mode 100644 x/perp/v2/keeper/position_test.go delete mode 100644 x/perp/v2/keeper/settlement.go delete mode 100644 x/perp/v2/keeper/settlement_test.go delete mode 100644 x/perp/v2/keeper/swap.go delete mode 100644 x/perp/v2/keeper/swap_test.go delete mode 100644 x/perp/v2/keeper/twap.go delete mode 100644 x/perp/v2/keeper/twap_test.go delete mode 100644 x/perp/v2/keeper/withdraw.go delete mode 100644 x/perp/v2/keeper/withdraw_test.go delete mode 100644 x/perp/v2/module/abci.go delete mode 100644 x/perp/v2/module/abci_test.go delete mode 100644 x/perp/v2/module/genesis.go delete mode 100644 x/perp/v2/module/genesis_test.go delete mode 100644 x/perp/v2/module/module.go delete mode 100644 x/perp/v2/types/amm.go delete mode 100644 x/perp/v2/types/amm_test.go delete mode 100644 x/perp/v2/types/change_reason.go delete mode 100644 x/perp/v2/types/change_reason_test.go delete mode 100644 x/perp/v2/types/codec.go delete mode 100644 x/perp/v2/types/codec_test.go delete mode 100644 x/perp/v2/types/errors.go delete mode 100644 x/perp/v2/types/event.pb.go delete mode 100644 x/perp/v2/types/expected_keepers.go delete mode 100644 x/perp/v2/types/genesis.go delete mode 100644 x/perp/v2/types/genesis.pb.go delete mode 100644 x/perp/v2/types/genesis_test.go delete mode 100644 x/perp/v2/types/keys.go delete mode 100644 x/perp/v2/types/market.go delete mode 100644 x/perp/v2/types/market_test.go delete mode 100644 x/perp/v2/types/msgs.go delete mode 100644 x/perp/v2/types/msgs_test.go delete mode 100644 x/perp/v2/types/position.go delete mode 100644 x/perp/v2/types/position_test.go delete mode 100644 x/perp/v2/types/query.pb.go delete mode 100644 x/perp/v2/types/query.pb.gw.go delete mode 100644 x/perp/v2/types/snapshot.go delete mode 100644 x/perp/v2/types/snapshot_test.go delete mode 100644 x/perp/v2/types/state.pb.go delete mode 100644 x/perp/v2/types/tx.pb.go diff --git a/app/ante/commission_test.go b/app/ante/commission_test.go index 693cc39b2..7bce01a28 100644 --- a/app/ante/commission_test.go +++ b/app/ante/commission_test.go @@ -114,7 +114,7 @@ func (s *AnteTestSuite) TestAnteDecoratorStakingCommission() { sdk.NewCoin("utoken", sdk.NewInt(500)), ) - encCfg := app.MakeEncodingConfigAndRegister() + encCfg := app.MakeEncodingConfig() txBuilder, err := sdkclienttx.Factory{}. WithFees(txGasCoins.String()). WithChainID(s.ctx.ChainID()). diff --git a/app/ante/testutil_test.go b/app/ante/testutil_test.go index d18aa8ffb..9e6d50edc 100644 --- a/app/ante/testutil_test.go +++ b/app/ante/testutil_test.go @@ -20,7 +20,6 @@ import ( "github.com/NibiruChain/nibiru/app" nibiruante "github.com/NibiruChain/nibiru/app/ante" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" ) @@ -39,7 +38,7 @@ type AnteTestSuite struct { func (suite *AnteTestSuite) SetupTest() { // Set up base app and ctx testapp.EnsureNibiruPrefix() - encodingConfig := genesis.TEST_ENCODING_CONFIG + encodingConfig := app.MakeEncodingConfig() suite.app = testapp.NewNibiruTestApp(app.NewDefaultGenesisState(encodingConfig.Marshaler)) chainId := "test-chain-id" ctx := suite.app.NewContext(true, tmproto.Header{ diff --git a/app/app.go b/app/app.go index 217acf677..1a3cb5795 100644 --- a/app/app.go +++ b/app/app.go @@ -117,7 +117,6 @@ func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasm.Option // Add the bindings to the app's set of []wasm.Option. wasmOpts = append(wasmOpts, wasmbinding.RegisterWasmOptions( - nibiru.PerpKeeperV2, nibiru.SudoKeeper, nibiru.OracleKeeper, )...) @@ -405,7 +404,7 @@ func (app *NibiruApp) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper { This is provided for compatibility between protobuf and amino implementations. */ func (app *NibiruApp) GetTxConfig() client.TxConfig { - return MakeEncodingConfigAndRegister().TxConfig + return MakeEncodingConfig().TxConfig } // ------------------------------------------------------------------------ diff --git a/app/codec/codec.go b/app/codec/codec.go index 410106457..9de4fb1d6 100644 --- a/app/codec/codec.go +++ b/app/codec/codec.go @@ -4,7 +4,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" "github.com/cosmos/cosmos-sdk/codec/types" - "github.com/cosmos/cosmos-sdk/std" "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -19,23 +18,15 @@ type EncodingConfig struct { // MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. func MakeEncodingConfig() EncodingConfig { - encodingConfig := DefaultEncoding() - std.RegisterLegacyAminoCodec(encodingConfig.Amino) - std.RegisterInterfaces(encodingConfig.InterfaceRegistry) - return encodingConfig -} - -func DefaultEncoding() EncodingConfig { amino := codec.NewLegacyAmino() interfaceRegistry := types.NewInterfaceRegistry() marshaler := codec.NewProtoCodec(interfaceRegistry) txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes) - encodingConfig := EncodingConfig{ + return EncodingConfig{ InterfaceRegistry: interfaceRegistry, Marshaler: marshaler, TxConfig: txCfg, Amino: amino, } - return encodingConfig } diff --git a/app/encoding.go b/app/encoding.go index 75039aac1..b71f4e4c2 100644 --- a/app/encoding.go +++ b/app/encoding.go @@ -2,21 +2,17 @@ package app import ( "github.com/NibiruChain/nibiru/app/codec" + "github.com/cosmos/cosmos-sdk/std" ) -// EncodingConfig specifies the concrete encoding types to use for a given app. -// This is provided for compatibility between protobuf and amino implementations. type EncodingConfig = codec.EncodingConfig -// RegisterModuleBasics registers an EncodingConfig for amino based test configuration. -func RegisterModuleBasics(encodingConfig EncodingConfig) EncodingConfig { +// MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. +func MakeEncodingConfig() codec.EncodingConfig { + encodingConfig := codec.MakeEncodingConfig() + std.RegisterLegacyAminoCodec(encodingConfig.Amino) + std.RegisterInterfaces(encodingConfig.InterfaceRegistry) ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino) ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry) return encodingConfig } - -// MakeEncodingConfigAndRegister creates an EncodingConfig for an amino based test configuration. -func MakeEncodingConfigAndRegister() EncodingConfig { - encodingConfig := codec.MakeEncodingConfig() - return RegisterModuleBasics(encodingConfig) -} diff --git a/app/ibc_test.go b/app/ibc_test.go index df05bddba..e5b8147d8 100644 --- a/app/ibc_test.go +++ b/app/ibc_test.go @@ -31,7 +31,7 @@ func SetupNibiruTestingApp() ( nibiruApp, _ := testapp.NewNibiruTestAppAndContext() // Create genesis state - encCdc := app.MakeEncodingConfigAndRegister() + encCdc := app.MakeEncodingConfig() genesisState := app.NewDefaultGenesisState(encCdc.Marshaler) return nibiruApp, genesisState diff --git a/app/keepers.go b/app/keepers.go index af22e3cae..8e36e9669 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -107,9 +107,6 @@ import ( oracle "github.com/NibiruChain/nibiru/x/oracle" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perpkeeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - perpmodule "github.com/NibiruChain/nibiru/x/perp/v2/module" - perptypes "github.com/NibiruChain/nibiru/x/perp/v2/types" "github.com/NibiruChain/nibiru/x/spot" spotkeeper "github.com/NibiruChain/nibiru/x/spot/keeper" @@ -169,7 +166,6 @@ type AppKeepers struct { // Nibiru keepers // --------------- EpochsKeeper epochskeeper.Keeper - PerpKeeperV2 perpkeeper.Keeper SpotKeeper spotkeeper.Keeper OracleKeeper oraclekeeper.Keeper InflationKeeper inflationkeeper.Keeper @@ -212,7 +208,6 @@ func initStoreKeys() ( spottypes.StoreKey, oracletypes.StoreKey, epochstypes.StoreKey, - perptypes.StoreKey, inflationtypes.StoreKey, sudotypes.StoreKey, wasm.StoreKey, @@ -361,11 +356,6 @@ func (app *NibiruApp) InitKeepers( appCodec, keys[epochstypes.StoreKey], ) - app.PerpKeeperV2 = perpkeeper.NewKeeper( - appCodec, keys[perptypes.StoreKey], - app.AccountKeeper, app.BankKeeper, app.OracleKeeper, app.EpochsKeeper, - ) - app.InflationKeeper = inflationkeeper.NewKeeper( appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, authtypes.FeeCollectorName, @@ -377,7 +367,6 @@ func (app *NibiruApp) InitKeepers( app.EpochsKeeper.SetHooks( epochstypes.NewMultiEpochHooks( - app.PerpKeeperV2.Hooks(), app.InflationKeeper.Hooks(), app.OracleKeeper.Hooks(), ), @@ -589,7 +578,6 @@ func (app *NibiruApp) initAppModules( spot.NewAppModule(appCodec, app.SpotKeeper, app.AccountKeeper, app.BankKeeper), oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), - perpmodule.NewAppModule(appCodec, app.PerpKeeperV2, app.AccountKeeper, app.BankKeeper, app.OracleKeeper), inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.stakingKeeper), sudo.NewAppModule(appCodec, app.SudoKeeper), genmsg.NewAppModule(app.MsgServiceRouter()), @@ -658,7 +646,6 @@ func orderedModuleNames() []string { epochstypes.ModuleName, spottypes.ModuleName, oracletypes.ModuleName, - perptypes.ModuleName, inflationtypes.ModuleName, sudotypes.ModuleName, @@ -774,7 +761,6 @@ func ModuleBasicManager() module.BasicManager { spot.AppModuleBasic{}, oracle.AppModuleBasic{}, epochs.AppModuleBasic{}, - perpmodule.AppModuleBasic{}, inflation.AppModuleBasic{}, sudo.AppModuleBasic{}, wasm.AppModuleBasic{}, @@ -798,11 +784,6 @@ func ModuleAccPerms() map[string][]string { ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, ibcfeetypes.ModuleName: {}, - perptypes.ModuleName: {}, - perptypes.VaultModuleAccount: {}, - perptypes.PerpEFModuleAccount: {}, - perptypes.FeePoolModuleAccount: {}, - epochstypes.ModuleName: {}, sudotypes.ModuleName: {}, common.TreasuryPoolModuleAccount: {}, diff --git a/app/modules_test.go b/app/modules_test.go index fe2e33a14..ec977aad6 100644 --- a/app/modules_test.go +++ b/app/modules_test.go @@ -21,7 +21,7 @@ func TestAppTestSuite(t *testing.T) { } func (s *TestSuite) SetupSuite() { - s.encCfg = app.MakeEncodingConfigAndRegister() + s.encCfg = app.MakeEncodingConfig() } func (s *TestSuite) DefaultGenesisCopy() app.GenesisState { @@ -52,7 +52,8 @@ func (s *TestSuite) TestGenesis() { }{ { name: "default should work fine", - gen: gens[0]}, + gen: gens[0], + }, { name: "zero commission should fail", gen: gens[1], diff --git a/cmd/nibid/cmd/genaccounts_test.go b/cmd/nibid/cmd/genaccounts_test.go index 3ea71f8e5..3846fc2f3 100644 --- a/cmd/nibid/cmd/genaccounts_test.go +++ b/cmd/nibid/cmd/genaccounts_test.go @@ -41,7 +41,7 @@ func TestAddGenesisAccountCmd(t *testing.T) { cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) - appCodec := app.MakeEncodingConfigAndRegister().Marshaler + appCodec := app.MakeEncodingConfig().Marshaler err = genutiltest.ExecInitCmd( testModuleBasicManager, home, appCodec) require.NoError(t, err) diff --git a/cmd/nibid/cmd/root.go b/cmd/nibid/cmd/root.go index 43ee00348..7f9630462 100644 --- a/cmd/nibid/cmd/root.go +++ b/cmd/nibid/cmd/root.go @@ -29,13 +29,12 @@ import ( "github.com/NibiruChain/nibiru/app" oraclecli "github.com/NibiruChain/nibiru/x/oracle/client/cli" - perpv2cli "github.com/NibiruChain/nibiru/x/perp/v2/client/cli" ) // NewRootCmd creates a new root command for nibid. It is called once in the // main function. func NewRootCmd() (*cobra.Command, app.EncodingConfig) { - encodingConfig := app.MakeEncodingConfigAndRegister() + encodingConfig := app.MakeEncodingConfig() app.SetPrefixes(app.AccountAddressPrefix) initClientCtx := client.Context{}. @@ -154,7 +153,6 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig app.EncodingConfig) { genesisCommand( encodingConfig, oraclecli.AddGenesisPricefeederDelegationCmd(app.DefaultNodeHome), - perpv2cli.AddMarketGenesisCmd(app.DefaultNodeHome), cli.AddSudoRootAccountCmd(app.DefaultNodeHome), ), queryCommand(), diff --git a/cmd/nibid/cmd/testnet_test.go b/cmd/nibid/cmd/testnet_test.go index 1b54a9909..2054580f9 100644 --- a/cmd/nibid/cmd/testnet_test.go +++ b/cmd/nibid/cmd/testnet_test.go @@ -20,7 +20,7 @@ import ( func Test_TestnetCmd(t *testing.T) { home := t.TempDir() - encodingConfig := app.MakeEncodingConfigAndRegister() + encodingConfig := app.MakeEncodingConfig() logger := log.NewNopLogger() cfg, err := genutiltest.CreateDefaultTendermintConfig(home) require.NoError(t, err) diff --git a/simapp/sim_test.go b/simapp/sim_test.go index 5ff13bb90..2b0871a94 100644 --- a/simapp/sim_test.go +++ b/simapp/sim_test.go @@ -52,7 +52,7 @@ func TestFullAppSimulation(tb *testing.T) { } }() - encoding := app.MakeEncodingConfigAndRegister() + encoding := app.MakeEncodingConfig() app := testapp.NewNibiruTestApp(app.NewDefaultGenesisState(encoding.Marshaler)) // Run randomized simulation: @@ -87,7 +87,7 @@ func TestAppStateDeterminism(t *testing.T) { t.Skip("skipping application simulation") } - encoding := app.MakeEncodingConfigAndRegister() + encoding := app.MakeEncodingConfig() config := simapp.NewConfigFromFlags() config.InitialBlockHeight = 1 diff --git a/wasmbinding/bindings/marshalling_test.go b/wasmbinding/bindings/marshalling_test.go index 8d6957da2..9c8d48706 100644 --- a/wasmbinding/bindings/marshalling_test.go +++ b/wasmbinding/bindings/marshalling_test.go @@ -12,7 +12,6 @@ import ( "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" ) type TestSuiteBindingJsonTypes struct { @@ -60,33 +59,6 @@ func (s *TestSuiteBindingJsonTypes) TestQueries() { } } -func (s *TestSuiteBindingJsonTypes) TestToAppMarket() { - var lastCwMarket bindings.Market - for _, ammMarket := range genesis.START_MARKETS { - dummyBlockHeight := int64(1) - cwMarket := bindings.NewMarket( - ammMarket.Market, - ammMarket.Amm, - "index price", - ammMarket.Amm.InstMarkPrice().String(), - dummyBlockHeight, - ) - - // Test the ToAppMarket fn - gotAppMarket, err := cwMarket.ToAppMarket() - s.Assert().NoError(err) - s.Assert().EqualValues(ammMarket.Market, gotAppMarket) - - lastCwMarket = cwMarket - } - - // Test failure case - sadCwMarket := lastCwMarket - sadCwMarket.Pair = "ftt:ust:xxx-yyy!!!" - _, err := sadCwMarket.ToAppMarket() - s.Error(err) -} - func getFileJson(t *testing.T) (fileJson map[string]json.RawMessage) { file, err := os.Open("execute_msg.json") require.NoError(t, err) diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go index fe54aaca3..0a3a5a436 100644 --- a/wasmbinding/bindings/query.go +++ b/wasmbinding/bindings/query.go @@ -1,15 +1,9 @@ package bindings import ( - "time" - sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" ) // BindingQuery corresponds to the NibiruQuery enum in CosmWasm binding @@ -73,54 +67,6 @@ type Market struct { BlockNumber sdkmath.Int `json:"block_number"` } -// ToAppMarket Converts the JSON market, which comes in from Rust, to its corresponding -// protobuf (Golang) type in the app: perpv2types.Market. -func (m Market) ToAppMarket() (appMarket perpv2types.Market, err error) { - config := m.Config - pair, err := asset.TryNewPair(m.Pair) - if err != nil { - return appMarket, err - } - return perpv2types.Market{ - Pair: pair, - Enabled: true, - Version: m.Version.Uint64(), - MaintenanceMarginRatio: config.MaintenanceMarginRatio, - MaxLeverage: config.MaxLeverage, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: 30 * time.Minute, - PrepaidBadDebt: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), - }, nil -} - -func NewMarket(appMarket perpv2types.Market, appAmm perpv2types.AMM, indexPrice, twapMark string, blockNumber int64) Market { - return Market{ - Pair: appMarket.Pair.String(), - Version: sdk.NewIntFromUint64(appMarket.Version), - BaseReserve: appAmm.BaseReserve, - QuoteReserve: appAmm.QuoteReserve, - SqrtDepth: appAmm.SqrtDepth, - // Depth: base.Mul(quote).RoundInt(), - TotalLong: appAmm.TotalLong, - TotalShort: appAmm.TotalShort, - PegMult: appAmm.PriceMultiplier, - Config: &MarketConfig{ - MaintenanceMarginRatio: appMarket.MaintenanceMarginRatio, - MaxLeverage: appMarket.MaxLeverage, - }, - MarkPrice: appAmm.InstMarkPrice(), - IndexPrice: indexPrice, - TwapMark: twapMark, - BlockNumber: sdk.NewInt(blockNumber), - } -} - type MarketConfig struct { MaintenanceMarginRatio sdk.Dec `json:"maintenance_margin_ratio"` MaxLeverage sdk.Dec `json:"max_leverage"` diff --git a/wasmbinding/exec_oracle_test.go b/wasmbinding/exec_oracle_test.go index 425e739cf..a9372e8b8 100644 --- a/wasmbinding/exec_oracle_test.go +++ b/wasmbinding/exec_oracle_test.go @@ -15,6 +15,7 @@ import ( "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" "github.com/NibiruChain/nibiru/x/common/denoms" "github.com/NibiruChain/nibiru/x/common/testutil" + "github.com/NibiruChain/nibiru/x/common/testutil/genesis" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" ) @@ -36,7 +37,9 @@ func (s *TestSuiteOracleExecutor) SetupSuite() { sender := testutil.AccAddress() s.contractDeployer = sender - genesisState := SetupPerpGenesis() + genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) + genesisState = genesis.AddOracleGenesis(genesisState) + nibiru := testapp.NewNibiruTestApp(genesisState) ctx := nibiru.NewContext(false, tmproto.Header{ Height: 1, diff --git a/wasmbinding/exec_perp.go b/wasmbinding/exec_perp.go deleted file mode 100644 index a8b458e50..000000000 --- a/wasmbinding/exec_perp.go +++ /dev/null @@ -1,248 +0,0 @@ -package wasmbinding - -import ( - "time" - - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/x/common/asset" - perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type ExecutorPerp struct { - PerpV2 perpv2keeper.Keeper -} - -func (exec *ExecutorPerp) MsgServer() perpv2types.MsgServer { - return perpv2keeper.NewMsgServerImpl(exec.PerpV2) -} - -func (exec *ExecutorPerp) MarketOrder( - cwMsg *bindings.MarketOrder, sender sdk.AccAddress, ctx sdk.Context, -) ( - sdkResp *perpv2types.MsgMarketOrderResponse, err error, -) { - if cwMsg == nil { - return sdkResp, wasmvmtypes.InvalidRequest{Err: "null open position msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return sdkResp, err - } - - var side perpv2types.Direction - if cwMsg.IsLong { - side = perpv2types.Direction_LONG - } else { - side = perpv2types.Direction_SHORT - } - - sdkMsg := &perpv2types.MsgMarketOrder{ - Sender: sender.String(), - Pair: pair, - Side: side, - QuoteAssetAmount: cwMsg.QuoteAmount, - Leverage: cwMsg.Leverage, - BaseAssetAmountLimit: cwMsg.BaseAmountLimit, - } - if err := sdkMsg.ValidateBasic(); err != nil { - return sdkResp, err - } - - goCtx := sdk.WrapSDKContext(ctx) - return exec.MsgServer().MarketOrder(goCtx, sdkMsg) -} - -func (exec *ExecutorPerp) ClosePosition( - cwMsg *bindings.ClosePosition, sender sdk.AccAddress, ctx sdk.Context, -) ( - sdkResp *perpv2types.MsgClosePositionResponse, err error, -) { - if cwMsg == nil { - return sdkResp, wasmvmtypes.InvalidRequest{Err: "null close position msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return sdkResp, err - } - - sdkMsg := &perpv2types.MsgClosePosition{ - Sender: sender.String(), - Pair: pair, - } - if err := sdkMsg.ValidateBasic(); err != nil { - return sdkResp, err - } - - goCtx := sdk.WrapSDKContext(ctx) - return exec.MsgServer().ClosePosition(goCtx, sdkMsg) -} - -func (exec *ExecutorPerp) AddMargin( - cwMsg *bindings.AddMargin, sender sdk.AccAddress, ctx sdk.Context, -) ( - sdkResp *perpv2types.MsgAddMarginResponse, err error, -) { - if cwMsg == nil { - return sdkResp, wasmvmtypes.InvalidRequest{Err: "null add margin msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return sdkResp, err - } - - sdkMsg := &perpv2types.MsgAddMargin{ - Sender: sender.String(), - Pair: pair, - Margin: cwMsg.Margin, - } - if err := sdkMsg.ValidateBasic(); err != nil { - return sdkResp, err - } - - goCtx := sdk.WrapSDKContext(ctx) - return exec.MsgServer().AddMargin(goCtx, sdkMsg) -} - -func (exec *ExecutorPerp) RemoveMargin( - cwMsg *bindings.RemoveMargin, sender sdk.AccAddress, ctx sdk.Context, -) ( - sdkResp *perpv2types.MsgRemoveMarginResponse, err error, -) { - if cwMsg == nil { - return sdkResp, wasmvmtypes.InvalidRequest{Err: "null remove margin msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return sdkResp, err - } - - sdkMsg := &perpv2types.MsgRemoveMargin{ - Sender: sender.String(), - Pair: pair, - Margin: cwMsg.Margin, - } - if err := sdkMsg.ValidateBasic(); err != nil { - return sdkResp, err - } - - goCtx := sdk.WrapSDKContext(ctx) - return exec.MsgServer().RemoveMargin(goCtx, sdkMsg) -} - -func (exec *ExecutorPerp) PegShift( - cwMsg *bindings.PegShift, contractAddr sdk.AccAddress, ctx sdk.Context, -) (err error) { - if cwMsg == nil { - return wasmvmtypes.InvalidRequest{Err: "null msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return err - } - - return exec.PerpV2.EditPriceMultiplier( - ctx, - // contractAddr, - pair, - cwMsg.PegMult, - ) -} - -func (exec *ExecutorPerp) DepthShift(cwMsg *bindings.DepthShift, ctx sdk.Context) (err error) { - if cwMsg == nil { - return wasmvmtypes.InvalidRequest{Err: "null msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return err - } - - return exec.PerpV2.EditSwapInvariant(ctx, pair, cwMsg.DepthMult) -} - -func (exec *ExecutorPerp) InsuranceFundWithdraw( - cwMsg *bindings.InsuranceFundWithdraw, ctx sdk.Context, -) (err error) { - if cwMsg == nil { - return wasmvmtypes.InvalidRequest{Err: "null msg"} - } - - to, err := sdk.AccAddressFromBech32(cwMsg.To) - if err != nil { - return err - } - - return exec.PerpV2.Admin().WithdrawFromInsuranceFund( - ctx, - cwMsg.Amount, - to, - ) -} - -// TODO: rename to CloseMarket -func (exec *ExecutorPerp) SetMarketEnabled( - cwMsg *bindings.SetMarketEnabled, ctx sdk.Context, -) (err error) { - if cwMsg == nil { - return wasmvmtypes.InvalidRequest{Err: "null msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return err - } - - return exec.PerpV2.CloseMarket(ctx, pair) -} - -func (exec *ExecutorPerp) CreateMarket( - cwMsg *bindings.CreateMarket, ctx sdk.Context, -) (err error) { - if cwMsg == nil { - return wasmvmtypes.InvalidRequest{Err: "null msg"} - } - - pair, err := asset.TryNewPair(cwMsg.Pair) - if err != nil { - return err - } - - var market perpv2types.Market - if cwMsg.MarketParams == nil { - market = perpv2types.DefaultMarket(pair) - } else { - mp := cwMsg.MarketParams - market = perpv2types.Market{ - Pair: pair, - Enabled: true, - MaintenanceMarginRatio: mp.MaintenanceMarginRatio, - MaxLeverage: mp.MaxLeverage, - LatestCumulativePremiumFraction: mp.LatestCumulativePremiumFraction, - ExchangeFeeRatio: mp.ExchangeFeeRatio, - EcosystemFundFeeRatio: mp.EcosystemFundFeeRatio, - LiquidationFeeRatio: mp.LiquidationFeeRatio, - PartialLiquidationRatio: mp.PartialLiquidationRatio, - FundingRateEpochId: mp.FundingRateEpochId, - MaxFundingRate: mp.MaxFundingRate, - TwapLookbackWindow: time.Duration(mp.TwapLookbackWindow.Int64()), - PrepaidBadDebt: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), - } - } - - return exec.PerpV2.Admin().CreateMarket(ctx, perpv2keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: cwMsg.PegMult, - SqrtDepth: cwMsg.SqrtDepth, - Market: &market, - }) -} diff --git a/wasmbinding/exec_perp_test.go b/wasmbinding/exec_perp_test.go deleted file mode 100644 index 652eb787c..000000000 --- a/wasmbinding/exec_perp_test.go +++ /dev/null @@ -1,358 +0,0 @@ -package wasmbinding_test - -import ( - "errors" - "testing" - "time" - - sdkmath "cosmossdk.io/math" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestSuitePerpExecutor_RunAll(t *testing.T) { - suite.Run(t, new(TestSuitePerpExecutor)) -} - -type TestSuitePerpExecutor struct { - suite.Suite - - nibiru *app.NibiruApp - ctx sdk.Context - contractDeployer sdk.AccAddress - exec *wasmbinding.ExecutorPerp - - contractPerp sdk.AccAddress - ratesMap map[asset.Pair]sdk.Dec - happyFields ExampleFields -} - -func (s *TestSuitePerpExecutor) SetupSuite() { - s.happyFields = GetHappyFields() - sender := testutil.AccAddress() - s.contractDeployer = sender - - genesisState := SetupPerpGenesis() - nibiru := testapp.NewNibiruTestApp(genesisState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - coins := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(420_000*69)), - sdk.NewCoin(denoms.USDT, sdk.NewInt(420_000*69)), - ) - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - - nibiru, ctx = SetupAllContracts(s.T(), sender, nibiru, ctx) - s.nibiru = nibiru - s.ctx = ctx - s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, s.contractPerp, coins)) - s.exec = &wasmbinding.ExecutorPerp{ - PerpV2: nibiru.PerpKeeperV2, - } - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, s.contractPerp, coins)) - - s.OnSetupEnd() -} - -func (s *TestSuitePerpExecutor) OnSetupEnd() { - s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - s.ratesMap = SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -// Happy path coverage of MarketOrder, AddMargin, RemoveMargin, and ClosePosition -func (s *TestSuitePerpExecutor) TestOpenAddRemoveClose() { - pair := asset.MustNewPair(s.happyFields.Pair) - margin := sdk.NewCoin(denoms.NUSD, sdk.NewInt(69)) - incorrectMargin := sdk.NewCoin(denoms.USDT, sdk.NewInt(69)) - - for _, err := range []error{ - s.DoMarketOrderTest(pair), - s.DoAddMarginTest(pair, margin), - s.DoAddIncorrectMarginTest(pair, incorrectMargin), - s.DoRemoveIncorrectMarginTest(pair, incorrectMargin), - s.DoRemoveMarginTest(pair, margin), - s.DoClosePositionTest(pair), - s.DoPegShiftTest(pair), - s.DoInsuranceFundWithdrawTest(sdk.NewInt(69), s.contractDeployer), - s.DoCreateMarketTest(asset.MustNewPair("ufoo:ubar")), - s.DoCreateMarketTestWithParams(asset.MustNewPair("ufoo2:ubar")), - } { - s.NoError(err) - } -} - -func (s *TestSuitePerpExecutor) DoMarketOrderTest(pair asset.Pair) error { - cwMsg := &bindings.MarketOrder{ - Pair: pair.String(), - IsLong: false, - QuoteAmount: sdk.NewInt(4_200_000), - Leverage: sdk.NewDec(5), - BaseAmountLimit: sdk.ZeroInt(), - } - - _, err := s.exec.MarketOrder(cwMsg, s.contractPerp, s.ctx) - if err != nil { - return err - } - - // Verify position exists with PerpKeeper - _, err = s.exec.PerpV2.GetPosition(s.ctx, pair, 1, s.contractPerp) - if err != nil { - return err - } - - // Verify position exists with CustomQuerier - multi-position - bindingQuery := bindings.BindingQuery{ - Positions: &bindings.PositionsRequest{ - Trader: s.contractPerp.String(), - }, - } - bindingRespMulti := new(bindings.PositionsRequest) - _, err = DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingRespMulti, - ) - if err != nil { - return err - } - - // Verify position exists with CustomQuerier - single position - bindingQuery = bindings.BindingQuery{ - Position: &bindings.PositionRequest{ - Trader: s.contractPerp.String(), - Pair: pair.String(), - }, - } - bindingResp := new(bindings.PositionRequest) - _, err = DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - - return err -} - -func (s *TestSuitePerpExecutor) DoAddMarginTest( - pair asset.Pair, margin sdk.Coin, -) error { - cwMsg := &bindings.AddMargin{ - Pair: pair.String(), - Margin: margin, - } - - _, err := s.exec.AddMargin(cwMsg, s.contractPerp, s.ctx) - return err -} - -func (s *TestSuitePerpExecutor) DoAddIncorrectMarginTest( - pair asset.Pair, margin sdk.Coin, -) error { - cwMsg := &bindings.AddMargin{ - Pair: pair.String(), - Margin: margin, - } - - _, err := s.exec.AddMargin(cwMsg, s.contractPerp, s.ctx) - if err == nil { - return errors.New("incorrect margin type should have failed") - } - return nil -} - -func (s *TestSuitePerpExecutor) DoRemoveIncorrectMarginTest( - pair asset.Pair, margin sdk.Coin, -) error { - cwMsg := &bindings.RemoveMargin{ - Pair: pair.String(), - Margin: margin, - } - - _, err := s.exec.RemoveMargin(cwMsg, s.contractPerp, s.ctx) - if err == nil { - return errors.New("incorrect margin type should have failed") - } - return nil -} - -func (s *TestSuitePerpExecutor) DoRemoveMarginTest( - pair asset.Pair, margin sdk.Coin, -) error { - cwMsg := &bindings.RemoveMargin{ - Pair: pair.String(), - Margin: margin, - } - - _, err := s.exec.RemoveMargin(cwMsg, s.contractPerp, s.ctx) - return err -} - -func (s *TestSuitePerpExecutor) DoClosePositionTest(pair asset.Pair) error { - cwMsg := &bindings.ClosePosition{ - Pair: pair.String(), - } - - _, err := s.exec.ClosePosition(cwMsg, s.contractPerp, s.ctx) - return err -} - -func (s *TestSuitePerpExecutor) DoPegShiftTest(pair asset.Pair) error { - contractAddr := s.contractPerp - cwMsg := &bindings.PegShift{ - Pair: pair.String(), - PegMult: sdk.NewDec(420), - } - - err := s.exec.PegShift(cwMsg, contractAddr, s.ctx) - return err -} - -func (s *TestSuitePerpExecutor) DoDepthShiftTest(pair asset.Pair) error { - cwMsg := &bindings.DepthShift{ - Pair: pair.String(), - DepthMult: sdk.NewDec(420), - } - - err := s.exec.DepthShift(cwMsg, s.ctx) - return err -} - -func (s *TestSuitePerpExecutor) DoInsuranceFundWithdrawTest( - amt sdkmath.Int, to sdk.AccAddress, -) error { - cwMsg := &bindings.InsuranceFundWithdraw{ - Amount: amt, - To: to.String(), - } - - err := testapp.FundModuleAccount( - s.nibiru.BankKeeper, - s.ctx, - perpv2types.PerpEFModuleAccount, - sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(420))), - ) - s.NoError(err) - - return s.exec.InsuranceFundWithdraw(cwMsg, s.ctx) -} - -func (s *TestSuitePerpExecutor) DoCreateMarketTest(pair asset.Pair) error { - cwMsg := &bindings.CreateMarket{ - Pair: pair.String(), - PegMult: sdk.NewDec(2_500), - SqrtDepth: sdk.NewDec(1_000), - MarketParams: nil, - } - - return s.exec.CreateMarket(cwMsg, s.ctx) -} - -func (s *TestSuitePerpExecutor) DoCreateMarketTestWithParams(pair asset.Pair) error { - cwMsg := &bindings.CreateMarket{ - Pair: pair.String(), - PegMult: sdk.NewDec(2_500), - SqrtDepth: sdk.NewDec(1_000), - MarketParams: &bindings.MarketParams{ - Pair: pair.String(), - Enabled: true, - MaintenanceMarginRatio: sdk.OneDec(), - MaxLeverage: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.OneDec(), - ExchangeFeeRatio: sdk.OneDec(), - EcosystemFundFeeRatio: sdk.OneDec(), - LiquidationFeeRatio: sdk.OneDec(), - PartialLiquidationRatio: sdk.OneDec(), - FundingRateEpochId: "hi", - MaxFundingRate: sdk.OneDec(), - TwapLookbackWindow: sdk.OneInt(), - }, - } - - return s.exec.CreateMarket(cwMsg, s.ctx) -} - -func (s *TestSuitePerpExecutor) TestSadPaths_Nil() { - var err error - - _, err = s.exec.MarketOrder(nil, nil, s.ctx) - s.Error(err) - - _, err = s.exec.AddMargin(nil, nil, s.ctx) - s.Error(err) - - _, err = s.exec.RemoveMargin(nil, nil, s.ctx) - s.Error(err) - - _, err = s.exec.ClosePosition(nil, nil, s.ctx) - s.Error(err) - - err = s.exec.PegShift( - nil, sdk.AccAddress([]byte("contract")), s.ctx) - s.Error(err) - - err = s.exec.DepthShift(nil, s.ctx) - s.Error(err) - - err = s.exec.InsuranceFundWithdraw(nil, s.ctx) - s.Error(err) -} - -func (s *TestSuitePerpExecutor) DoSetMarketEnabledTest( - pair asset.Pair, enabled bool, -) error { - cwMsg := &bindings.SetMarketEnabled{ - Pair: pair.String(), - Enabled: enabled, - } - err := s.exec.SetMarketEnabled(cwMsg, s.ctx) - if err != nil { - return err - } - - market, err := s.nibiru.PerpKeeperV2.GetMarket(s.ctx, pair) - s.NoError(err) - s.Equal(enabled, market.Enabled) - return err -} - -func (s *TestSuitePerpExecutor) TestSadPath_InsuranceFundWithdraw() { - fundsToWithdraw := sdk.NewCoin(denoms.NUSD, sdk.NewInt(69_000)) - - err := s.DoInsuranceFundWithdrawTest(fundsToWithdraw.Amount, s.contractDeployer) - s.Error(err) -} - -func (s *TestSuitePerpExecutor) TestSadPaths_InvalidPair() { - sadPair := asset.Pair("ftt:ust:doge") - pair := sadPair - margin := sdk.NewCoin(denoms.NUSD, sdk.NewInt(69)) - - for _, err := range []error{ - s.DoMarketOrderTest(pair), - s.DoAddMarginTest(pair, margin), - s.DoRemoveMarginTest(pair, margin), - s.DoClosePositionTest(pair), - s.DoPegShiftTest(pair), - s.DoDepthShiftTest(pair), - s.DoSetMarketEnabledTest(pair, true), - s.DoSetMarketEnabledTest(pair, false), - s.DoCreateMarketTest(pair), - s.DoCreateMarketTestWithParams(pair), - } { - s.Error(err) - } -} diff --git a/wasmbinding/exec_test.go b/wasmbinding/exec_test.go index 20d6d60b8..faf78f176 100644 --- a/wasmbinding/exec_test.go +++ b/wasmbinding/exec_test.go @@ -19,7 +19,6 @@ import ( "github.com/NibiruChain/nibiru/x/common/testutil/genesis" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" "github.com/NibiruChain/nibiru/x/oracle/types" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" ) @@ -91,7 +90,9 @@ func (s *TestSuiteExecutor) SetupSuite() { sender := testutil.AccAddress() s.contractDeployer = sender - genesisState := SetupPerpGenesis() + genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) + genesisState = genesis.AddOracleGenesis(genesisState) + nibiru := testapp.NewNibiruTestApp(genesisState) ctx := nibiru.NewContext(false, tmproto.Header{ Height: 1, @@ -117,69 +118,7 @@ func (s *TestSuiteExecutor) SetupSuite() { s.contractController = ContractMap[wasmbin.WasmKeyController] s.T().Logf("contract bindings-perp: %s", s.contractPerp) s.T().Logf("contract shifter: %s", s.contractShifter) - s.OnSetupEnd() -} - -func (s *TestSuiteExecutor) OnSetupEnd() { - SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -func (s *TestSuiteExecutor) TestOpenAddRemoveClose() { - pair := asset.MustNewPair(s.happyFields.Pair) - margin := sdk.NewCoin(denoms.NUSD, sdk.NewInt(69)) - - coins := sdk.NewCoins( - margin.Add(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1_000))), - ) - s.NoError(testapp.FundAccount(s.nibiru.BankKeeper, s.ctx, s.contractPerp, coins)) - - // TestMarketOrder (integration - real contract, real app) - execMsg := bindings.NibiruMsg{ - MarketOrder: &bindings.MarketOrder{ - Pair: s.happyFields.Pair, - IsLong: true, - QuoteAmount: sdk.NewInt(42), - Leverage: sdk.NewDec(5), - BaseAmountLimit: sdk.ZeroInt(), - }, - } - - s.T().Log("Executing with permission should succeed") - s.keeper.SetSudoContracts( - []string{s.contractPerp.String()}, s.ctx, - ) - - contractRespBz, err := s.ExecuteAgainstContract(s.contractPerp, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - // TestAddMargin (integration - real contract, real app) - execMsg = bindings.NibiruMsg{ - AddMargin: &bindings.AddMargin{ - Pair: pair.String(), - Margin: margin, - }, - } - contractRespBz, err = s.ExecuteAgainstContract(s.contractPerp, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - // TestRemoveMargin (integration - real contract, real app) - execMsg = bindings.NibiruMsg{ - RemoveMargin: &bindings.RemoveMargin{ - Pair: pair.String(), - Margin: margin, - }, - } - contractRespBz, err = s.ExecuteAgainstContract(s.contractPerp, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - // TestClosePosition (integration - real contract, real app) - execMsg = bindings.NibiruMsg{ - ClosePosition: &bindings.ClosePosition{ - Pair: pair.String(), - }, - } - contractRespBz, err = s.ExecuteAgainstContract(s.contractPerp, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) + // SetExchangeRates(&s.Suite, s.nibiru, s.ctx) } func (s *TestSuiteExecutor) TestOracleParams() { @@ -359,40 +298,6 @@ func (s *TestSuiteExecutor) TestOracleParams() { s.Require().Equal(theValidatorFeeRatio, params.ValidatorFeeRatio) } -func (s *TestSuiteExecutor) TestPegShift() { - pair := asset.MustNewPair(s.happyFields.Pair) - execMsg := bindings.NibiruMsg{ - PegShift: &bindings.PegShift{ - Pair: pair.String(), - PegMult: sdk.NewDec(420), - }, - } - - s.T().Log("Executing with permission should succeed") - contract := s.contractShifter - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing the wrong contract should fail") - contract = s.contractPerp - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - s.Contains(err.Error(), "Error parsing into type") -} - func (s *TestSuiteExecutor) TestNoOp() { contract := s.contractShifter execMsg := bindings.NibiruMsg{ @@ -401,171 +306,3 @@ func (s *TestSuiteExecutor) TestNoOp() { contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) s.NoErrorf(err, "contractRespBz: %s", contractRespBz) } - -func (s *TestSuiteExecutor) TestDepthShift() { - pair := asset.MustNewPair(s.happyFields.Pair) - execMsg := bindings.NibiruMsg{ - DepthShift: &bindings.DepthShift{ - Pair: pair.String(), - DepthMult: sdk.NewDec(2), - }, - } - - s.T().Log("Executing with permission should succeed") - contract := s.contractShifter - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing the wrong contract should fail") - contract = s.contractPerp - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - s.Contains(err.Error(), "Error parsing into type") -} - -func (s *TestSuiteExecutor) TestInsuranceFundWithdraw() { - admin := s.contractDeployer.String() - amtToWithdraw := sdk.NewInt(69) - execMsg := bindings.NibiruMsg{ - InsuranceFundWithdraw: &bindings.InsuranceFundWithdraw{ - Amount: amtToWithdraw, - To: admin, - }, - } - - s.T().Log("Executing should fail since the IF doesn't have funds") - contract := s.contractController - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing should work when the IF has funds") - err = testapp.FundModuleAccount( - s.nibiru.BankKeeper, - s.ctx, - perpv2types.PerpEFModuleAccount, - sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(420))), - ) - s.NoError(err) - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing the wrong contract should fail") - contract = s.contractPerp - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - s.Contains(err.Error(), "Error parsing into type") -} - -func (s *TestSuiteExecutor) TestSetMarketEnabled() { - // admin := s.contractDeployer.String() - perpv2Genesis := genesis.PerpV2Genesis() - contract := s.contractController - var execMsg bindings.NibiruMsg - - for testIdx, market := range perpv2Genesis.Markets { - execMsg = bindings.NibiruMsg{ - SetMarketEnabled: &bindings.SetMarketEnabled{ - Pair: market.Pair.String(), - Enabled: !market.Enabled, - }, - } - - s.T().Logf("Execute - happy %v: market: %s", testIdx, market.Pair) - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - marketAfter, err := s.nibiru.PerpKeeperV2.GetMarket(s.ctx, market.Pair) - s.NoError(err) - s.Equal(!market.Enabled, marketAfter.Enabled) - } - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing the wrong contract should fail") - contract = s.contractPerp - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - s.Contains(err.Error(), "Error parsing into type") -} - -func (s *TestSuiteExecutor) TestCreateMarket() { - contract := s.contractController - pair := asset.MustNewPair("bloop:blam") - execMsg := bindings.NibiruMsg{ - CreateMarket: &bindings.CreateMarket{ - Pair: pair.String(), - PegMult: sdk.NewDec(420), - SqrtDepth: sdk.NewDec(1_000), - MarketParams: nil, - }, - } - - s.T().Logf("Execute - happy: market: %s", pair) - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - market, err := s.nibiru.PerpKeeperV2.GetMarket(s.ctx, pair) - s.NoError(err) - s.NoError(market.Validate()) - s.True(market.Enabled) - s.EqualValues(pair, market.Pair) - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing the wrong contract should fail") - contract = s.contractPerp - s.keeper.SetSudoContracts( - []string{contract.String()}, s.ctx, - ) - contractRespBz, err = s.ExecuteAgainstContract(contract, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - s.Contains(err.Error(), "Error parsing into type") -} diff --git a/wasmbinding/message_plugin.go b/wasmbinding/message_plugin.go index 2b2c726bf..7a9d607c0 100644 --- a/wasmbinding/message_plugin.go +++ b/wasmbinding/message_plugin.go @@ -12,7 +12,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" - perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper" ) var _ wasmkeeper.Messenger = (*CustomMessenger)(nil) @@ -21,7 +20,6 @@ var _ wasmkeeper.Messenger = (*CustomMessenger)(nil) // own custom `DispatchMsg` for CosmWasm execute calls on Nibiru. type CustomMessenger struct { Wasm wasmkeeper.Messenger - Perp ExecutorPerp Sudo keeper.Keeper Oracle ExecutorOracle } @@ -62,64 +60,6 @@ func (messenger *CustomMessenger) DispatchMsg( } switch { - // Perp module | bindings-perp: for trading with smart contracts - case contractExecuteMsg.ExecuteMsg.MarketOrder != nil: - cwMsg := contractExecuteMsg.ExecuteMsg.MarketOrder - _, err = messenger.Perp.MarketOrder(cwMsg, contractAddr, ctx) - return events, data, err - case contractExecuteMsg.ExecuteMsg.ClosePosition != nil: - cwMsg := contractExecuteMsg.ExecuteMsg.ClosePosition - _, err = messenger.Perp.ClosePosition(cwMsg, contractAddr, ctx) - return events, data, err - case contractExecuteMsg.ExecuteMsg.AddMargin != nil: - cwMsg := contractExecuteMsg.ExecuteMsg.AddMargin - _, err = messenger.Perp.AddMargin(cwMsg, contractAddr, ctx) - return events, data, err - case contractExecuteMsg.ExecuteMsg.RemoveMargin != nil: - cwMsg := contractExecuteMsg.ExecuteMsg.RemoveMargin - _, err = messenger.Perp.RemoveMargin(cwMsg, contractAddr, ctx) - return events, data, err - - // Perp module | shifter - case contractExecuteMsg.ExecuteMsg.PegShift != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.PegShift - err = messenger.Perp.PegShift(cwMsg, contractAddr, ctx) - return events, data, err - case contractExecuteMsg.ExecuteMsg.DepthShift != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.DepthShift - err = messenger.Perp.DepthShift(cwMsg, ctx) - return events, data, err - - // Perp module | controller - case contractExecuteMsg.ExecuteMsg.CreateMarket != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.CreateMarket - err = messenger.Perp.CreateMarket(cwMsg, ctx) - return events, data, err - - case contractExecuteMsg.ExecuteMsg.InsuranceFundWithdraw != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.InsuranceFundWithdraw - err = messenger.Perp.InsuranceFundWithdraw(cwMsg, ctx) - return events, data, err - case contractExecuteMsg.ExecuteMsg.SetMarketEnabled != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.SetMarketEnabled - err = messenger.Perp.SetMarketEnabled(cwMsg, ctx) - return events, data, err - // Oracle module case contractExecuteMsg.ExecuteMsg.EditOracleParams != nil: if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { @@ -143,14 +83,12 @@ func (messenger *CustomMessenger) DispatchMsg( } func CustomMessageDecorator( - perpv2 perpv2keeper.Keeper, sudoKeeper keeper.Keeper, oracleKeeper oraclekeeper.Keeper, ) func(wasmkeeper.Messenger) wasmkeeper.Messenger { return func(originalWasmMessenger wasmkeeper.Messenger) wasmkeeper.Messenger { return &CustomMessenger{ Wasm: originalWasmMessenger, - Perp: ExecutorPerp{PerpV2: perpv2}, Sudo: sudoKeeper, Oracle: ExecutorOracle{Oracle: oracleKeeper}, } diff --git a/wasmbinding/querier.go b/wasmbinding/querier.go index 961df23c2..6bbeb72e1 100644 --- a/wasmbinding/querier.go +++ b/wasmbinding/querier.go @@ -2,32 +2,23 @@ package wasmbinding import ( "encoding/json" - "errors" - "fmt" sdkerrors "cosmossdk.io/errors" wasmvmtypes "github.com/CosmWasm/wasmvm/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/x/common/asset" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" ) type QueryPlugin struct { - Perp *PerpQuerier Oracle *OracleQuerier } // NewQueryPlugin returns a pointer to a new QueryPlugin -func NewQueryPlugin(perp perpv2keeper.Keeper, oracle oraclekeeper.Keeper) QueryPlugin { +func NewQueryPlugin(oracle oraclekeeper.Keeper) QueryPlugin { return QueryPlugin{ - Perp: &PerpQuerier{ - perp: perpv2keeper.NewQuerier(perp), - }, Oracle: &OracleQuerier{ oracle: oraclekeeper.NewQuerier(oracle), }, @@ -59,51 +50,7 @@ func CustomQuerier(qp QueryPlugin) func(ctx sdk.Context, request json.RawMessage } switch { - case wasmContractQuery.AllMarkets != nil: - cwReq := wasmContractQuery.AllMarkets - cwResp, err := qp.Perp.AllMarkets(ctx) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.Reserves != nil: - cwReq := wasmContractQuery.Reserves - cwResp, err := qp.Perp.Reserves(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.BasePrice != nil: - cwReq := wasmContractQuery.BasePrice - cwResp, err := qp.Perp.BasePrice(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.Positions != nil: - cwReq := wasmContractQuery.Positions - cwResp, err := qp.Perp.Positions(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.Position != nil: - cwReq := wasmContractQuery.Position - cwResp, err := qp.Perp.Position(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.PremiumFraction != nil: - cwReq := wasmContractQuery.PremiumFraction - cwResp, err := qp.Perp.PremiumFraction(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.Metrics != nil: - cwReq := wasmContractQuery.Metrics - cwResp, err := qp.Perp.Metrics(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.ModuleAccounts != nil: - cwReq := wasmContractQuery.ModuleAccounts - cwResp, err := qp.Perp.ModuleAccounts(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - case wasmContractQuery.PerpParams != nil: - cwReq := wasmContractQuery.PerpParams - cwResp, err := qp.Perp.ModuleParams(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - + // Add additional query types here case wasmContractQuery.OraclePrices != nil: cwReq := wasmContractQuery.OraclePrices cwResp, err := qp.Oracle.ExchangeRates(ctx, cwReq) @@ -115,196 +62,6 @@ func CustomQuerier(qp QueryPlugin) func(ctx sdk.Context, request json.RawMessage } } -// ---------------------------------------------------------------------- -// PerpQuerier -// ---------------------------------------------------------------------- - -type PerpQuerier struct { - perp perpv2types.QueryServer -} - -func (perpExt *PerpQuerier) Reserves( - ctx sdk.Context, cwReq *bindings.ReservesRequest, -) (*bindings.ReservesResponse, error) { - pair := asset.Pair(cwReq.Pair) - sdkReq := &perpv2types.QueryMarketsRequest{} - goCtx := sdk.WrapSDKContext(ctx) - sdkResp, err := perpExt.perp.QueryMarkets(goCtx, sdkReq) - if err != nil { - return nil, err - } - - for _, market := range sdkResp.AmmMarkets { - if market.Amm.Pair.Equal(pair) { - return &bindings.ReservesResponse{ - Pair: pair.String(), - BaseReserve: market.Amm.BaseReserve, - QuoteReserve: market.Amm.QuoteReserve, - }, err - } - } - - return nil, fmt.Errorf("market not found for pair %s", pair) -} - -func (perpExt *PerpQuerier) AllMarkets( - ctx sdk.Context, -) (*bindings.AllMarketsResponse, error) { - sdkReq := &perpv2types.QueryMarketsRequest{} - goCtx := sdk.WrapSDKContext(ctx) - sdkResp, err := perpExt.perp.QueryMarkets(goCtx, sdkReq) - if err != nil { - return nil, err - } - - marketMap := make(map[string]bindings.Market) - for _, pbMarket := range sdkResp.AmmMarkets { - key := pbMarket.Amm.Pair.String() - marketMap[key] = bindings.Market{ - Pair: key, - Version: sdk.NewIntFromUint64(pbMarket.Market.Version), - BaseReserve: pbMarket.Amm.BaseReserve, - QuoteReserve: pbMarket.Amm.QuoteReserve, - SqrtDepth: pbMarket.Amm.SqrtDepth, - TotalLong: pbMarket.Amm.TotalLong, - TotalShort: pbMarket.Amm.TotalShort, - PegMult: pbMarket.Amm.PriceMultiplier, - Config: &bindings.MarketConfig{ - MaintenanceMarginRatio: pbMarket.Market.MaintenanceMarginRatio, - MaxLeverage: pbMarket.Market.MaxLeverage, - }, - MarkPrice: pbMarket.Amm.InstMarkPrice(), - BlockNumber: sdk.NewInt(ctx.BlockHeight()), - } - } - - return &bindings.AllMarketsResponse{ - MarketMap: marketMap, - }, err -} - -func (perpExt *PerpQuerier) BasePrice( - ctx sdk.Context, cwReq *bindings.BasePriceRequest, -) (*bindings.BasePriceResponse, error) { - return nil, fmt.Errorf("not implemented") -} - -func (perpExt *PerpQuerier) PremiumFraction( - ctx sdk.Context, cwReq *bindings.PremiumFractionRequest, -) (*bindings.PremiumFractionResponse, error) { - return nil, fmt.Errorf("not implemented") -} - -func (perpExt *PerpQuerier) Metrics( - ctx sdk.Context, cwReq *bindings.MetricsRequest, -) (*bindings.MetricsResponse, error) { - return nil, fmt.Errorf("not implemented") -} - -func (perpExt *PerpQuerier) ModuleAccounts( - ctx sdk.Context, cwReq *bindings.ModuleAccountsRequest, -) (*bindings.ModuleAccountsResponse, error) { - if cwReq == nil { - return nil, errors.New("nil request") - } - - sdkReq := &perpv2types.QueryModuleAccountsRequest{} - goCtx := sdk.WrapSDKContext(ctx) - sdkResp, err := perpExt.perp.ModuleAccounts(goCtx, sdkReq) - if err != nil { - return nil, err - } - - moduleAccounts := make(map[string]bindings.ModuleAccountWithBalance) - for _, acc := range sdkResp.Accounts { - addr, err := sdk.AccAddressFromBech32(acc.Address) - if err != nil { - return nil, err - } - moduleAccounts[acc.Name] = bindings.ModuleAccountWithBalance{ - Name: acc.Name, - Addr: addr, - Balance: acc.Balance, - } - } - - return &bindings.ModuleAccountsResponse{ - ModuleAccounts: moduleAccounts, - }, err -} - -func (perpExt *PerpQuerier) ModuleParams( - ctx sdk.Context, cwReq *bindings.PerpParamsRequest, -) (*bindings.PerpParamsResponse, error) { - return nil, fmt.Errorf("not implemented") -} - -func (perpExt *PerpQuerier) Position( - ctx sdk.Context, cwReq *bindings.PositionRequest, -) (*bindings.PositionResponse, error) { - pair, err := asset.TryNewPair(cwReq.Pair) - if err != nil { - return nil, err - } - sdkReq := &perpv2types.QueryPositionRequest{ - Pair: pair, - Trader: cwReq.Trader, - } - goCtx := sdk.WrapSDKContext(ctx) - sdkResp, err := perpExt.perp.QueryPosition(goCtx, sdkReq) - if err != nil { - return nil, err - } - return &bindings.PositionResponse{ - Position: bindings.Position{ - TraderAddr: sdkResp.Position.TraderAddress, - Pair: sdkResp.Position.Pair.String(), - Size: sdkResp.Position.Size_, - Margin: sdkResp.Position.Margin, - OpenNotional: sdkResp.Position.OpenNotional, - LatestCPF: sdkResp.Position.LatestCumulativePremiumFraction, - BlockNumber: sdk.NewInt(sdkResp.Position.LastUpdatedBlockNumber), - }, - Notional: sdkResp.PositionNotional, - Upnl: sdkResp.UnrealizedPnl, - Margin_ratio_mark: sdkResp.MarginRatio, - // Margin_ratio_index: sdkResp.MarginRatioIndex, - Block_number: sdk.NewInt(sdkResp.Position.LastUpdatedBlockNumber), - }, err -} - -func (perpExt *PerpQuerier) Positions( - ctx sdk.Context, cwReq *bindings.PositionsRequest, -) (*bindings.PositionsResponse, error) { - sdkReq := &perpv2types.QueryPositionsRequest{ - Trader: cwReq.Trader, - } - goCtx := sdk.WrapSDKContext(ctx) - sdkResp, err := perpExt.perp.QueryPositions(goCtx, sdkReq) - if err != nil { - return nil, err - } - - positionMap := make(map[string]bindings.Position) - for _, posResp := range sdkResp.Positions { - pair := posResp.Position.Pair.String() - pos := posResp.Position - positionMap[pair] = bindings.Position{ - TraderAddr: pos.TraderAddress, - Pair: pair, - Size: pos.Size_, - Margin: pos.Margin, - OpenNotional: pos.OpenNotional, - LatestCPF: pos.LatestCumulativePremiumFraction, - BlockNumber: sdk.NewInt(pos.LastUpdatedBlockNumber), - } - } - - return &bindings.PositionsResponse{ - Positions: positionMap, - }, err -} - // ---------------------------------------------------------------------- // OracleQuerier // ---------------------------------------------------------------------- diff --git a/wasmbinding/querier_perp_test.go b/wasmbinding/querier_perp_test.go deleted file mode 100644 index 0a3e3c580..000000000 --- a/wasmbinding/querier_perp_test.go +++ /dev/null @@ -1,319 +0,0 @@ -package wasmbinding_test - -import ( - "encoding/json" - "testing" - "time" - - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestSuitePerpQuerier_RunAll(t *testing.T) { - suite.Run(t, new(TestSuitePerpQuerier)) -} - -func SetExchangeRates( - testSuite *suite.Suite, - nibiru *app.NibiruApp, - ctx sdk.Context, -) (exchangeRateMap map[asset.Pair]sdk.Dec) { - s := testSuite - exchangeRateTuples := []oracletypes.ExchangeRateTuple{ - { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), - ExchangeRate: sdk.NewDec(1_000), - }, - { - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - ExchangeRate: sdk.NewDec(10), - }, - } - - for _, exchangeRateTuple := range exchangeRateTuples { - pair := exchangeRateTuple.Pair - exchangeRate := exchangeRateTuple.ExchangeRate - nibiru.OracleKeeper.SetPrice(ctx, pair, exchangeRate) - - rate, err := nibiru.OracleKeeper.ExchangeRates.Get(ctx, pair) - s.Assert().NoError(err) - s.Assert().EqualValues(exchangeRate, rate.ExchangeRate) - } - - return oracletypes.ExchangeRateTuples(exchangeRateTuples).ToMap() -} - -// ———————————————————————————————————————————————————————————————————————————— -// # Test Setup -// ———————————————————————————————————————————————————————————————————————————— - -type TestSuitePerpQuerier struct { - suite.Suite - - nibiru *app.NibiruApp - ctx sdk.Context - contractDeployer sdk.AccAddress - queryPlugin wasmbinding.QueryPlugin - - contractPerp sdk.AccAddress - fields ExampleFields - ratesMap map[asset.Pair]sdk.Dec -} - -func SetupPerpGenesis() app.GenesisState { - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfigAndRegister()) - genesisState = genesis.AddOracleGenesis(genesisState) - genesisState = genesis.AddPerpV2Genesis(genesisState) - return genesisState -} - -func (s *TestSuitePerpQuerier) SetupSuite() { - s.fields = GetHappyFields() - sender := testutil.AccAddress() - s.contractDeployer = sender - - genesisState := SetupPerpGenesis() - nibiru := testapp.NewNibiruTestApp(genesisState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - coins := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(10_000_000)), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(1_420_000)), - ) - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - - nibiru, ctx = SetupAllContracts(s.T(), sender, nibiru, ctx) - s.nibiru = nibiru - s.ctx = ctx - - s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - s.queryPlugin = wasmbinding.NewQueryPlugin( - nibiru.PerpKeeperV2, - nibiru.OracleKeeper, - ) - s.OnSetupEnd() -} - -func (s *TestSuitePerpQuerier) OnSetupEnd() { - s.ratesMap = SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -// ———————————————————————————————————————————————————————————————————————————— -// # Tests -// -// - TestPremiumFraction -// - TestAllMarkets -// - TestMetrics -// - TestModuleAccounts -// - TestModuleParams -// - TestPosition -// ———————————————————————————————————————————————————————————————————————————— - -func (s *TestSuitePerpQuerier) TestPremiumFraction() { - testCases := map[string]struct { - cwReq *bindings.PremiumFractionRequest - cwResp *bindings.PremiumFractionResponse - expectErr bool - }{ - "invalid pair": { - cwReq: &bindings.PremiumFractionRequest{Pair: "nonsense"}, - expectErr: true, - }, - "happy": { - cwReq: &bindings.PremiumFractionRequest{Pair: s.fields.Pair}, - cwResp: &bindings.PremiumFractionResponse{ - Pair: s.fields.Pair, - CPF: sdk.MustNewDecFromStr("0.5"), - EstimatedNextCPF: sdk.MustNewDecFromStr("0.5"), - }, - expectErr: false, - }, - } - - for name, testCase := range testCases { - s.T().Run(name, func(t *testing.T) { - cwResp, err := s.queryPlugin.Perp.PremiumFraction( - s.ctx, testCase.cwReq, - ) - - if testCase.expectErr { - s.Error(err) - return - } - - s.Errorf(err, "cwResp: %s", cwResp) - s.Nil(cwResp) - // s.Assert().EqualValues(cwResp.Pair, cwResp.Pair) - // s.Assert().EqualValues(cwResp.CPF.String(), cwResp.CPF.String()) - // s.Assert().EqualValues(cwResp.EstimatedNextCPF.String(), cwResp.EstimatedNextCPF.String()) - }) - } -} - -func (s *TestSuitePerpQuerier) TestAllMarkets() { - type CwMarketMap map[asset.Pair]bindings.Market - - marketMap := make(CwMarketMap) - for pair, ammMarket := range genesis.START_MARKETS { - cwMarket := bindings.NewMarket( - ammMarket.Market, - ammMarket.Amm, - "", - "", - s.ctx.BlockHeight(), - ) - marketMap[pair] = cwMarket - - // Test the ToAppMarket fn - gotAppMarket, err := cwMarket.ToAppMarket() - s.Assert().NoError(err) - s.Assert().EqualValues(ammMarket.Market, gotAppMarket) - } - - testCases := map[string]struct { - marketMap CwMarketMap - expectErr bool - }{ - "happy": { - marketMap: marketMap, - expectErr: false, - }, - } - - for name, testCase := range testCases { - s.T().Run(name, func(t *testing.T) { - cwResp, err := s.queryPlugin.Perp.AllMarkets(s.ctx) - - if testCase.expectErr { - s.Error(err) - return - } - - s.NoErrorf(err, "cwResp: %s", cwResp) - for pair, cwMarketWant := range testCase.marketMap { - cwMarketOut := cwResp.MarketMap[pair.String()] - - jsonWant, err := json.Marshal(cwMarketWant) - s.Assert().NoError(err) - jsonGot, err := json.Marshal(cwMarketOut) - s.Assert().NoError(err) - - s.Assert().EqualValuesf( - cwMarketWant, cwMarketOut, - "\nwant: %s\ngot: %s", jsonWant, jsonGot, - ) - } - }) - } -} - -func (s *TestSuitePerpQuerier) TestMetrics() { - // happy case - for pair := range genesis.START_MARKETS { - cwReq := &bindings.MetricsRequest{Pair: pair.String()} - cwResp, err := s.queryPlugin.Perp.Metrics(s.ctx, cwReq) - s.Error(err, "cwResp: %s", cwResp) - s.Nil(cwResp) - } - - // sad case - cwReq := &bindings.MetricsRequest{Pair: "ftt:ust"} - cwResp, err := s.queryPlugin.Perp.Metrics(s.ctx, cwReq) - s.Errorf(err, "cwResp: %s", cwResp) -} - -func (s *TestSuitePerpQuerier) TestModuleAccounts() { - cwReq := &bindings.ModuleAccountsRequest{} - cwResp, err := s.queryPlugin.Perp.ModuleAccounts(s.ctx, cwReq) - s.NoErrorf(err, "\ncwResp: %s", cwResp) -} - -func (s *TestSuitePerpQuerier) TestModuleParams() { - cwReq := &bindings.PerpParamsRequest{} - cwResp, err := s.queryPlugin.Perp.ModuleParams(s.ctx, cwReq) - s.Errorf(err, "\ncwResp: %s", cwResp) - s.Nil(cwResp) -} - -func (s *TestSuitePerpQuerier) TestPosition() { - trader := s.contractDeployer - pair := genesis.PerpV2Genesis().Markets[0].Pair - margin := sdk.NewInt(1_000_000) - leverage := sdk.NewDec(5) - baseAmtLimit := sdk.ZeroDec() - - s.T().Log("Request should error since the trader hasn't yet opened a position") - cwReq := &bindings.PositionRequest{ - Trader: trader.String(), - Pair: pair.String(), - } - cwResp, err := s.queryPlugin.Perp.Position(s.ctx, cwReq) - s.Errorf(err, "\ncwResp: %s", cwResp) - - s.T().Log("Open a position") - resp, err := s.nibiru.PerpKeeperV2.MarketOrder( - s.ctx, pair, perpv2types.Direction_LONG, - trader, margin, leverage, baseAmtLimit, - ) - s.NoError(err) - - s.T().Log("Successfully query position") - cwResp, err = s.queryPlugin.Perp.Position(s.ctx, cwReq) - s.NoErrorf(err, "\ncwResp: %s", cwResp) - - // Verify that the response marshals to JSON - jsonBz, err := json.Marshal(cwResp) - s.NoErrorf(err, "jsonBz: %s", jsonBz) - // and unmarshals from JSON - freshCwResp := new(bindings.PositionResponse) - err = json.Unmarshal(jsonBz, freshCwResp) - s.NoErrorf(err, "freshCwResp: %s", freshCwResp) - s.Assert().EqualValues(resp.ExchangedNotionalValue, leverage.MulInt(margin)) - s.Assert().EqualValues(cwResp.Position.OpenNotional, leverage.MulInt(margin)) - s.Assert().EqualValues(cwResp.Position.Margin, sdk.NewDecFromInt(margin)) - - s.T().Log("fail due to invalid pair") - cwReq = &bindings.PositionRequest{ - Trader: trader.String(), - Pair: "ftt:ust:xyz", - } - cwResp, err = s.queryPlugin.Perp.Position(s.ctx, cwReq) - s.Errorf(err, "\ncwResp: %s", cwResp) - - s.T().Log("test multiple positions query") - positionResponses := []bindings.PositionResponse{*freshCwResp} - s.DoPositionsTest(trader, positionResponses) -} - -func (s *TestSuitePerpQuerier) DoPositionsTest( - trader sdk.AccAddress, responses []bindings.PositionResponse, -) { - s.T().Log("test multiple positions query") - cwReq := &bindings.PositionsRequest{ - Trader: trader.String(), - } - cwResp, err := s.queryPlugin.Perp.Positions(s.ctx, cwReq) - s.NoErrorf(err, "\ncwResp: %s", cwResp) - - for _, resp := range responses { - pair := resp.Position.Pair - pos := cwResp.Positions[pair] - s.Assert().EqualValues(resp.Position, pos) - } -} diff --git a/wasmbinding/querier_test.go b/wasmbinding/querier_test.go index a5763c9b8..a983138cc 100644 --- a/wasmbinding/querier_test.go +++ b/wasmbinding/querier_test.go @@ -126,7 +126,9 @@ func (s *TestSuiteQuerier) SetupSuite() { sender := testutil.AccAddress() s.contractDeployer = sender - genesisState := SetupPerpGenesis() + genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) + genesisState = genesis.AddOracleGenesis(genesisState) + nibiru := testapp.NewNibiruTestApp(genesisState) ctx := nibiru.NewContext(false, tmproto.Header{ Height: 1, @@ -144,82 +146,34 @@ func (s *TestSuiteQuerier) SetupSuite() { s.ctx = ctx s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - s.OnSetupEnd() -} - -func (s *TestSuiteQuerier) OnSetupEnd() { - SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -func (s *TestSuiteQuerier) TestQueryReserves() { - testCases := map[string]struct { - pairStr string - wasmError bool - }{ - "happy": {pairStr: s.fields.Pair, wasmError: false}, - "sad - non existent pair": {pairStr: "ftt:ust", wasmError: true}, - } - - for name, testCase := range testCases { - s.T().Run(name, func(t *testing.T) { - pairStr := testCase.pairStr - bindingQuery := bindings.BindingQuery{ - Reserves: &bindings.ReservesRequest{Pair: pairStr}, - } - bindingResp := new(bindings.ReservesResponse) - - if testCase.wasmError { - _, err := DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, - bindingQuery, bindingResp, - ) - s.Assert().Contains(err.Error(), "query wasm contract failed") - return - } - - _, err := DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - s.Require().NoError(err) - - wantPair := asset.MustNewPair(pairStr) - s.Assert().EqualValues(bindingResp.Pair, wantPair) - s.Assert().EqualValues( - bindingResp.BaseReserve.String(), - genesis.START_MARKETS[wantPair].Amm.BaseReserve.String()) - s.Assert().EqualValues( - bindingResp.QuoteReserve.String(), - genesis.START_MARKETS[wantPair].Amm.QuoteReserve.String()) - }) - } + // SetExchangeRates(&s.Suite, s.nibiru, s.ctx) } // Integration test for BindingQuery::AllMarkets against real contract -func (s *TestSuiteQuerier) TestQueryAllMarkets() { - bindingQuery := bindings.BindingQuery{ - AllMarkets: &bindings.AllMarketsRequest{}, - } - bindingResp := new(bindings.AllMarketsResponse) +// func (s *TestSuiteQuerier) TestQueryAllMarkets() { +// bindingQuery := bindings.BindingQuery{ +// AllMarkets: &bindings.AllMarketsRequest{}, +// } +// bindingResp := new(bindings.AllMarketsResponse) - respBz, err := DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - s.Require().NoErrorf(err, "resp bytes: %s", respBz) +// respBz, err := DoCustomBindingQuery( +// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, +// ) +// s.Require().NoErrorf(err, "resp bytes: %s", respBz) - for pair, marketAmm := range genesis.START_MARKETS { - cwMarket := bindingResp.MarketMap[pair.String()] - s.Assert().EqualValues(marketAmm.Amm.BaseReserve, cwMarket.BaseReserve) - s.Assert().EqualValues(marketAmm.Amm.QuoteReserve, cwMarket.QuoteReserve) - s.Assert().EqualValues(marketAmm.Amm.SqrtDepth, cwMarket.SqrtDepth) - s.Assert().EqualValues(marketAmm.Amm.TotalLong, cwMarket.TotalLong) - s.Assert().EqualValues(marketAmm.Amm.TotalShort, cwMarket.TotalShort) - s.Assert().EqualValues(marketAmm.Amm.PriceMultiplier.String(), cwMarket.PegMult.String()) - s.Assert().EqualValues(marketAmm.Amm.InstMarkPrice().String(), cwMarket.MarkPrice.String()) - s.Assert().EqualValues(s.ctx.BlockHeight(), cwMarket.BlockNumber.Int64()) - } -} +// for pair, marketAmm := range genesis.START_MARKETS { +// cwMarket := bindingResp.MarketMap[pair.String()] +// s.Assert().EqualValues(marketAmm.Amm.BaseReserve, cwMarket.BaseReserve) +// s.Assert().EqualValues(marketAmm.Amm.QuoteReserve, cwMarket.QuoteReserve) +// s.Assert().EqualValues(marketAmm.Amm.SqrtDepth, cwMarket.SqrtDepth) +// s.Assert().EqualValues(marketAmm.Amm.TotalLong, cwMarket.TotalLong) +// s.Assert().EqualValues(marketAmm.Amm.TotalShort, cwMarket.TotalShort) +// s.Assert().EqualValues(marketAmm.Amm.PriceMultiplier.String(), cwMarket.PegMult.String()) +// s.Assert().EqualValues(marketAmm.Amm.InstMarkPrice().String(), cwMarket.MarkPrice.String()) +// s.Assert().EqualValues(s.ctx.BlockHeight(), cwMarket.BlockNumber.Int64()) +// } +// } -// Integration test for BindingQuery::AllMarkets against real contract func (s *TestSuiteQuerier) TestQueryExchangeRate() { bindingQuery := bindings.BindingQuery{ OraclePrices: &bindings.OraclePrices{}, @@ -269,44 +223,44 @@ func (s *TestSuiteQuerier) TestQueryBasePrice() { // s.NoError(err) } -func (s *TestSuiteQuerier) TestQueryPremiumFraction() { - cwReq := &bindings.PremiumFractionRequest{ - Pair: s.fields.Pair, - } - - bindingQuery := bindings.BindingQuery{ - PremiumFraction: cwReq, - } - bindingResp := new(bindings.PremiumFractionResponse) - - var respBz []byte - var err error - err = common.TryCatch(func() { - respBz, err = DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - s.Require().Errorf(err, "expect error since query is not implemented: resp bytes: %s", respBz) - s.Require().Contains(err.Error(), "Querier contract error") - })() - - // respBz, err := DoCustomBindingQuery( - // s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - // ) - // s.Require().NoErrorf(err, "resp bytes: %s", respBz) +// func (s *TestSuiteQuerier) TestQueryPremiumFraction() { +// cwReq := &bindings.PremiumFractionRequest{ +// Pair: s.fields.Pair, +// } - // s.Assert().EqualValues(cwReq.Pair, bindingResp.Pair) - // s.Assert().Truef( - // - // !bindingResp.CPF.IsNegative(), - // "cpf: %s", - // bindingResp.CPF) - // - // s.Assert().Truef( - // - // !bindingResp.EstimatedNextCPF.IsNegative(), - // "estimated_next_cpf: %s", - // bindingResp.EstimatedNextCPF) -} +// bindingQuery := bindings.BindingQuery{ +// PremiumFraction: cwReq, +// } +// bindingResp := new(bindings.PremiumFractionResponse) + +// var respBz []byte +// var err error +// err = common.TryCatch(func() { +// respBz, err = DoCustomBindingQuery( +// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, +// ) +// s.Require().Errorf(err, "expect error since query is not implemented: resp bytes: %s", respBz) +// s.Require().Contains(err.Error(), "Querier contract error") +// })() + +// // respBz, err := DoCustomBindingQuery( +// // s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, +// // ) +// // s.Require().NoErrorf(err, "resp bytes: %s", respBz) + +// // s.Assert().EqualValues(cwReq.Pair, bindingResp.Pair) +// // s.Assert().Truef( +// // +// // !bindingResp.CPF.IsNegative(), +// // "cpf: %s", +// // bindingResp.CPF) +// // +// // s.Assert().Truef( +// // +// // !bindingResp.EstimatedNextCPF.IsNegative(), +// // "estimated_next_cpf: %s", +// // bindingResp.EstimatedNextCPF) +// } // func (s *TestSuiteQuerier) TestQueryMetrics() { // cwReq := &bindings.MetricsRequest{ @@ -338,16 +292,16 @@ func (s *TestSuiteQuerier) TestQueryPremiumFraction() { // s.Require().NoErrorf(err, "resp bytes: %s", respBz) // } -func (s *TestSuiteQuerier) TestQueryPerpModuleAccounts() { - cwReq := &bindings.ModuleAccountsRequest{} +// func (s *TestSuiteQuerier) TestQueryPerpModuleAccounts() { +// cwReq := &bindings.ModuleAccountsRequest{} - bindingQuery := bindings.BindingQuery{ - ModuleAccounts: cwReq, - } - bindingResp := new(bindings.ModuleAccountsResponse) +// bindingQuery := bindings.BindingQuery{ +// ModuleAccounts: cwReq, +// } +// bindingResp := new(bindings.ModuleAccountsResponse) - respBz, err := DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - s.Require().NoErrorf(err, "resp bytes: %s", respBz) -} +// respBz, err := DoCustomBindingQuery( +// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, +// ) +// s.Require().NoErrorf(err, "resp bytes: %s", respBz) +// } diff --git a/wasmbinding/test/cli_test.go b/wasmbinding/test/cli_test.go index 142e23a9b..66ca94701 100644 --- a/wasmbinding/test/cli_test.go +++ b/wasmbinding/test/cli_test.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "fmt" "testing" - "time" "github.com/CosmWasm/wasmd/x/wasm" wasmcli "github.com/CosmWasm/wasmd/x/wasm/client/cli" @@ -15,13 +14,9 @@ import ( "github.com/stretchr/testify/suite" "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" "github.com/NibiruChain/nibiru/x/common/denoms" testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" ) // commonArgs is args for CLI test commands. @@ -47,38 +42,8 @@ func (s *IntegrationTestSuite) SetupSuite() { app.SetPrefixes(app.AccountAddressPrefix) - encodingConfig := app.MakeEncodingConfigAndRegister() + encodingConfig := app.MakeEncodingConfig() genesisState := genesis.NewTestGenesisState(encodingConfig) - perpv2Gen := perpv2types.DefaultGenesis() - perpv2Gen.Markets = []perpv2types.Market{ - { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), - Enabled: true, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.MustNewDecFromStr("15"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0005"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0005"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.001"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.OneDec(), - TwapLookbackWindow: 30 * time.Minute, - PrepaidBadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - }, - } - perpv2Gen.Amms = []perpv2types.AMM{ - { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), - BaseReserve: sdk.NewDec(10 * common.TO_MICRO), - QuoteReserve: sdk.NewDec(10 * common.TO_MICRO), - SqrtDepth: common.MustSqrtDec(sdk.NewDec(10 * 10 * common.TO_MICRO * common.TO_MICRO)), - PriceMultiplier: sdk.NewDec(6000), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - } - genesisState[perpv2types.ModuleName] = encodingConfig.Marshaler.MustMarshalJSON(perpv2Gen) s.cfg = testutilcli.BuildNetworkConfig(genesisState) network, err := testutilcli.New(s.T(), s.T().TempDir(), s.cfg) diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go index 5f37f29c9..ab87f6bc3 100644 --- a/wasmbinding/wasm.go +++ b/wasmbinding/wasm.go @@ -7,21 +7,19 @@ import ( "github.com/NibiruChain/nibiru/x/sudo/keeper" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" - perpv2keeper "github.com/NibiruChain/nibiru/x/perp/v2/keeper" ) func RegisterWasmOptions( - perpv2 perpv2keeper.Keeper, sudoKeeper keeper.Keeper, oracleKeeper oraclekeeper.Keeper, ) []wasm.Option { - wasmQueryPlugin := NewQueryPlugin(perpv2, oracleKeeper) + wasmQueryPlugin := NewQueryPlugin(oracleKeeper) wasmQueryOption := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{ Custom: CustomQuerier(wasmQueryPlugin), }) wasmExecuteOption := wasmkeeper.WithMessageHandlerDecorator( - CustomMessageDecorator(perpv2, sudoKeeper, oracleKeeper), + CustomMessageDecorator(sudoKeeper, oracleKeeper), ) return []wasm.Option{wasmQueryOption, wasmExecuteOption} diff --git a/x/common/testutil/cli/network.go b/x/common/testutil/cli/network.go index 1d8a436cd..897f286a5 100644 --- a/x/common/testutil/cli/network.go +++ b/x/common/testutil/cli/network.go @@ -153,7 +153,7 @@ func NewAppConstructor(encodingCfg app.EncodingConfig, chainID string) AppConstr // BuildNetworkConfig returns a configuration for a local in-testing network func BuildNetworkConfig(appGenesis app.GenesisState) Config { - encCfg := app.MakeEncodingConfigAndRegister() + encCfg := app.MakeEncodingConfig() chainID := "chain-" + tmrand.NewRand().Str(6) return Config{ diff --git a/x/common/testutil/cli/network_test.go b/x/common/testutil/cli/network_test.go index ca0b0611a..d9ace8ad2 100644 --- a/x/common/testutil/cli/network_test.go +++ b/x/common/testutil/cli/network_test.go @@ -42,7 +42,7 @@ func (s *IntegrationTestSuite) SetupSuite() { } s.T().Log("setting up integration test suite") - encConfig := app.MakeEncodingConfigAndRegister() + encConfig := app.MakeEncodingConfig() cfg := new(cli.Config) *cfg = cli.BuildNetworkConfig(genesis.NewTestGenesisState(encConfig)) network, err := cli.New( diff --git a/x/common/testutil/cli/query.go b/x/common/testutil/cli/query.go index ef96a2ef2..871cc525a 100644 --- a/x/common/testutil/cli/query.go +++ b/x/common/testutil/cli/query.go @@ -16,8 +16,6 @@ import ( "github.com/NibiruChain/nibiru/x/common/asset" oraclecli "github.com/NibiruChain/nibiru/x/oracle/client/cli" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perpv2cli "github.com/NibiruChain/nibiru/x/perp/v2/client/cli" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" sudocli "github.com/NibiruChain/nibiru/x/sudo/cli" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" ) @@ -92,44 +90,6 @@ func ExecQuery( } } -func QueryMarketsV2( - clientCtx client.Context, -) (*perpv2types.QueryMarketsResponse, error) { - queryResp := new(perpv2types.QueryMarketsResponse) - if err := ExecQuery(clientCtx, perpv2cli.CmdQueryMarkets(), []string{}, queryResp); err != nil { - return nil, err - } - return queryResp, nil -} - -func QueryMarketV2( - clientCtx client.Context, pair asset.Pair, -) (*perpv2types.AmmMarket, error) { - queryResp, err := QueryMarketsV2(clientCtx) - if err != nil { - return nil, err - } - - ammMarket := new(perpv2types.AmmMarket) - found := false - for _, duo := range queryResp.AmmMarkets { - if duo.Amm.Pair == pair { - *ammMarket = duo - found = true - break - } - } - - if !found { - jsonBz := clientCtx.Codec.MustMarshalJSON(queryResp) - - return nil, fmt.Errorf( - `expected market "%s" in response\nqueryResp: %s`, - pair, jsonBz) - } - return ammMarket, nil -} - func QueryOracleExchangeRate(clientCtx client.Context, pair asset.Pair) (*oracletypes.QueryExchangeRateResponse, error) { var queryResp oracletypes.QueryExchangeRateResponse if err := ExecQuery(clientCtx, oraclecli.GetCmdQueryExchangeRates(), []string{pair.String()}, &queryResp); err != nil { @@ -138,14 +98,6 @@ func QueryOracleExchangeRate(clientCtx client.Context, pair asset.Pair) (*oracle return &queryResp, nil } -func QueryPositionV2(ctx client.Context, pair asset.Pair, trader sdk.AccAddress) (*perpv2types.QueryPositionResponse, error) { - var queryResp perpv2types.QueryPositionResponse - if err := ExecQuery(ctx, perpv2cli.CmdQueryPosition(), []string{trader.String(), pair.String()}, &queryResp); err != nil { - return nil, err - } - return &queryResp, nil -} - func QueryTx(ctx client.Context, txHash string) (*sdk.TxResponse, error) { var queryResp sdk.TxResponse if err := ExecQuery( diff --git a/x/common/testutil/genesis/oracle_genesis.go b/x/common/testutil/genesis/oracle_genesis.go index 659a333cb..41cae95fd 100644 --- a/x/common/testutil/genesis/oracle_genesis.go +++ b/x/common/testutil/genesis/oracle_genesis.go @@ -10,12 +10,6 @@ import ( ) func AddOracleGenesis(gen app.GenesisState) app.GenesisState { - gen[oracletypes.ModuleName] = TEST_ENCODING_CONFIG.Marshaler. - MustMarshalJSON(OracleGenesis()) - return gen -} - -func OracleGenesis() *oracletypes.GenesisState { oracleGenesis := oracletypes.DefaultGenesisState() oracleGenesis.ExchangeRates = []oracletypes.ExchangeRateTuple{ {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: sdk.NewDec(1_000)}, @@ -23,5 +17,7 @@ func OracleGenesis() *oracletypes.GenesisState { } oracleGenesis.Params.VotePeriod = 1_000 - return oracleGenesis + gen[oracletypes.ModuleName] = app.MakeEncodingConfig().Marshaler. + MustMarshalJSON(oracleGenesis) + return gen } diff --git a/x/common/testutil/genesis/perp_genesis.go b/x/common/testutil/genesis/perp_genesis.go deleted file mode 100644 index 0a8b8b701..000000000 --- a/x/common/testutil/genesis/perp_genesis.go +++ /dev/null @@ -1,232 +0,0 @@ -package genesis - -import ( - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - perpv2types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -var TEST_ENCODING_CONFIG = app.MakeEncodingConfigAndRegister() - -func AddPerpV2Genesis(gen app.GenesisState) app.GenesisState { - extraMarketAmms := map[asset.Pair]perpv2types.AmmMarket{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD): { - Market: perpv2types.Market{ - Pair: asset.NewPair(denoms.BTC, denoms.NUSD), - Version: 1, - Enabled: true, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.04"), - MaxLeverage: sdk.MustNewDecFromStr("20"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: "30 min", - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewInt64Coin(denoms.NUSD, 0), - }, - Amm: perpv2types.AMM{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(10e6), - QuoteReserve: sdk.NewDec(10e6), - SqrtDepth: sdk.NewDec(10e6), - PriceMultiplier: sdk.NewDec(6_000), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, - asset.Registry.Pair(denoms.ATOM, denoms.NUSD): { - Market: perpv2types.Market{ - Pair: asset.NewPair(denoms.ATOM, denoms.NUSD), - Enabled: true, - Version: 1, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.MustNewDecFromStr("15"), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewInt64Coin(denoms.NUSD, 0), - }, - Amm: perpv2types.AMM{ - Pair: asset.Registry.Pair(denoms.ATOM, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(10e6), - QuoteReserve: sdk.NewDec(10e6), - SqrtDepth: sdk.NewDec(10e6), - PriceMultiplier: sdk.NewDec(6_000), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, - asset.Registry.Pair(denoms.OSMO, denoms.NUSD): { - Market: perpv2types.Market{ - Pair: asset.NewPair(denoms.OSMO, denoms.NUSD), - Enabled: true, - Version: 1, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.MustNewDecFromStr("15"), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewInt64Coin(denoms.NUSD, 0), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - Amm: perpv2types.AMM{ - Pair: asset.Registry.Pair(denoms.OSMO, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(10e6), - QuoteReserve: sdk.NewDec(10e6), - SqrtDepth: sdk.NewDec(10e6), - PriceMultiplier: sdk.NewDec(6_000), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, - } - for pair, market := range START_MARKETS { - extraMarketAmms[pair] = market - } - - var marketsv2 []perpv2types.Market - var ammsv2 []perpv2types.AMM - var marketLastVersions []perpv2types.GenesisMarketLastVersion - for _, marketAmm := range extraMarketAmms { - marketsv2 = append(marketsv2, marketAmm.Market) - ammsv2 = append(ammsv2, marketAmm.Amm) - marketLastVersions = append(marketLastVersions, perpv2types.GenesisMarketLastVersion{ - Pair: marketAmm.Market.Pair, - Version: marketAmm.Market.Version, - }) - } - - perpV2Gen := &perpv2types.GenesisState{ - Markets: marketsv2, - MarketLastVersions: marketLastVersions, - Amms: ammsv2, - Positions: []perpv2types.GenesisPosition{}, - ReserveSnapshots: []perpv2types.ReserveSnapshot{}, - } - - gen[perpv2types.ModuleName] = TEST_ENCODING_CONFIG.Marshaler. - MustMarshalJSON(perpV2Gen) - return gen -} - -var START_MARKETS = map[asset.Pair]perpv2types.AmmMarket{ - asset.Registry.Pair(denoms.ETH, denoms.NUSD): { - Market: perpv2types.Market{ - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), - Enabled: true, - Version: 1, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.MustNewDecFromStr("15"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - }, - Amm: perpv2types.AMM{ - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(10e6), - QuoteReserve: sdk.NewDec(10e6), - SqrtDepth: sdk.NewDec(10e6), - PriceMultiplier: sdk.NewDec(6_000), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, - asset.Registry.Pair(denoms.NIBI, denoms.NUSD): { - Market: perpv2types.Market{ - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - Enabled: true, - Version: 1, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.04"), - MaxLeverage: sdk.MustNewDecFromStr("20"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - }, - Amm: perpv2types.AMM{ - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(10 * common.TO_MICRO), - QuoteReserve: sdk.NewDec(10 * common.TO_MICRO), - SqrtDepth: common.MustSqrtDec(sdk.NewDec(10 * common.TO_MICRO * 10 * common.TO_MICRO)), - PriceMultiplier: sdk.NewDec(10), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, -} - -func PerpV2Genesis() *perpv2types.GenesisState { - return &perpv2types.GenesisState{ - Markets: []perpv2types.Market{ - { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - Enabled: true, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.04"), - MaxLeverage: sdk.MustNewDecFromStr("20"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - }, - }, - MarketLastVersions: []perpv2types.GenesisMarketLastVersion{ - { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - Version: 1, - }, - }, - Amms: []perpv2types.AMM{ - { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - BaseReserve: sdk.NewDec(10 * common.TO_MICRO), - QuoteReserve: sdk.NewDec(10 * common.TO_MICRO), - SqrtDepth: common.MustSqrtDec(sdk.NewDec(10 * common.TO_MICRO * 10 * common.TO_MICRO)), - PriceMultiplier: sdk.NewDec(10), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - }, - Positions: []perpv2types.GenesisPosition{}, - ReserveSnapshots: []perpv2types.ReserveSnapshot{}, - } -} diff --git a/x/common/testutil/genesis/sudo_genesis.go b/x/common/testutil/genesis/sudo_genesis.go index 25eb1a5e3..ce1a08c70 100644 --- a/x/common/testutil/genesis/sudo_genesis.go +++ b/x/common/testutil/genesis/sudo_genesis.go @@ -19,7 +19,7 @@ func AddSudoGenesis(gen app.GenesisState) ( rootAddr sdk.AccAddress, ) { sudoGenesis, rootPrivKey, rootAddr := SudoGenesis() - gen[sudotypes.ModuleName] = TEST_ENCODING_CONFIG.Marshaler. + gen[sudotypes.ModuleName] = app.MakeEncodingConfig().Marshaler. MustMarshalJSON(sudoGenesis) return gen, rootPrivKey, rootAddr } diff --git a/x/common/testutil/mock/perp_amm.go b/x/common/testutil/mock/perp_amm.go deleted file mode 100644 index 2996e6503..000000000 --- a/x/common/testutil/mock/perp_amm.go +++ /dev/null @@ -1,37 +0,0 @@ -package mock - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - asset "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// default market with sensible values for tests -func TestAMMDefault() *types.AMM { - return &types.AMM{ - Pair: asset.NewPair(denoms.BTC, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(1e12), - QuoteReserve: sdk.NewDec(1e12), - SqrtDepth: sdk.NewDec(1e12), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - SettlementPrice: sdk.ZeroDec(), - } -} - -// default market with sensible values for tests -func TestAMM(sqrtK sdk.Dec, priceMultiplier sdk.Dec) *types.AMM { - return &types.AMM{ - Pair: asset.NewPair(denoms.BTC, denoms.NUSD), - BaseReserve: sqrtK, - QuoteReserve: sqrtK, - SqrtDepth: sqrtK, - PriceMultiplier: priceMultiplier, - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - } -} diff --git a/x/common/testutil/mock/perp_market.go b/x/common/testutil/mock/perp_market.go deleted file mode 100644 index 4c5d4de48..000000000 --- a/x/common/testutil/mock/perp_market.go +++ /dev/null @@ -1,31 +0,0 @@ -package mock - -import ( - time "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - asset "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// default market with sensible values for tests -func TestMarket() *types.Market { - return &types.Market{ - Pair: asset.NewPair(denoms.BTC, denoms.NUSD), - Enabled: true, - Version: 1, - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.MustNewDecFromStr("10"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0005"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: "30 min", - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewInt64Coin(denoms.NUSD, 0), - } -} diff --git a/x/common/testutil/testapp/testapp.go b/x/common/testutil/testapp/testapp.go index ee9cde45a..0d7443791 100644 --- a/x/common/testutil/testapp/testapp.go +++ b/x/common/testutil/testapp/testapp.go @@ -22,7 +22,7 @@ import ( // NewNibiruTestAppAndContext creates an 'app.NibiruApp' instance with an // in-memory 'tmdb.MemDB' and fresh 'sdk.Context'. func NewNibiruTestAppAndContext() (*app.NibiruApp, sdk.Context) { - encoding := app.MakeEncodingConfigAndRegister() + encoding := app.MakeEncodingConfig() var appGenesis app.GenesisState = app.NewDefaultGenesisState(encoding.Marshaler) genModEpochs := epochstypes.DefaultGenesisFromTime(time.Now().UTC()) appGenesis[epochstypes.ModuleName] = encoding.Marshaler.MustMarshalJSON( @@ -59,7 +59,7 @@ func NewNibiruTestApp(gen app.GenesisState) *app.NibiruApp { db := tmdb.NewMemDB() logger := log.NewNopLogger() - encoding := app.MakeEncodingConfigAndRegister() + encoding := app.MakeEncodingConfig() app := app.NewNibiruApp( logger, db, diff --git a/x/devgas/v1/ante/ante_test.go b/x/devgas/v1/ante/ante_test.go index 8630385ff..9b9b00d43 100644 --- a/x/devgas/v1/ante/ante_test.go +++ b/x/devgas/v1/ante/ante_test.go @@ -247,7 +247,7 @@ func (suite *AnteTestSuite) TestDevGasPayout() { } t.Log("build tx and call AnteHandle") - encCfg := app.MakeEncodingConfigAndRegister() + encCfg := app.MakeEncodingConfig() txMsgs := []sdk.Msg{} for _, wasmExecMsg := range wasmExecMsgs { txMsgs = append(txMsgs, wasmExecMsg) diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index d99d19c2a..7144449ed 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -18,7 +18,7 @@ func TestEpochsExportGenesis(t *testing.T) { chainStartTime := time.Now().UTC() moduleGenesisIn := types.DefaultGenesisFromTime(chainStartTime) - encCfg := app.MakeEncodingConfigAndRegister() + encCfg := app.MakeEncodingConfig() appGenesis := genesis.NewTestGenesisState(encCfg) appGenesis[types.ModuleName] = encCfg.Marshaler.MustMarshalJSON(moduleGenesisIn) diff --git a/x/genmsg/integration_test.go b/x/genmsg/integration_test.go index f806e7b86..27f5c63c2 100644 --- a/x/genmsg/integration_test.go +++ b/x/genmsg/integration_test.go @@ -19,7 +19,7 @@ func TestIntegration(t *testing.T) { senderAddr := sdk.AccAddress("sender") recvAddr := sdk.AccAddress("recv") - encoding := app.MakeEncodingConfigAndRegister() + encoding := app.MakeEncodingConfig() appGenesis := app.NewDefaultGenesisState(encoding.Marshaler) appGenesis[banktypes.ModuleName] = encoding.Marshaler.MustMarshalJSON(&banktypes.GenesisState{ diff --git a/x/oracle/integration/app_test.go b/x/oracle/integration/app_test.go index 4886c90b0..7a9300c88 100644 --- a/x/oracle/integration/app_test.go +++ b/x/oracle/integration/app_test.go @@ -26,7 +26,7 @@ type IntegrationTestSuite struct { func (s *IntegrationTestSuite) SetupTest() { app.SetPrefixes(app.AccountAddressPrefix) homeDir := s.T().TempDir() - s.cfg = testutilcli.BuildNetworkConfig(genesis.NewTestGenesisState(app.MakeEncodingConfigAndRegister())) + s.cfg = testutilcli.BuildNetworkConfig(genesis.NewTestGenesisState(app.MakeEncodingConfig())) s.cfg.NumValidators = 4 s.cfg.GenesisState[types.ModuleName] = s.cfg.Codec.MustMarshalJSON(func() codec.ProtoMarshaler { gs := types.DefaultGenesisState() diff --git a/x/oracle/keeper/hooks.go b/x/oracle/keeper/hooks.go index 5d5ae2888..077361353 100644 --- a/x/oracle/keeper/hooks.go +++ b/x/oracle/keeper/hooks.go @@ -7,7 +7,6 @@ import ( "github.com/NibiruChain/nibiru/x/epochs/types" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perptypes "github.com/NibiruChain/nibiru/x/perp/v2/types" ) var _ types.EpochHooks = Hooks{} @@ -32,49 +31,6 @@ func NewHooks(k Keeper, accountKeeper keeper.AccountKeeper, bankKeeper bankkeepe } func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, _ uint64) { - if epochIdentifier == types.WeekEpochID { - params, err := h.k.Params.Get(ctx) - if err != nil { - h.k.Logger(ctx).Error("failed to get params", "error", err) - return - } - - account := h.accountKeeper.GetModuleAccount(ctx, perptypes.FeePoolModuleAccount) - totalOracleRewards, totalRemainder := sdk.Coins{}, sdk.Coins{} - - balances := h.bankKeeper.GetAllBalances(ctx, account.GetAddress()) - for _, balance := range balances { - oracleRewards := sdk.NewDecFromInt(balance.Amount).Mul(params.ValidatorFeeRatio).TruncateInt() - remainder := balance.Amount.Sub(oracleRewards) - - if !oracleRewards.IsZero() { - totalOracleRewards = append(totalOracleRewards, sdk.NewCoin(balance.Denom, oracleRewards)) - } - - if !remainder.IsZero() { - totalRemainder = append(totalRemainder, sdk.NewCoin(balance.Denom, remainder)) - } - } - - if !totalRemainder.IsZero() { - err = h.bankKeeper.SendCoinsFromModuleToModule(ctx, perptypes.FeePoolModuleAccount, perptypes.PerpEFModuleAccount, totalRemainder) - if err != nil { - h.k.Logger(ctx).Error("Failed to send coins to perp ef module", "err", err) - } - } - - if !totalOracleRewards.IsZero() { - err = h.k.AllocateRewards( - ctx, - perptypes.FeePoolModuleAccount, - totalOracleRewards, - 1, - ) - if err != nil { - h.k.Logger(ctx).Error("Failed to allocate oracle rewards from perp fee pool", "err", err) - } - } - } } func (h Hooks) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} diff --git a/x/oracle/keeper/hooks_test.go b/x/oracle/keeper/hooks_test.go deleted file mode 100644 index 61cc84fd4..000000000 --- a/x/oracle/keeper/hooks_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/oracle/keeper" - oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - perptypes "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestHooks_AfterEpochEnd(t *testing.T) { - tests := []struct { - name string - initialFunds sdk.Coins - epochIdentifier string - expectedOracleBalances sdk.Coins - expectedEFBalances sdk.Coins - }{ - { - name: "happy path", - initialFunds: sdk.NewCoins( - sdk.NewCoin("coin1", sdk.NewInt(1000000000000000000)), - sdk.NewCoin("coin2", sdk.NewInt(1000000000000000000)), - ), - epochIdentifier: types.WeekEpochID, - expectedOracleBalances: sdk.NewCoins( - sdk.NewCoin("coin1", sdk.NewInt(50000000000000000)), - sdk.NewCoin("coin2", sdk.NewInt(50000000000000000)), - ), - expectedEFBalances: sdk.NewCoins( - sdk.NewCoin("coin1", sdk.NewInt(950000000000000000)), - sdk.NewCoin("coin2", sdk.NewInt(950000000000000000)), - ), - }, - { - name: "zero oracle fees", - initialFunds: sdk.Coins{ - sdk.NewCoin("coin1", sdk.OneInt()), - sdk.NewCoin("coin2", sdk.OneInt()), - }, - epochIdentifier: types.WeekEpochID, - expectedOracleBalances: sdk.Coins{}, - expectedEFBalances: sdk.Coins{ - sdk.NewCoin("coin1", sdk.OneInt()), - sdk.NewCoin("coin2", sdk.OneInt()), - }, - }, - } - - for _, tt := range tests { - tt := tt - t.Run(tt.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - h := keeper.NewHooks(app.OracleKeeper, app.AccountKeeper, app.BankKeeper) - - err := testapp.FundModuleAccount(app.BankKeeper, ctx, perptypes.FeePoolModuleAccount, tt.initialFunds) - require.NoError(t, err) - - h.AfterEpochEnd(ctx, tt.epochIdentifier, 0) - - account := app.AccountKeeper.GetModuleAccount(ctx, oracletypes.ModuleName) - balances := app.BankKeeper.GetAllBalances(ctx, account.GetAddress()) - assert.Equal(t, tt.expectedOracleBalances, balances) - - account = app.AccountKeeper.GetModuleAccount(ctx, perptypes.PerpEFModuleAccount) - balances = app.BankKeeper.GetAllBalances(ctx, account.GetAddress()) - assert.Equal(t, tt.expectedEFBalances, balances) - }) - } -} diff --git a/x/oracle/types/genesis_test.go b/x/oracle/types/genesis_test.go index 89fe20a8b..deedc85e7 100644 --- a/x/oracle/types/genesis_test.go +++ b/x/oracle/types/genesis_test.go @@ -19,7 +19,7 @@ func TestGenesisValidation(t *testing.T) { } func TestGetGenesisStateFromAppState(t *testing.T) { - cdc := app.MakeEncodingConfigAndRegister().Marshaler + cdc := app.MakeEncodingConfig().Marshaler appState := make(map[string]json.RawMessage) defaultGenesisState := types.DefaultGenesisState() diff --git a/x/perp/README.md b/x/perp/README.md deleted file mode 100644 index 467e27c9f..000000000 --- a/x/perp/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `x/perp` - -Please refer to our [GitBook](https://docs.nibiru.fi/module-reference/perp). diff --git a/x/perp/v2/client/cli/cli_test.go b/x/perp/v2/client/cli/cli_test.go deleted file mode 100644 index 5ce1897c7..000000000 --- a/x/perp/v2/client/cli/cli_test.go +++ /dev/null @@ -1,749 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - "cosmossdk.io/errors" - - abcitypes "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/cli" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - "github.com/NibiruChain/nibiru/x/perp/v2/client/cli" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - cfg testutilcli.Config - network *testutilcli.Network - users []sdk.AccAddress - liquidator sdk.AccAddress -} - -func (s *IntegrationTestSuite) SetupSuite() { - /* Make test skip if -short is not used: - All tests: `go test ./...` - Unit tests only: `go test ./... -short` - Integration tests only: `go test ./... -run Integration` - https://stackoverflow.com/a/41407042/13305627 */ - if testing.Short() { - s.T().Skip("skipping integration test suite") - } - - s.T().Log("setting up integration test suite") - - app.SetPrefixes(app.AccountAddressPrefix) - - // setup market - encodingConfig := app.MakeEncodingConfigAndRegister() - genState := genesis.NewTestGenesisState(encodingConfig) - genState = genesis.AddPerpV2Genesis(genState) - genState = genesis.AddOracleGenesis(genState) - - oracleGenesis := oracletypes.DefaultGenesisState() - oracleGenesis.Params.Whitelist = []asset.Pair{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - asset.Registry.Pair(denoms.ETH, denoms.NUSD), - asset.Registry.Pair(denoms.ATOM, denoms.NUSD), - asset.Registry.Pair(denoms.OSMO, denoms.NUSD), - } - oracleGenesis.Params.VotePeriod = 1_000 - oracleGenesis.ExchangeRates = []oracletypes.ExchangeRateTuple{ - {Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), ExchangeRate: sdk.NewDec(20_000)}, - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: sdk.NewDec(2_000)}, - {Pair: asset.Registry.Pair(denoms.ATOM, denoms.NUSD), ExchangeRate: sdk.NewDec(6_000)}, - {Pair: asset.Registry.Pair(denoms.OSMO, denoms.NUSD), ExchangeRate: sdk.NewDec(6_000)}, - } - genState[oracletypes.ModuleName] = encodingConfig.Marshaler.MustMarshalJSON(oracleGenesis) - - s.cfg = testutilcli.BuildNetworkConfig(genState) - s.cfg.NumValidators = 1 - s.cfg.Mnemonics = []string{"satisfy december text daring wheat vanish save viable holiday rural vessel shuffle dice skate promote fade badge federal sail during lend fever balance give"} - network, err := testutilcli.New( - s.T(), - s.T().TempDir(), - s.cfg, - ) - s.Require().NoError(err) - s.network = network - - s.NoError(s.network.WaitForNextBlock()) - - val := s.network.Validators[0] - - for i := 0; i < 8; i++ { - newUser := testutilcli.NewAccount(s.network, fmt.Sprintf("user%d", i)) - s.users = append(s.users, newUser) - s.Require().NoError( - testutilcli.FillWalletFromValidator(newUser, - sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 10e6), - sdk.NewInt64Coin(denoms.USDC, 1e3*common.TO_MICRO), - sdk.NewInt64Coin(denoms.NUSD, 5e3*common.TO_MICRO), - ), - val, - denoms.NIBI, - ), - ) - s.NoError(s.network.WaitForNextBlock()) - } - - s.liquidator = sdk.MustAccAddressFromBech32("nibi1w89pf5yq8ntjg89048qmtaz929fdxup0a57d8m") - s.NoError( - testutilcli.FillWalletFromValidator(s.liquidator, - sdk.NewCoins(sdk.NewInt64Coin(denoms.NIBI, 1000)), - val, - denoms.NIBI, - ), - ) - s.NoError(s.network.WaitForNextBlock()) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestMultiLiquidate() { - s.T().Log("opening positions") - _, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[2], []string{ - "buy", - asset.Registry.Pair(denoms.ATOM, denoms.NUSD).String(), - "15", // Leverage - "9000000", // Quote asset amount - "0", // Base asset limit - }) - s.Require().NoError(err) - - _, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[3], []string{ - "buy", - asset.Registry.Pair(denoms.OSMO, denoms.NUSD).String(), - "15", // Leverage - "9000000", // Quote asset amount - "0", // Base asset limit - }) - s.Require().NoError(err) - - s.T().Log("opening counter positions") - _, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[4], []string{ - "sell", - asset.Registry.Pair(denoms.ATOM, denoms.NUSD).String(), - "15", // Leverage - "90000000", // Quote asset amount - "0", - }) - s.Require().NoError(err) - - s.T().Logf("review positions") - resp := new(types.QueryPositionsResponse) - s.NoError( - testutilcli.ExecQuery( - s.network.Validators[0].ClientCtx, - cli.CmdQueryPositions(), - []string{s.users[2].String()}, - resp, - ), - ) - - _, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[5], []string{ - "sell", - asset.Registry.Pair(denoms.OSMO, denoms.NUSD).String(), - "15", // Leverage - "90000000", // Quote asset amount - "0", - }) - s.Require().NoError(err) - - s.T().Log("wait 10 blocks") - height, err := s.network.LatestHeight() - s.Require().NoError(err) - _, err = s.network.WaitForHeight(height + 10) - s.Require().NoError(err) - - s.T().Log("liquidating all users...") - _, err = s.network.ExecTxCmd(cli.MultiLiquidateCmd(), s.liquidator, []string{ - fmt.Sprintf("%s:%s:%s", denoms.ATOM, denoms.NUSD, s.users[2].String()), - fmt.Sprintf("%s:%s:%s", denoms.OSMO, denoms.NUSD, s.users[3].String()), - }) - s.Require().NoError(err) - err = s.network.WaitForNextBlock() - s.Require().NoError(err) - - s.T().Log("check trader position") - _, err = testutilcli.QueryPositionV2(s.network.Validators[0].ClientCtx, asset.Registry.Pair(denoms.ATOM, denoms.NUSD), s.users[2]) - s.Require().Error(err) - - _, err = testutilcli.QueryPositionV2(s.network.Validators[0].ClientCtx, asset.Registry.Pair(denoms.OSMO, denoms.NUSD), s.users[3]) - s.Require().Error(err) - - s.T().Log("closing positions - fail") - _, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), s.users[4], []string{ - "asset.Registry.Pair(denoms.ATOM, denoms.NUSD).String()", - }) - s.Require().Error(err) // invalid pair - - _, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), s.users[4], []string{ - "uluna:usdt", - }) - s.Require().Error(err) // non whitelisted pair - - s.T().Log("closing positions") - - _, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), s.users[4], []string{ - asset.Registry.Pair(denoms.ATOM, denoms.NUSD).String(), - }) - s.Require().NoError(err) - - _, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), s.users[5], []string{ - asset.Registry.Pair(denoms.OSMO, denoms.NUSD).String(), - }) - s.Require().NoError(err) -} - -// user[0] opens a long position -func (s *IntegrationTestSuite) TestMarketOrdersAndCloseCmd() { - val := s.network.Validators[0] - user := s.users[0] - - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - exchangeRate, err := testutilcli.QueryOracleExchangeRate( - val.ClientCtx, pair, - ) - s.T().Logf("0. current exchange rate is: %+v", exchangeRate) - s.NoError(err) - - s.T().Log("A. check market balances") - ammMarketDuo, err := testutilcli.QueryMarketV2(val.ClientCtx, pair) - s.Require().NoError(err) - s.EqualValues(sdk.NewDec(10e6), ammMarketDuo.Amm.BaseReserve) - s.EqualValues(sdk.NewDec(10e6), ammMarketDuo.Amm.QuoteReserve) - - s.T().Log("A. check trader has no existing positions") - _, err = testutilcli.QueryPositionV2( - val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user, - ) - s.Error(err) - - s.T().Log("B. open position") - txResp, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), user, []string{ - "buy", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - /* leverage */ "1", - /* quoteAmt */ "2000000", // 2*10^6 uNUSD - /* baseAssetLimit */ "1", - }, - ) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("B. check market balance after open position") - ammMarketDuo, err = testutilcli.QueryMarketV2(val.ClientCtx, pair) - s.Require().NoError(err) - s.T().Logf("ammMarketDuo: %s", ammMarketDuo.String()) - s.EqualValues(sdk.MustNewDecFromStr("9999666.677777407419752675"), ammMarketDuo.Amm.BaseReserve) - s.EqualValues(sdk.MustNewDecFromStr("10000333.333333333333333333"), ammMarketDuo.Amm.QuoteReserve) - - s.T().Log("B. check trader position") - queryResp, err := testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(asset.Registry.Pair(denoms.BTC, denoms.NUSD), queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("333.322222592580247325"), queryResp.Position.Size_) - s.EqualValues(sdk.NewDec(2*common.TO_MICRO), queryResp.Position.Margin) - s.EqualValues(sdk.NewDec(2*common.TO_MICRO), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("1999999.999999999999998000"), queryResp.PositionNotional) - s.EqualValues(sdk.MustNewDecFromStr("-0.000000000000002000"), queryResp.UnrealizedPnl) - s.EqualValues(sdk.OneDec(), queryResp.MarginRatio) - - s.T().Log("C. open position with 2x leverage and zero baseAmtLimit") - txResp, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), user, []string{ - "buy", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - /* leverage */ "2", - /* quoteAmt */ "2000000", // 2*10^6 uNUSD - /* baseAmtLimit */ "0", - }) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("C. check trader position") - queryResp, err = testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(asset.Registry.Pair(denoms.BTC, denoms.NUSD), queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("999.900009999000099990"), queryResp.Position.Size_) - s.EqualValues(sdk.NewDec(4*common.TO_MICRO), queryResp.Position.Margin) - s.EqualValues(sdk.NewDec(6*common.TO_MICRO), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("6000000.000000000000000000"), queryResp.PositionNotional) - s.EqualValues(sdk.MustNewDecFromStr("0.000000000000000000"), queryResp.UnrealizedPnl) - s.EqualValues(sdk.MustNewDecFromStr("0.666666666666666667"), queryResp.MarginRatio) - - s.T().Log("D. Open a reverse position smaller than the existing position") - txResp, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), user, []string{ - "sell", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - /* leverage */ "1", - /* quoteAmt */ "1000000", // 100 uNUSD - /* baseAssetLimit */ "0", - }) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("D. Check market after opening reverse position") - - ammMarketDuo, err = testutilcli.QueryMarketV2(val.ClientCtx, pair) - s.Require().NoError(err) - s.T().Logf("ammMarketDuo: %s", ammMarketDuo.String()) - s.EqualValues(sdk.MustNewDecFromStr("9999166.736105324556286976"), ammMarketDuo.Amm.BaseReserve) - s.EqualValues(sdk.MustNewDecFromStr("10000833.333333333333333333"), ammMarketDuo.Amm.QuoteReserve) - - s.T().Log("D. Check trader position") - queryResp, err = testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(asset.Registry.Pair(denoms.BTC, denoms.NUSD), queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("833.263894675443713024"), queryResp.Position.Size_) - s.EqualValues(sdk.NewDec(4*common.TO_MICRO), queryResp.Position.Margin) - s.EqualValues(sdk.NewDec(5_000_000), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("4999999.999999999999998000"), queryResp.PositionNotional) - s.EqualValues(sdk.MustNewDecFromStr("-0.000000000000002000"), queryResp.UnrealizedPnl) - s.EqualValues(sdk.MustNewDecFromStr("0.800000000000000000"), queryResp.MarginRatio) - - s.T().Log("E. Open a reverse position larger than the existing position") - txResp, err = s.network.ExecTxCmd(cli.MarketOrderCmd(), user, []string{ - "sell", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - /* leverage */ "1", - /* quoteAmt */ "8000000", // 8*10^6 uNUSD - /* baseAssetLimit */ "0", - }) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("E. Check trader position") - queryResp, err = testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(asset.Registry.Pair(denoms.BTC, denoms.NUSD), queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("-500.025001250062503125"), queryResp.Position.Size_) - s.EqualValues(sdk.MustNewDecFromStr("3000000.000000000000002000"), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("3000000.000000000000002000"), queryResp.Position.Margin) - s.EqualValues(sdk.MustNewDecFromStr("3000000.000000000000000000"), queryResp.PositionNotional) - s.EqualValues(sdk.MustNewDecFromStr("0.000000000000002000"), queryResp.UnrealizedPnl) - // there is a random delta due to twap margin ratio calculation and random block times in the in-process network - s.InDelta(1, queryResp.MarginRatio.MustFloat64(), 0.008) - - s.T().Log("F. Close position") - txResp, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), user, []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - }) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("F. check trader position") - queryResp, err = testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.Error(err) - errors.IsOf(err, types.ErrPositionNotFound) - s.T().Logf("query response: %+v", queryResp) -} - -func (s *IntegrationTestSuite) TestPartialCloseCmd() { - val := s.network.Validators[0] - user := s.users[6] - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - var err error - - s.T().Log("Open position") - txResp, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), user, []string{ - "buy", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - /* leverage */ "1", - /* quoteAmt */ "12000000", // 12e6 uNUSD - /* baseAssetLimit */ "0", - }, - ) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("Check market balance after open position") - ammMarketDuo, err := testutilcli.QueryMarketV2(val.ClientCtx, pair) - s.Require().NoError(err) - s.T().Logf("ammMarketDuo: %s", ammMarketDuo.String()) - s.EqualValues(sdk.MustNewDecFromStr("9998000.399920015996800640"), ammMarketDuo.Amm.BaseReserve) - s.EqualValues(sdk.MustNewDecFromStr("10002000.000000000000000000"), ammMarketDuo.Amm.QuoteReserve) - - s.T().Log("Check trader position") - queryResp, err := testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(pair, queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("1999.600079984003199360"), queryResp.Position.Size_) - s.EqualValues(sdk.NewDec(12e6), queryResp.Position.Margin) - s.EqualValues(sdk.NewDec(12e6), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("12000000"), queryResp.PositionNotional) - s.EqualValues(sdk.ZeroDec(), queryResp.UnrealizedPnl) - s.EqualValues(sdk.OneDec(), queryResp.MarginRatio) - - s.T().Log("Partially close the position - fails") - _, err = s.network.ExecTxCmd(cli.PartialCloseCmd(), user, []string{ - pair.String(), - "", - }) - s.Error(err) // invalid size amount - _, err = s.network.ExecTxCmd(cli.PartialCloseCmd(), user, []string{ - "pair.String()", - "500", - }) - s.Error(err) // invalid pair - _, err = s.network.ExecTxCmd(cli.PartialCloseCmd(), user, []string{ - "uluna:usdt", - "500", - }) - s.Error(err) // not whitelisted pair - - s.T().Log("Partially close the position") - txResp, err = s.network.ExecTxCmd(cli.PartialCloseCmd(), user, []string{ - pair.String(), - "500", // 500 uBTC - }) - s.NoError(err) - s.EqualValues(abcitypes.CodeTypeOK, txResp.Code) - s.NoError(s.network.WaitForNextBlock()) - - s.T().Log("Check market after partial close") - ammMarketDuo, err = testutilcli.QueryMarketV2(val.ClientCtx, pair) - s.Require().NoError(err) - s.T().Logf("ammMarketDuo: %s", ammMarketDuo.String()) - s.EqualValues(sdk.MustNewDecFromStr("9998500.399920015996800640"), ammMarketDuo.Amm.BaseReserve) - s.EqualValues(sdk.MustNewDecFromStr("10001499.824993752062459356"), ammMarketDuo.Amm.QuoteReserve) - - s.T().Log("Check trader position") - queryResp, err = testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), user) - s.NoError(err) - s.T().Logf("query response: %+v", queryResp) - s.EqualValues(user.String(), queryResp.Position.TraderAddress) - s.EqualValues(asset.Registry.Pair(denoms.BTC, denoms.NUSD), queryResp.Position.Pair) - s.EqualValues(sdk.MustNewDecFromStr("1499.600079984003199360"), queryResp.Position.Size_) - s.EqualValues(sdk.NewDec(12e6), queryResp.Position.Margin) - s.EqualValues(sdk.MustNewDecFromStr("8998949.962512374756136000"), queryResp.Position.OpenNotional) - s.EqualValues(sdk.MustNewDecFromStr("8998949.962512374756136000"), queryResp.PositionNotional) - s.EqualValues(sdk.ZeroDec(), queryResp.UnrealizedPnl) - s.EqualValues(sdk.MustNewDecFromStr("1.333488912594172945"), queryResp.MarginRatio) -} - -func (s *IntegrationTestSuite) TestPositionEmptyAndClose() { - val := s.network.Validators[0] - user := s.users[0] - - // verify trader has no position (empty) - _, err := testutilcli.QueryPositionV2(val.ClientCtx, asset.Registry.Pair(denoms.ETH, denoms.NUSD), user) - s.Error(err, "no position found") - - // close position should produce error - _, err = s.network.ExecTxCmd(cli.ClosePositionCmd(), user, []string{ - asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - }) - s.Contains(err.Error(), types.ErrPositionNotFound.Error()) -} - -// user[0] opens a position and removes margin to trigger bad debt -func (s *IntegrationTestSuite) TestRemoveMargin() { - // Open a position with first user - s.T().Log("opening a position with user 0") - _, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[0], []string{ - "buy", - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - "10", // Leverage - "1000000", // Quote asset amount - "0", - }) - s.NoError(err) - s.NoError(s.network.WaitForNextBlock()) - - // Remove margin to trigger bad debt on user 0 - s.T().Log("removing margin on user 0....") - _, err = s.network.ExecTxCmd(cli.RemoveMarginCmd(), s.users[0], []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("%s%s", "10000000", denoms.NUSD), - }) - s.Contains(err.Error(), types.ErrBadDebt.Error()) - - s.T().Log("removing margin on user 0....") - _, err = s.network.ExecTxCmd(cli.RemoveMarginCmd(), s.users[0], []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("%s%s", "1", denoms.NUSD), - }) - s.NoError(err) - s.NoError(s.network.WaitForNextBlock()) -} - -// user[1] opens a position and adds margin -func (s *IntegrationTestSuite) TestX_AddMargin() { - // Open a new position - s.T().Log("opening a position with user 1....") - txResp, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[1], []string{ - "buy", - asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - "10", // Leverage - "1000000", // Quote asset amount - "0.0000001", - }) - s.Require().NoError(err, txResp) - s.NoError(s.network.WaitForNextBlock()) - - testCases := []struct { - name string - args []string - expectedCode uint32 - expectedMargin sdk.Dec - expectFail bool - }{ - { - name: "PASS: add margin to correct position", - args: []string{ - asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectedCode: 0, - expectedMargin: sdk.NewDec(1_010_000), - expectFail: false, - }, - { - name: "fail: position not found", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectedCode: types.ErrPositionNotFound.ABCICode(), - expectFail: false, - }, - { - name: "fail: not correct margin denom", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.USDT), - }, - expectFail: true, - }, - { - name: "fail: invalid coin", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - "100", - }, - expectFail: true, - }, - { - name: "fail: invalid pair", - args: []string{ - "alisdhjal;dhao;sdh", - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectFail: true, - }, - } - - for _, tc := range testCases { - tc := tc - s.T().Run(tc.name, func(t *testing.T) { - s.T().Log("adding margin on user 3....") - canFail := true - if tc.expectFail { - txResp, err = s.network.ExecTxCmd( - cli.AddMarginCmd(), s.users[1], tc.args, - testutilcli.WithTxOptions( - testutilcli.TxOptionChanges{CanFail: &canFail}), - ) - s.Require().Error(err, txResp) - } else { - txResp, err := s.network.ExecTxCmd( - cli.AddMarginCmd(), s.users[1], tc.args, - testutilcli.WithTxOptions( - testutilcli.TxOptionChanges{CanFail: &canFail}), - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp, err := testutilcli.QueryTx(s.network.Validators[0].ClientCtx, txResp.TxHash) - s.Require().NoError(err) - s.Require().EqualValues(tc.expectedCode, resp.Code) - - if tc.expectedCode == 0 { - // query trader position - queryResp, err := testutilcli.QueryPositionV2(s.network.Validators[0].ClientCtx, asset.Registry.Pair(denoms.ETH, denoms.NUSD), s.users[1]) - s.NoError(err) - s.EqualValues(tc.expectedMargin, queryResp.Position.Margin) - } - } - }) - } -} - -// user[1] opens a position and removes margin -func (s *IntegrationTestSuite) TestX_RemoveMargin() { - // Open a new position - s.T().Log("opening a position with user 1....") - _, err := s.network.ExecTxCmd(cli.MarketOrderCmd(), s.users[2], []string{ - "buy", - asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - "10", // Leverage - "1000000", // Quote asset amount - "0.0000001", - }) - s.Require().NoError(err) - s.NoError(s.network.WaitForNextBlock()) - - testCases := []struct { - name string - args []string - expectedCode uint32 - expectedMargin sdk.Dec - expectFail bool - }{ - { - name: "PASS: remove margin to correct position", - args: []string{ - asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectedCode: 0, - expectedMargin: sdk.NewDec(990_000), - expectFail: false, - }, - { - name: "fail: position not found", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectedCode: types.ErrPositionNotFound.ABCICode(), - expectFail: false, - }, - { - name: "fail: not correct margin denom", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - fmt.Sprintf("10000%s", denoms.USDT), - }, - expectFail: true, - }, - { - name: "fail: invalid coin", - args: []string{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD).String(), - "100", - }, - expectFail: true, - }, - { - name: "fail: invalid pair", - args: []string{ - "alisdhjal;dhao;sdh", - fmt.Sprintf("10000%s", denoms.NUSD), - }, - expectFail: true, - }, - } - - for _, tc := range testCases { - tc := tc - s.T().Run(tc.name, func(t *testing.T) { - s.T().Log("removing margin on user 3....") - - canFail := true - txResp, err := s.network.ExecTxCmd( - cli.RemoveMarginCmd(), s.users[2], tc.args, - testutilcli.WithTxOptions( - testutilcli.TxOptionChanges{CanFail: &canFail}), - ) - if tc.expectFail { - s.Require().Errorf(err, "txResp: %v", txResp) - } else { - s.Require().NoErrorf(err, "txResp: %v", txResp) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp, err := testutilcli.QueryTx(s.network.Validators[0].ClientCtx, txResp.TxHash) - s.Require().NoError(err) - s.Require().EqualValues(tc.expectedCode, resp.Code) - - if tc.expectedCode == 0 { - // query trader position - queryResp, err := testutilcli.QueryPositionV2(s.network.Validators[0].ClientCtx, asset.Registry.Pair(denoms.ETH, denoms.NUSD), s.users[2]) - s.NoError(err) - s.EqualValues(tc.expectedMargin, queryResp.Position.Margin) - } - } - }) - } -} - -func (s *IntegrationTestSuite) TestDonateToEcosystemFund() { - s.T().Logf("donate to ecosystem fund") - out, err := s.network.ExecTxCmd( - cli.DonateToEcosystemFundCmd(), - sdk.MustAccAddressFromBech32("nibi1w89pf5yq8ntjg89048qmtaz929fdxup0a57d8m"), - []string{"100unusd"}, - ) - s.NoError(err) - s.Require().EqualValues(abcitypes.CodeTypeOK, out.Code) - - s.NoError(s.network.WaitForNextBlock()) - - _, err = s.network.ExecTxCmd( - cli.DonateToEcosystemFundCmd(), - sdk.MustAccAddressFromBech32("nibi1w89pf5yq8ntjg89048qmtaz929fdxup0a57d8m"), - []string{"10"}) - s.Error(err) - - s.NoError(s.network.WaitForNextBlock()) - resp := new(sdk.Coin) - moduleAccountAddrPerpEF := "nibi1trh2mamq64u4g042zfeevvjk4cukrthvppfnc7" - s.NoError( - testutilcli.ExecQuery( - s.network.Validators[0].ClientCtx, - bankcli.GetBalancesCmd(), - []string{moduleAccountAddrPerpEF, "--denom", "unusd"}, - resp, - ), - ) - s.Require().EqualValues(sdk.NewInt64Coin("unusd", 100), *resp) -} - -func (s *IntegrationTestSuite) TestQueryModuleAccount() { - s.T().Logf("donate to ecosystem fund") - resp := new(types.QueryModuleAccountsResponse) - s.NoError( - testutilcli.ExecQuery( - s.network.Validators[0].ClientCtx, - cli.CmdQueryModuleAccounts(), - []string{}, - resp, - ), - ) -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/x/perp/v2/client/cli/gen_market.go b/x/perp/v2/client/cli/gen_market.go deleted file mode 100644 index f73d8c42b..000000000 --- a/x/perp/v2/client/cli/gen_market.go +++ /dev/null @@ -1,204 +0,0 @@ -package cli - -import ( - "encoding/json" - "fmt" - "time" - - flag "github.com/spf13/pflag" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/server" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/genutil" - genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/common/asset" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -const ( - FlagPair = "pair" - FlagSqrtDepth = "sqrt-depth" - FlagPriceMultiplier = "price-multiplier" - FlagMaintenenceMarginRatio = "mmr" - FlagMaxLeverage = "max-leverage" - FlagMaxFundingrate = "max-funding-rate" -) - -var addMarketGenesisFlags = map[string]struct { - defaultValue string - usageDocString string -}{ - FlagPair: {"", "trading pair identifier of the form 'base:quote'. E.g., ueth:unusd"}, - FlagSqrtDepth: {"", "sqrt k"}, - FlagPriceMultiplier: {"", "the peg multiplier for the pool"}, - FlagMaintenenceMarginRatio: {"0.0625", "maintenance margin ratio"}, - FlagMaxLeverage: {"10", "maximum leverage for opening a position"}, - FlagMaxFundingrate: {"0.01", "maximum funding rate for the market"}, -} - -// getCmdFlagSet returns a flag set and list of required flags for the command. -func getCmdFlagSet() (fs *flag.FlagSet, reqFlags []string) { - fs = flag.NewFlagSet("flags-add-genesis-pool", flag.ContinueOnError) - - for flagName, flagArgs := range addMarketGenesisFlags { - fs.String(flagName, flagArgs.defaultValue, flagArgs.usageDocString) - } - return fs, []string{FlagPair, FlagSqrtDepth, FlagPriceMultiplier} -} - -// AddMarketGenesisCmd returns add-market-genesis -func AddMarketGenesisCmd(defaultNodeHome string) *cobra.Command { - cmd := &cobra.Command{ - Use: "add-genesis-perp-market", - Short: "Add perp markets to genesis.json", - Long: `Add perp markets to genesis.json.`, - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - serverCtx := server.GetServerContextFromCmd(cmd) - config := serverCtx.Config - - config.SetRoot(clientCtx.HomeDir) - - genFile := config.GenesisFile() - appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) - if err != nil { - return err - } - - market, amm, err := newMarketFromFlags(cmd.Flags()) - if err != nil { - return err - } - - perpGenState := types.GetGenesisStateFromAppState(clientCtx.Codec, appState) - perpGenState.Markets = append(perpGenState.Markets, market) - perpGenState.Amms = append(perpGenState.Amms, amm) - - perpGenStateBz, err := clientCtx.Codec.MarshalJSON(perpGenState) - if err != nil { - return fmt.Errorf("failed to marshal market genesis state: %w", err) - } - - appState[types.ModuleName] = perpGenStateBz - - appStateJSON, err := json.Marshal(appState) - if err != nil { - return fmt.Errorf("failed to marshal application genesis state: %w", err) - } - - genDoc.AppState = appStateJSON - return genutil.ExportGenesisFile(genDoc, genFile) - }, - } - - cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") - - flagSet, requiredFlags := getCmdFlagSet() - cmd.Flags().AddFlagSet(flagSet) - for _, reqFlag := range requiredFlags { - _ = cmd.MarkFlagRequired(reqFlag) - } - - return cmd -} - -func newMarketFromFlags(flagSet *flag.FlagSet, -) (market types.Market, amm types.AMM, err error) { - flagErrors := []error{} - - pairStr, err := flagSet.GetString(FlagPair) - flagErrors = append(flagErrors, err) - - sqrtDepthStr, err := flagSet.GetString(FlagSqrtDepth) - flagErrors = append(flagErrors, err) - - priceMultiplierStr, err := flagSet.GetString(FlagPriceMultiplier) - flagErrors = append(flagErrors, err) - - mmrAsString, err := flagSet.GetString(FlagMaintenenceMarginRatio) - flagErrors = append(flagErrors, err) - - maxLeverageStr, err := flagSet.GetString(FlagMaxLeverage) - flagErrors = append(flagErrors, err) - - maxFundingRateStr, err := flagSet.GetString(FlagMaxFundingrate) - flagErrors = append(flagErrors, err) - - for _, err := range flagErrors { // for brevity's sake - if err != nil { - return types.Market{}, types.AMM{}, err - } - } - - pair, err := asset.TryNewPair(pairStr) - if err != nil { - return - } - - sqrtDepth, err := sdk.NewDecFromStr(sqrtDepthStr) - if err != nil { - return - } - - maintenanceMarginRatio, err := sdk.NewDecFromStr(mmrAsString) - if err != nil { - return - } - - maxLeverage, err := sdk.NewDecFromStr(maxLeverageStr) - if err != nil { - return types.Market{}, types.AMM{}, err - } - - maxFundingRate, err := sdk.NewDecFromStr(maxFundingRateStr) - if err != nil { - return types.Market{}, types.AMM{}, err - } - - fmt.Println(maxFundingRate) - - priceMultiplier, err := sdk.NewDecFromStr(priceMultiplierStr) - if err != nil { - return types.Market{}, types.AMM{}, err - } - - market = types.Market{ - Pair: pair, - Enabled: true, - MaintenanceMarginRatio: maintenanceMarginRatio, - MaxLeverage: maxLeverage, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: maxFundingRate, - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewInt64Coin(pair.QuoteDenom(), 0), - } - if err := market.Validate(); err != nil { - return types.Market{}, types.AMM{}, err - } - - amm = types.AMM{ - Pair: pair, - BaseReserve: sqrtDepth, - QuoteReserve: sqrtDepth, - SqrtDepth: sqrtDepth, - PriceMultiplier: priceMultiplier, - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - } - if err := amm.Validate(); err != nil { - return types.Market{}, types.AMM{}, err - } - - return market, amm, nil -} diff --git a/x/perp/v2/client/cli/gen_market_test.go b/x/perp/v2/client/cli/gen_market_test.go deleted file mode 100644 index eb513f490..000000000 --- a/x/perp/v2/client/cli/gen_market_test.go +++ /dev/null @@ -1,130 +0,0 @@ -package cli_test - -import ( - "fmt" - "testing" - - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/perp/v2/client/cli" -) - -// Tests "add-genesis-perp-market", a command that adds a market to genesis.json -func TestAddMarketGenesisCmd(t *testing.T) { - tests := []struct { - name string - pairName string - sqrtDepth string - priceMultiplier string - maintainRatio string - maxLeverage string - maxFundingRate string - expectError bool - }{ - { - name: "pair name empty", - pairName: "", - sqrtDepth: "1", - priceMultiplier: "1", - maintainRatio: "1", - maxLeverage: "1", - maxFundingRate: "1", - expectError: true, - }, - { - name: "invalid pair name", - pairName: "token0:token1:token2", - sqrtDepth: "1", - priceMultiplier: "1", - maintainRatio: "1", - maxLeverage: "1", - maxFundingRate: "1", - expectError: true, - }, - { - name: "empty sqrt depth input", - pairName: "token0:token1", - sqrtDepth: "", - priceMultiplier: "1", - maintainRatio: "1", - maxLeverage: "1", - maxFundingRate: "1", - expectError: true, - }, - { - name: "max leverage cannot be zero", - pairName: "token0:token1", - sqrtDepth: "100", - priceMultiplier: "1", - maintainRatio: "0.1", - maxLeverage: "0", - maxFundingRate: "0", - expectError: true, - }, - { - name: "price multiplier cannot be zero", - pairName: "token0:token1", - sqrtDepth: "100", - priceMultiplier: "0", - maintainRatio: "0.1", - maxLeverage: "1", - maxFundingRate: "1", - expectError: true, - }, - { - name: "price multiplier cannot be negative", - pairName: "token0:token1", - sqrtDepth: "100", - priceMultiplier: "-1", - maintainRatio: "0.1", - maxLeverage: "1", - maxFundingRate: "1", - expectError: true, - }, - { - name: "negative max funding rate", - pairName: "token0:token1", - sqrtDepth: "100", - priceMultiplier: "1", - maintainRatio: "0.1", - maxLeverage: "10", - maxFundingRate: "-1", - expectError: true, - }, - { - name: "valid market pair", - pairName: "token0:token1", - sqrtDepth: "100", - priceMultiplier: "1", - maintainRatio: "0.1", - maxLeverage: "10", - maxFundingRate: "10", - expectError: false, - }, - } - - ctx := testutil.SetupClientCtx(t) - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - cmd := cli.AddMarketGenesisCmd("home") - cmd.SetArgs([]string{ - fmt.Sprintf("--%s=%s", cli.FlagPair, tc.pairName), - fmt.Sprintf("--%s=%s", cli.FlagSqrtDepth, tc.sqrtDepth), - fmt.Sprintf("--%s=%s", cli.FlagPriceMultiplier, tc.priceMultiplier), - fmt.Sprintf("--%s=%s", cli.FlagMaintenenceMarginRatio, tc.maintainRatio), - fmt.Sprintf("--%s=%s", cli.FlagMaxLeverage, tc.maxLeverage), - fmt.Sprintf("--%s=%s", cli.FlagMaxFundingrate, tc.maxFundingRate), - fmt.Sprintf("--%s=home", flags.FlagHome), - }) - - if tc.expectError { - require.Error(t, cmd.ExecuteContext(ctx)) - } else { - require.NoError(t, cmd.ExecuteContext(ctx)) - } - }) - } -} diff --git a/x/perp/v2/client/cli/query.go b/x/perp/v2/client/cli/query.go deleted file mode 100644 index 12967a4a0..000000000 --- a/x/perp/v2/client/cli/query.go +++ /dev/null @@ -1,186 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -const FlagVersioned = "versioned" - -// GetQueryCmd returns the cli query commands for this module -func GetQueryCmd() *cobra.Command { - // Group stablecoin queries under a subcommand - moduleQueryCmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf( - "Querying commands for the %s module", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmds := []*cobra.Command{ - CmdQueryPosition(), - CmdQueryPositions(), - CmdQueryModuleAccounts(), - CmdQueryMarkets(), - } - for _, cmd := range cmds { - moduleQueryCmd.AddCommand(cmd) - } - - return moduleQueryCmd -} - -// sample token-pair: btc:nusd -func CmdQueryPosition() *cobra.Command { - cmd := &cobra.Command{ - Use: "position [trader] [token-pair]", - Short: "trader's position for a given token pair/perp/amm", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - trader, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return fmt.Errorf("invalid trader address: %w", err) - } - - pair, err := asset.TryNewPair(args[1]) - if err != nil { - return err - } - - res, err := queryClient.QueryPosition( - cmd.Context(), &types.QueryPositionRequest{ - Trader: trader.String(), - Pair: pair, - }, - ) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdQueryPositions() *cobra.Command { - cmd := &cobra.Command{ - Use: "positions [trader]", - Short: "return all of a trader's open positions", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - trader, err := sdk.AccAddressFromBech32(args[0]) - if err != nil { - return fmt.Errorf("invalid trader address: %w", err) - } - - res, err := queryClient.QueryPositions( - cmd.Context(), &types.QueryPositionsRequest{ - Trader: trader.String(), - }, - ) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdQueryModuleAccounts() *cobra.Command { - cmd := &cobra.Command{ - Use: "module-accounts", - Short: "shows all the module accounts in the blockchain", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.ModuleAccounts(cmd.Context(), &types.QueryModuleAccountsRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdQueryMarkets() *cobra.Command { - cmd := &cobra.Command{ - Use: "markets", - Short: "Query all market info", - Long: ` -Query all market info. By default, only active tradable markets are shown. -If --versioned is to to true, the query will return all markets including the -inactive ones.`, - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - versioned, err := cmd.Flags().GetBool(FlagVersioned) - if err != nil { - return err - } - - res, err := queryClient.QueryMarkets(cmd.Context(), &types.QueryMarketsRequest{ - Versioned: versioned, - }) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - cmd.Flags().Bool(FlagVersioned, false, "toggles whether to include inactive markets") - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/perp/v2/client/cli/tx.go b/x/perp/v2/client/cli/tx.go deleted file mode 100644 index bebd31c58..000000000 --- a/x/perp/v2/client/cli/tx.go +++ /dev/null @@ -1,354 +0,0 @@ -package cli - -import ( - "fmt" - "strings" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func GetTxCmd() *cobra.Command { - txCmd := &cobra.Command{ - Use: types.ModuleName, - Short: "Generalized automated market maker transaction subcommands", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - txCmd.AddCommand( - RemoveMarginCmd(), - AddMarginCmd(), - MarketOrderCmd(), - ClosePositionCmd(), - PartialCloseCmd(), - MultiLiquidateCmd(), - DonateToEcosystemFundCmd(), - ) - - return txCmd -} - -func MultiLiquidateCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "multi-liquidate [Pair1:Trader1] [Pair2:Trader2] ...", - Short: "liquidates multiple positions at once", - Long: strings.TrimSpace( - fmt.Sprintf(` - $ %s tx perp multi-liquidate ubtc:unusd:nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl ueth:unusd:nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl - `, version.AppName), - ), - Args: cobra.MinimumNArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - liquidations := make([]*types.MsgMultiLiquidate_Liquidation, len(args)) - - for i, arg := range args { - parts := strings.Split(arg, ":") - if len(parts) != 3 { - return fmt.Errorf("invalid liquidation format: %s", arg) - } - - pair, err := asset.TryNewPair(fmt.Sprintf("%s:%s", parts[0], parts[1])) - if err != nil { - return err - } - - traderAddr, err := sdk.AccAddressFromBech32(parts[2]) - if err != nil { - return err - } - - liquidations[i] = &types.MsgMultiLiquidate_Liquidation{ - Pair: pair, - Trader: traderAddr.String(), - } - } - - msg := &types.MsgMultiLiquidate{ - Sender: clientCtx.GetFromAddress().String(), - Liquidations: liquidations, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -func MarketOrderCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "open-position [buy/sell] [pair] [leverage] [quoteAmt / sdk.Dec] [baseAmtLimit / sdk.Dec]", - Short: "Opens a position", - Args: cobra.ExactArgs(5), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - var side types.Direction - switch args[0] { - case "buy": - side = types.Direction_LONG - case "sell": - side = types.Direction_SHORT - default: - return fmt.Errorf("invalid side: %s", args[0]) - } - - assetPair, err := asset.TryNewPair(args[1]) - if err != nil { - return err - } - - leverage := sdk.MustNewDecFromStr(args[2]) - - amount, ok := sdk.NewIntFromString(args[3]) - if !ok { - return fmt.Errorf("invalid quote amount: %s", args[3]) - } - - baseAmtLimit := sdk.MustNewDecFromStr(args[4]) - - msg := &types.MsgMarketOrder{ - Sender: clientCtx.GetFromAddress().String(), - Pair: assetPair, - Side: side, - QuoteAssetAmount: amount, - Leverage: leverage, - BaseAssetAmountLimit: baseAmtLimit.RoundInt(), - } - - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -func ClosePositionCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "close-position [pair]", - Short: "Closes a position", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - pair, err := asset.TryNewPair(args[0]) - if err != nil { - return err - } - - msg := &types.MsgClosePosition{ - Sender: clientCtx.GetFromAddress().String(), - Pair: pair, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -func PartialCloseCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "partial-close [pair] [size]", - Short: "Partially closes a position", - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - pair, err := asset.TryNewPair(args[0]) - if err != nil { - return err - } - - size, err := sdk.NewDecFromStr(args[1]) - if err != nil { - return err - } - - msg := &types.MsgPartialClose{ - Sender: clientCtx.GetFromAddress().String(), - Pair: pair, - Size_: size, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -/* -RemoveMarginCmd is a CLI command that removes margin from a position, -realizing any outstanding funding payments and decreasing the margin ratio. -*/ -func RemoveMarginCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "remove-margin [market] [margin]", - Short: "Removes margin from a position, decreasing its margin ratio", - Long: strings.TrimSpace( - fmt.Sprintf(` - $ %s tx perp remove-margin osmo:nusd 100nusd - `, version.AppName), - ), - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - marginToRemove, err := sdk.ParseCoinNormalized(args[1]) - if err != nil { - return err - } - - pair, err := asset.TryNewPair(args[0]) - if err != nil { - return err - } - - msg := &types.MsgRemoveMargin{ - Sender: clientCtx.GetFromAddress().String(), - Pair: pair, - Margin: marginToRemove, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -func AddMarginCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "add-margin [market] [margin]", - Short: "Adds margin to a position, increasing its margin ratio", - Long: strings.TrimSpace( - fmt.Sprintf(` - $ %s tx perp add-margin osmo:nusd 100nusd - `, version.AppName), - ), - Args: cobra.ExactArgs(2), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - marginToAdd, err := sdk.ParseCoinNormalized(args[1]) - if err != nil { - return err - } - - pair, err := asset.TryNewPair(args[0]) - if err != nil { - return err - } - - msg := &types.MsgAddMargin{ - Sender: clientCtx.GetFromAddress().String(), - Pair: pair, - Margin: marginToAdd, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - -func DonateToEcosystemFundCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "donate-ef [amount]", - Short: "Donates of coins to the Ecosystem Fund.", - Long: strings.TrimSpace( - fmt.Sprintf(` - $ %s tx perp donate-ef 100unusd - `, version.AppName), - ), - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - donation, err := sdk.ParseCoinNormalized(args[0]) - if err != nil { - return err - } - - msg := &types.MsgDonateToEcosystemFund{ - Sender: clientCtx.GetFromAddress().String(), - Donation: donation, - } - if err = msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} diff --git a/x/perp/v2/integration/action/dnr.go b/x/perp/v2/integration/action/dnr.go deleted file mode 100644 index eb2c38035..000000000 --- a/x/perp/v2/integration/action/dnr.go +++ /dev/null @@ -1,209 +0,0 @@ -package action - -import ( - "fmt" - - "cosmossdk.io/math" - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func DnREpochIs(epoch uint64) action.Action { - return &setEpochAction{ - Epoch: epoch, - } -} - -type setEpochAction struct { - Epoch uint64 -} - -func (s setEpochAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - app.PerpKeeperV2.DnREpoch.Set(ctx, s.Epoch) - return ctx, nil, true -} - -func DnRCurrentVolumeIs(user sdk.AccAddress, wantVolume math.Int) action.Action { - return &expectVolumeAction{ - User: user, - Volume: wantVolume, - } -} - -type expectVolumeAction struct { - User sdk.AccAddress - Volume math.Int -} - -func (e expectVolumeAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - currentEpoch, err := app.PerpKeeperV2.DnREpoch.Get(ctx) - if err != nil { - return ctx, err, true - } - volume, err := app.PerpKeeperV2.TraderVolumes.Get(ctx, collections.Join(e.User, currentEpoch)) - if err != nil { - return ctx, err, true - } - if !volume.Equal(e.Volume) { - return ctx, fmt.Errorf("unexpected user dnr volume, wanted %s, got %s", e.Volume, volume), true - } - return ctx, nil, true -} - -func DnRPreviousVolumeIs(user sdk.AccAddress, wantVolume math.Int) action.Action { - return &expectPreviousVolumeAction{ - User: user, - Volume: wantVolume, - } -} - -type expectPreviousVolumeAction struct { - User sdk.AccAddress - Volume math.Int -} - -func (e expectPreviousVolumeAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - currentEpoch, err := app.PerpKeeperV2.DnREpoch.Get(ctx) - if err != nil { - return ctx, err, true - } - - v := app.PerpKeeperV2.GetTraderVolumeLastEpoch(ctx, currentEpoch, e.User) - if !v.Equal(e.Volume) { - return ctx, fmt.Errorf("unexpected user dnr volume, wanted %s, got %s", e.Volume, v), true - } - return ctx, nil, true -} - -func DnRVolumeNotExist(user sdk.AccAddress, epoch uint64) action.Action { - return &expectVolumeNotExistAction{ - Epoch: epoch, - User: user, - } -} - -type expectVolumeNotExistAction struct { - Epoch uint64 - User sdk.AccAddress -} - -func (e expectVolumeNotExistAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - v, err := app.PerpKeeperV2.TraderVolumes.Get(ctx, collections.Join(e.User, e.Epoch)) - if err == nil { - return ctx, fmt.Errorf("unexpected user dnr volume, got %s", v), true - } - return ctx, nil, true -} - -type marketOrderFeeIs struct { - fee sdk.Dec - *openPositionAction -} - -func MarketOrderFeeIs( - fee sdk.Dec, - trader sdk.AccAddress, - pair asset.Pair, - dir types.Direction, - margin math.Int, - leverage sdk.Dec, - baseAssetLimit sdk.Dec, - responseCheckers ...MarketOrderResponseChecker, -) action.Action { - o := openPositionAction{ - trader: trader, - pair: pair, - dir: dir, - margin: margin, - leverage: leverage, - baseAssetLimit: baseAssetLimit, - responseCheckers: responseCheckers, - } - return &marketOrderFeeIs{ - fee: fee, - openPositionAction: &o, - } -} - -func (o *marketOrderFeeIs) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - balanceBefore := app.BankKeeper.GetBalance(ctx, o.trader, o.pair.QuoteDenom()).Amount - resp, err := app.PerpKeeperV2.MarketOrder( - ctx, o.pair, o.dir, o.trader, - o.margin, o.leverage, o.baseAssetLimit, - ) - if err != nil { - return ctx, err, true - } - - balanceBefore = balanceBefore.Sub(resp.MarginToVault.TruncateInt()) - - expectedFee := math.LegacyNewDecFromInt(o.margin).Mul(o.fee.Add(sdk.MustNewDecFromStr("0.001"))) // we add the ecosystem fund fee - balanceAfter := app.BankKeeper.GetBalance(ctx, o.trader, o.pair.QuoteDenom()).Amount - paidFees := balanceBefore.Sub(balanceAfter) - if !paidFees.Equal(expectedFee.TruncateInt()) { - return ctx, fmt.Errorf("unexpected fee, wanted %s, got %s", expectedFee, paidFees), true - } - return ctx, nil, true -} - -func SetPreviousEpochUserVolume(user sdk.AccAddress, volume math.Int) action.Action { - return &setPreviousEpochUserVolumeAction{ - user: user, - volume: volume, - } -} - -type setPreviousEpochUserVolumeAction struct { - user sdk.AccAddress - volume math.Int -} - -func (s setPreviousEpochUserVolumeAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - currentEpoch, err := app.PerpKeeperV2.DnREpoch.Get(ctx) - if err != nil { - return ctx, err, true - } - app.PerpKeeperV2.TraderVolumes.Insert(ctx, collections.Join(s.user, currentEpoch-1), s.volume) - return ctx, nil, true -} - -func SetGlobalDiscount(fee sdk.Dec, volume math.Int) action.Action { - return &setGlobalDiscountAction{ - fee: fee, - volume: volume, - } -} - -type setGlobalDiscountAction struct { - fee sdk.Dec - volume math.Int -} - -func (s setGlobalDiscountAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - app.PerpKeeperV2.GlobalDiscounts.Insert(ctx, s.volume, s.fee) - return ctx, nil, true -} - -func SetCustomDiscount(user sdk.AccAddress, fee sdk.Dec, volume math.Int) action.Action { - return &setCustomDiscountAction{ - fee: fee, - volume: volume, - user: user, - } -} - -type setCustomDiscountAction struct { - fee sdk.Dec - volume math.Int - user sdk.AccAddress -} - -func (s *setCustomDiscountAction) Do(app *app.NibiruApp, ctx sdk.Context) (outCtx sdk.Context, err error, isMandatory bool) { - app.PerpKeeperV2.TraderDiscounts.Insert(ctx, collections.Join(s.user, s.volume), s.fee) - return ctx, nil, true -} diff --git a/x/perp/v2/integration/action/liquidation.go b/x/perp/v2/integration/action/liquidation.go deleted file mode 100644 index 1c7f397f0..000000000 --- a/x/perp/v2/integration/action/liquidation.go +++ /dev/null @@ -1,73 +0,0 @@ -package action - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type PairTraderTuple struct { - Pair asset.Pair - Trader sdk.AccAddress - Successful bool -} - -type multiLiquidate struct { - pairTraderTuples []PairTraderTuple - liquidator sdk.AccAddress - shouldAllFail bool -} - -func (m multiLiquidate) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - liquidationRequests := make([]*types.MsgMultiLiquidate_Liquidation, len(m.pairTraderTuples)) - - for i, pairTraderTuple := range m.pairTraderTuples { - liquidationRequests[i] = &types.MsgMultiLiquidate_Liquidation{ - Pair: pairTraderTuple.Pair, - Trader: pairTraderTuple.Trader.String(), - } - } - - responses, err := app.PerpKeeperV2.MultiLiquidate(ctx, m.liquidator, liquidationRequests) - - if m.shouldAllFail { - // we check if all liquidations failed - if err == nil { - return ctx, fmt.Errorf("multi liquidations should have all failed, but instead some succeeded"), true - } - - for i, response := range responses { - if response.Success { - return ctx, fmt.Errorf("multi liquidations should have all failed, but instead some succeeded, index %d", i), true - } - } - - return ctx, nil, true - } - - // otherwise, some succeeded and some may have failed - if err != nil { - return ctx, err, true - } - - for i, response := range responses { - if response.Success != m.pairTraderTuples[i].Successful { - return ctx, fmt.Errorf("MultiLiquidate wrong assertion, expected %v, got %v, index %d", m.pairTraderTuples[i].Successful, response.Success, i), false - } - } - - return ctx, nil, true -} - -func MultiLiquidate(liquidator sdk.AccAddress, shouldAllFail bool, pairTraderTuples ...PairTraderTuple) action.Action { - return multiLiquidate{ - pairTraderTuples: pairTraderTuples, - liquidator: liquidator, - shouldAllFail: shouldAllFail, - } -} diff --git a/x/perp/v2/integration/action/margin.go b/x/perp/v2/integration/action/margin.go deleted file mode 100644 index 83f09828e..000000000 --- a/x/perp/v2/integration/action/margin.go +++ /dev/null @@ -1,137 +0,0 @@ -package action - -import ( - "errors" - "fmt" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -// AddMargin adds margin to the position -func AddMargin( - account sdk.AccAddress, - pair asset.Pair, - margin sdkmath.Int, -) action.Action { - return &addMarginAction{ - Account: account, - Pair: pair, - Margin: margin, - } -} - -type addMarginAction struct { - Account sdk.AccAddress - Pair asset.Pair - Margin sdkmath.Int -} - -func (a addMarginAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.AddMargin( - ctx, a.Pair, a.Account, sdk.NewCoin(a.Pair.QuoteDenom(), a.Margin), - ) - if err != nil { - return ctx, err, true - } - - return ctx, nil, true -} - -// AddMarginFail adds margin to the position expecting a fail -func AddMarginFail( - account sdk.AccAddress, - pair asset.Pair, - margin sdkmath.Int, - err error, -) action.Action { - return &addMarginFailAction{ - Account: account, - Pair: pair, - Margin: margin, - ExpectedErr: err, - } -} - -type addMarginFailAction struct { - Account sdk.AccAddress - Pair asset.Pair - Margin sdkmath.Int - ExpectedErr error -} - -func (a addMarginFailAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.AddMargin( - ctx, a.Pair, a.Account, sdk.NewCoin(a.Pair.QuoteDenom(), a.Margin), - ) - if !errors.Is(err, a.ExpectedErr) { - return ctx, fmt.Errorf("expected error %v, got %v", a.ExpectedErr, err), false - } - - return ctx, nil, false -} - -func RemoveMargin( - account sdk.AccAddress, - pair asset.Pair, - margin sdkmath.Int, -) action.Action { - return &removeMarginAction{ - Account: account, - Pair: pair, - Margin: margin, - } -} - -type removeMarginAction struct { - Account sdk.AccAddress - Pair asset.Pair - Margin sdkmath.Int -} - -func (a removeMarginAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.RemoveMargin( - ctx, a.Pair, a.Account, sdk.NewCoin(a.Pair.QuoteDenom(), a.Margin), - ) - if err != nil { - return ctx, err, false - } - - return ctx, nil, false -} - -func RemoveMarginFail( - account sdk.AccAddress, - pair asset.Pair, - margin sdkmath.Int, - err error, -) action.Action { - return &removeMarginActionFail{ - Account: account, - Pair: pair, - Margin: margin, - ExpectedErr: err, - } -} - -type removeMarginActionFail struct { - Account sdk.AccAddress - Pair asset.Pair - Margin sdkmath.Int - ExpectedErr error -} - -func (a removeMarginActionFail) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.RemoveMargin( - ctx, a.Pair, a.Account, sdk.NewCoin(a.Pair.QuoteDenom(), a.Margin), - ) - if !errors.Is(err, a.ExpectedErr) { - return ctx, fmt.Errorf("expected error %v, got %v", a.ExpectedErr, err), false - } - - return ctx, nil, false -} diff --git a/x/perp/v2/integration/action/market.go b/x/perp/v2/integration/action/market.go deleted file mode 100644 index d8ac00ab2..000000000 --- a/x/perp/v2/integration/action/market.go +++ /dev/null @@ -1,192 +0,0 @@ -package action - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/collections" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type logger struct { - log string -} - -func (e logger) Do(_ *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - fmt.Println(e.log) - return ctx, nil, true -} - -func Log(log string) action.Action { - return logger{ - log: log, - } -} - -// createMarketAction creates a market -type createMarketAction struct { - Market types.Market - AMM types.AMM -} - -func (c createMarketAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - app.PerpKeeperV2.MarketLastVersion.Insert(ctx, c.Market.Pair, types.MarketLastVersion{Version: 1}) - app.PerpKeeperV2.SaveMarket(ctx, c.Market) - app.PerpKeeperV2.SaveAMM(ctx, c.AMM) - - app.PerpKeeperV2.ReserveSnapshots.Insert(ctx, collections.Join(c.AMM.Pair, ctx.BlockTime()), types.ReserveSnapshot{ - Amm: c.AMM, - TimestampMs: ctx.BlockTime().UnixMilli(), - }) - - return ctx, nil, true -} - -// CreateCustomMarket creates a market with custom parameters -func CreateCustomMarket(pair asset.Pair, marketModifiers ...MarketModifier) action.Action { - market := types.DefaultMarket(pair) - amm := types.AMM{ - Pair: pair, - Version: 1, - BaseReserve: sdk.NewDec(1e12), - QuoteReserve: sdk.NewDec(1e12), - SqrtDepth: sdk.NewDec(1e12), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - } - - for _, modifier := range marketModifiers { - modifier(&market, &amm) - } - - return createMarketAction{ - Market: market, - AMM: amm, - } -} - -type MarketModifier func(market *types.Market, amm *types.AMM) - -func WithPrepaidBadDebt(amount sdkmath.Int) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - market.PrepaidBadDebt = sdk.NewCoin(market.Pair.QuoteDenom(), amount) - } -} - -func WithPricePeg(newValue sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - amm.PriceMultiplier = newValue - } -} - -func WithTotalLong(amount sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - amm.TotalLong = amount - } -} - -func WithTotalShort(amount sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - amm.TotalShort = amount - } -} - -func WithSqrtDepth(amount sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - amm.SqrtDepth = amount - amm.BaseReserve = amount - amm.QuoteReserve = amount - } -} - -func WithLatestMarketCPF(amount sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - market.LatestCumulativePremiumFraction = amount - } -} - -func WithMaxFundingRate(amount sdk.Dec) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - market.MaxFundingRate = amount - } -} - -func WithVersion(version uint64) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - market.Version = version - amm.Version = version - } -} - -func WithEnabled(enabled bool) MarketModifier { - return func(market *types.Market, amm *types.AMM) { - market.Enabled = enabled - } -} - -type editPriceMultiplier struct { - pair asset.Pair - newValue sdk.Dec -} - -func (e editPriceMultiplier) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.PerpKeeperV2.EditPriceMultiplier(ctx, e.pair, e.newValue) - return ctx, err, true -} - -func EditPriceMultiplier(pair asset.Pair, newValue sdk.Dec) action.Action { - return editPriceMultiplier{ - pair: pair, - newValue: newValue, - } -} - -type editSwapInvariant struct { - pair asset.Pair - newValue sdk.Dec -} - -func (e editSwapInvariant) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.PerpKeeperV2.EditSwapInvariant(ctx, e.pair, e.newValue) - return ctx, err, true -} - -func EditSwapInvariant(pair asset.Pair, newValue sdk.Dec) action.Action { - return editSwapInvariant{ - pair: pair, - newValue: newValue, - } -} - -type createPool struct { - pair asset.Pair - market types.Market - amm types.AMM -} - -func (c createPool) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: c.pair, - PriceMultiplier: c.amm.PriceMultiplier, - SqrtDepth: c.amm.SqrtDepth, - Market: &c.market, - }) - return ctx, err, true -} - -func CreateMarket(pair asset.Pair, market types.Market, amm types.AMM) action.Action { - return createPool{ - pair: pair, - market: market, - amm: amm, - } -} diff --git a/x/perp/v2/integration/action/params.go b/x/perp/v2/integration/action/params.go deleted file mode 100644 index 47d27d927..000000000 --- a/x/perp/v2/integration/action/params.go +++ /dev/null @@ -1,24 +0,0 @@ -package action - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -type changeLiquidationFeeRatio struct { - LiquidationFeeRatio sdk.Dec -} - -func (c changeLiquidationFeeRatio) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - // TODO(k-yang): implement - - return ctx, nil, true -} - -func ChangeLiquidationFeeRatio(liquidationFeeRatio sdk.Dec) action.Action { - return changeLiquidationFeeRatio{ - LiquidationFeeRatio: liquidationFeeRatio, - } -} diff --git a/x/perp/v2/integration/action/position.go b/x/perp/v2/integration/action/position.go deleted file mode 100644 index a50405404..000000000 --- a/x/perp/v2/integration/action/position.go +++ /dev/null @@ -1,387 +0,0 @@ -package action - -import ( - "errors" - "fmt" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// MarketOrder opens a position with the given parameters. -// -// responseCheckers are optional functions that can be used to check expected response. -func MarketOrder( - trader sdk.AccAddress, - pair asset.Pair, - dir types.Direction, - margin sdkmath.Int, - leverage sdk.Dec, - baseAssetLimit sdk.Dec, - responseCheckers ...MarketOrderResponseChecker, -) action.Action { - return &openPositionAction{ - trader: trader, - pair: pair, - dir: dir, - margin: margin, - leverage: leverage, - baseAssetLimit: baseAssetLimit, - responseCheckers: responseCheckers, - } -} - -type openPositionAction struct { - trader sdk.AccAddress - pair asset.Pair - dir types.Direction - margin sdkmath.Int - leverage sdk.Dec - baseAssetLimit sdk.Dec - - responseCheckers []MarketOrderResponseChecker -} - -func (o openPositionAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - resp, err := app.PerpKeeperV2.MarketOrder( - ctx, o.pair, o.dir, o.trader, - o.margin, o.leverage, o.baseAssetLimit, - ) - if err != nil { - return ctx, err, true - } - - if o.responseCheckers != nil { - for _, check := range o.responseCheckers { - err = check(resp) - if err != nil { - return ctx, err, false - } - } - } - - return ctx, nil, true -} - -type openPositionFailsAction struct { - trader sdk.AccAddress - pair asset.Pair - dir types.Direction - margin sdkmath.Int - leverage sdk.Dec - baseAssetLimit sdk.Dec - expectedErr error -} - -func (o openPositionFailsAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.MarketOrder( - ctx, o.pair, o.dir, o.trader, - o.margin, o.leverage, o.baseAssetLimit, - ) - - if !errors.Is(err, o.expectedErr) { - return ctx, fmt.Errorf("expected error %s, got %s", o.expectedErr, err), true - } - - return ctx, nil, true -} - -func MarketOrderFails( - trader sdk.AccAddress, - pair asset.Pair, - dir types.Direction, - margin sdkmath.Int, - leverage sdk.Dec, - baseAssetLimit sdk.Dec, - expectedErr error, -) action.Action { - return &openPositionFailsAction{ - trader: trader, - pair: pair, - dir: dir, - margin: margin, - leverage: leverage, - baseAssetLimit: baseAssetLimit, - expectedErr: expectedErr, - } -} - -// Open Position Response Checkers -type MarketOrderResponseChecker func(resp *types.PositionResp) error - -// MarketOrderResp_PositionShouldBeEqual checks that the position included in the response is equal to the expected position response. -func MarketOrderResp_PositionShouldBeEqual(expected types.Position) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - return types.PositionsAreEqual(&expected, &actual.Position) - } -} - -// MarketOrderResp_ExchangeNotionalValueShouldBeEqual checks that the exchanged notional value included in the response is equal to the expected value. -func MarketOrderResp_ExchangeNotionalValueShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.ExchangedNotionalValue.Equal(expected) { - return fmt.Errorf("expected exchanged notional value %s, got %s", expected, actual.ExchangedNotionalValue) - } - - return nil - } -} - -// MarketOrderResp_ExchangedPositionSizeShouldBeEqual checks that the exchanged position size included in the response is equal to the expected value. -func MarketOrderResp_ExchangedPositionSizeShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.ExchangedPositionSize.Equal(expected) { - return fmt.Errorf("expected exchanged position size %s, got %s", expected, actual.ExchangedPositionSize) - } - - return nil - } -} - -// MarketOrderResp_BadDebtShouldBeEqual checks that the bad debt included in the response is equal to the expected value. -func MarketOrderResp_BadDebtShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.BadDebt.Equal(expected) { - return fmt.Errorf("expected bad debt %s, got %s", expected, actual.BadDebt) - } - - return nil - } -} - -// MarketOrderResp_FundingPaymentShouldBeEqual checks that the funding payment included in the response is equal to the expected value. -func MarketOrderResp_FundingPaymentShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.FundingPayment.Equal(expected) { - return fmt.Errorf("expected funding payment %s, got %s", expected, actual.FundingPayment) - } - - return nil - } -} - -// MarketOrderResp_RealizedPnlShouldBeEqual checks that the realized pnl included in the response is equal to the expected value. -func MarketOrderResp_RealizedPnlShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.RealizedPnl.Equal(expected) { - return fmt.Errorf("expected realized pnl %s, got %s", expected, actual.RealizedPnl) - } - - return nil - } -} - -// MarketOrderResp_UnrealizedPnlAfterShouldBeEqual checks that the unrealized pnl after included in the response is equal to the expected value. -func MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.UnrealizedPnlAfter.Equal(expected) { - return fmt.Errorf("expected unrealized pnl after %s, got %s", expected, actual.UnrealizedPnlAfter) - } - - return nil - } -} - -// MarketOrderResp_MarginToVaultShouldBeEqual checks that the margin to vault included in the response is equal to the expected value. -func MarketOrderResp_MarginToVaultShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.MarginToVault.Equal(expected) { - return fmt.Errorf("expected margin to vault %s, got %s", expected, actual.MarginToVault) - } - - return nil - } -} - -// MarketOrderResp_PositionNotionalShouldBeEqual checks that the position notional included in the response is equal to the expected value. -func MarketOrderResp_PositionNotionalShouldBeEqual(expected sdk.Dec) MarketOrderResponseChecker { - return func(actual *types.PositionResp) error { - if !actual.PositionNotional.Equal(expected) { - return fmt.Errorf("expected position notional %s, got %s", expected, actual.PositionNotional) - } - - return nil - } -} - -// Close Position - -type closePositionAction struct { - Account sdk.AccAddress - Pair asset.Pair -} - -func (c closePositionAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.ClosePosition(ctx, c.Pair, c.Account) - if err != nil { - return ctx, err, true - } - - return ctx, nil, true -} - -// ClosePosition closes a position for the given account and pair. -func ClosePosition(account sdk.AccAddress, pair asset.Pair) action.Action { - return &closePositionAction{ - Account: account, - Pair: pair, - } -} - -type closePositionFailsAction struct { - Account sdk.AccAddress - Pair asset.Pair - - expectedErr error -} - -func (c closePositionFailsAction) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.ClosePosition(ctx, c.Pair, c.Account) - - if !errors.Is(err, c.expectedErr) { - return ctx, fmt.Errorf("expected error %s, got %s", c.expectedErr, err), true - } - - return ctx, nil, true -} - -func ClosePositionFails(account sdk.AccAddress, pair asset.Pair, expectedErr error) action.Action { - return &closePositionFailsAction{ - Account: account, - Pair: pair, - expectedErr: expectedErr, - } -} - -// Manually insert position, skipping open position logic -type insertPosition struct { - position types.Position -} - -func (i insertPosition) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - traderAddr := sdk.MustAccAddressFromBech32(i.position.TraderAddress) - app.PerpKeeperV2.SavePosition(ctx, i.position.Pair, 1, traderAddr, i.position) - return ctx, nil, true -} - -func InsertPosition(modifiers ...positionModifier) action.Action { - position := types.Position{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.USDC), - TraderAddress: testutil.AccAddress().String(), - Size_: sdk.ZeroDec(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - } - - for _, modifier := range modifiers { - modifier(&position) - } - - return insertPosition{ - position: position, - } -} - -type positionModifier func(position *types.Position) - -func WithPair(pair asset.Pair) positionModifier { - return func(position *types.Position) { - position.Pair = pair - } -} - -func WithTrader(addr sdk.AccAddress) positionModifier { - return func(position *types.Position) { - position.TraderAddress = addr.String() - } -} - -func WithMargin(margin sdk.Dec) positionModifier { - return func(position *types.Position) { - position.Margin = margin - } -} - -func WithOpenNotional(openNotional sdk.Dec) positionModifier { - return func(position *types.Position) { - position.OpenNotional = openNotional - } -} - -func WithSize(size sdk.Dec) positionModifier { - return func(position *types.Position) { - position.Size_ = size - } -} - -func WithLatestCumulativePremiumFraction(latestCumulativePremiumFraction sdk.Dec) positionModifier { - return func(position *types.Position) { - position.LatestCumulativePremiumFraction = latestCumulativePremiumFraction - } -} - -func WithLastUpdatedBlockNumber(lastUpdatedBlockNumber int64) positionModifier { - return func(position *types.Position) { - position.LastUpdatedBlockNumber = lastUpdatedBlockNumber - } -} - -type partialClose struct { - trader sdk.AccAddress - pair asset.Pair - amount sdk.Dec -} - -func (p partialClose) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.PartialClose(ctx, p.pair, p.trader, p.amount) - if err != nil { - return ctx, err, true - } - - return ctx, nil, true -} - -func PartialClose(trader sdk.AccAddress, pair asset.Pair, amount sdk.Dec) action.Action { - return partialClose{ - trader: trader, - pair: pair, - amount: amount, - } -} - -type partialCloseFails struct { - trader sdk.AccAddress - pair asset.Pair - amount sdk.Dec - - expectedErr error -} - -func (p partialCloseFails) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.PartialClose(ctx, p.pair, p.trader, p.amount) - - if !errors.Is(err, p.expectedErr) { - return ctx, fmt.Errorf("expected error %s, got %s", p.expectedErr, err), false - } - - return ctx, nil, false -} - -func PartialCloseFails(trader sdk.AccAddress, pair asset.Pair, amount sdk.Dec, expecedErr error) action.Action { - return partialCloseFails{ - trader: trader, - pair: pair, - amount: amount, - expectedErr: expecedErr, - } -} diff --git a/x/perp/v2/integration/action/query.go b/x/perp/v2/integration/action/query.go deleted file mode 100644 index 604dcbc39..000000000 --- a/x/perp/v2/integration/action/query.go +++ /dev/null @@ -1,308 +0,0 @@ -package action - -import ( - "errors" - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkquery "github.com/cosmos/cosmos-sdk/types/query" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type queryPosition struct { - pair asset.Pair - traderAddress sdk.AccAddress - responseCheckers []QueryPositionChecker -} - -func (q queryPosition) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - resp, err := queryServer.QueryPosition(sdk.WrapSDKContext(ctx), &types.QueryPositionRequest{ - Pair: q.pair, - Trader: q.traderAddress.String(), - }) - if err != nil { - return ctx, err, false - } - - for _, checker := range q.responseCheckers { - if err := checker(*resp); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -func QueryPosition(pair asset.Pair, traderAddress sdk.AccAddress, responseCheckers ...QueryPositionChecker) action.Action { - return queryPosition{ - pair: pair, - traderAddress: traderAddress, - responseCheckers: responseCheckers, - } -} - -type QueryPositionChecker func(resp types.QueryPositionResponse) error - -func QueryPosition_PositionEquals(expected types.Position) QueryPositionChecker { - return func(resp types.QueryPositionResponse) error { - return types.PositionsAreEqual(&expected, &resp.Position) - } -} - -func QueryPosition_PositionNotionalEquals(expected sdk.Dec) QueryPositionChecker { - return func(resp types.QueryPositionResponse) error { - if !expected.Equal(resp.PositionNotional) { - return fmt.Errorf("expected position notional %s, got %s", expected, resp.PositionNotional) - } - return nil - } -} - -func QueryPosition_UnrealizedPnlEquals(expected sdk.Dec) QueryPositionChecker { - return func(resp types.QueryPositionResponse) error { - if !expected.Equal(resp.UnrealizedPnl) { - return fmt.Errorf("expected unrealized pnl %s, got %s", expected, resp.UnrealizedPnl) - } - return nil - } -} - -func QueryPosition_MarginRatioEquals(expected sdk.Dec) QueryPositionChecker { - return func(resp types.QueryPositionResponse) error { - if !expected.Equal(resp.MarginRatio) { - return fmt.Errorf("expected margin ratio %s, got %s", expected, resp.MarginRatio) - } - return nil - } -} - -type queryAllPositions struct { - traderAddress sdk.AccAddress - allResponseCheckers [][]QueryPositionChecker -} - -func (q queryAllPositions) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - resp, err := queryServer.QueryPositions(sdk.WrapSDKContext(ctx), &types.QueryPositionsRequest{ - Trader: q.traderAddress.String(), - }) - if err != nil { - return ctx, err, false - } - - for i, positionCheckers := range q.allResponseCheckers { - for _, checker := range positionCheckers { - if err := checker(resp.Positions[i]); err != nil { - return ctx, err, false - } - } - } - - return ctx, nil, false -} - -func QueryPositions(traderAddress sdk.AccAddress, responseCheckers ...[]QueryPositionChecker) action.Action { - return queryAllPositions{ - traderAddress: traderAddress, - allResponseCheckers: responseCheckers, - } -} - -type queryPositionNotFound struct { - pair asset.Pair - traderAddress sdk.AccAddress -} - -func (q queryPositionNotFound) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - _, err := queryServer.QueryPosition(sdk.WrapSDKContext(ctx), &types.QueryPositionRequest{ - Pair: q.pair, - Trader: q.traderAddress.String(), - }) - if !errors.Is(err, types.ErrPositionNotFound) { - return ctx, fmt.Errorf( - "expected position not found, but found a position for pair %s, trader %s", - q.pair, - q.traderAddress, - ), false - } - - return ctx, nil, false -} - -func QueryPositionNotFound(pair asset.Pair, traderAddress sdk.AccAddress) action.Action { - return queryPositionNotFound{ - pair: pair, - traderAddress: traderAddress, - } -} - -type queryMarkets struct { - versioned bool - allResponseCheckers []QueryMarketsChecker -} - -func (q queryMarkets) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - resp, err := queryServer.QueryMarkets(sdk.WrapSDKContext(ctx), &types.QueryMarketsRequest{ - Versioned: q.versioned, - }) - if err != nil { - return ctx, err, false - } - - for _, marketsCheckers := range q.allResponseCheckers { - if err := marketsCheckers(resp.AmmMarkets); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -// QueryMarkets queries all markets, versioned contains active and inactive markets -func QueryMarkets(versioned bool, responseCheckers ...QueryMarketsChecker) action.Action { - return queryMarkets{ - versioned: versioned, - allResponseCheckers: responseCheckers, - } -} - -type QueryMarketsChecker func(resp []types.AmmMarket) error - -func QueryMarkets_MarketsShouldContain(expectedMarket types.Market) QueryMarketsChecker { - return func(resp []types.AmmMarket) error { - for _, market := range resp { - if types.MarketsAreEqual(expectedMarket, market.Market) == nil { - return nil - } - } - marketsStr := make([]string, len(resp)) - for i, market := range resp { - marketsStr[i] = market.Market.String() - } - return fmt.Errorf("expected markets to contain %s but found %s", expectedMarket.String(), marketsStr) - } -} - -func QueryMarkets_ShouldLength(length int) QueryMarketsChecker { - return func(resp []types.AmmMarket) error { - if len(resp) != length { - return fmt.Errorf("expected markets to have length %d, got %d", length, len(resp)) - } - - return nil - } -} - -type queryModuleAccounts struct { - allResponseCheckers []QueryModuleAccountsChecker -} - -func (q queryModuleAccounts) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - resp, err := queryServer.ModuleAccounts(sdk.WrapSDKContext(ctx), &types.QueryModuleAccountsRequest{}) - if err != nil { - return ctx, err, false - } - - for _, accountsCheckers := range q.allResponseCheckers { - if err := accountsCheckers(resp.Accounts); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -func QueryModuleAccounts(responseCheckers ...QueryModuleAccountsChecker) action.Action { - return queryModuleAccounts{allResponseCheckers: responseCheckers} -} - -type QueryModuleAccountsChecker func(resp []types.AccountWithBalance) error - -func QueryModuleAccounts_ModulesBalanceShouldBe(expectedBalance map[string]sdk.Coins) QueryModuleAccountsChecker { - return func(resp []types.AccountWithBalance) error { - for name, balance := range expectedBalance { - found := false - for _, account := range resp { - if account.Name == name { - found = true - if !account.Balance.IsEqual(balance) { - return fmt.Errorf("expected module %s to have balance %s, got %s", name, balance, account.Balance) - } - } - } - if !found { - return fmt.Errorf("expected module %s to have balance %s but not found", name, balance) - } - } - return nil - } -} - -// --------------------------------------------------------- -// QueryPositionStore -// --------------------------------------------------------- - -func QueryPositionStore( - pageReq *sdkquery.PageRequest, wantErr bool, checks ...QueryPositionStoreChecks, -) action.Action { - return queryPositionStore{ - pageReq: pageReq, - wantErr: wantErr, - checks: checks, - } -} - -func (q queryPositionStore) Do( - app *app.NibiruApp, ctx sdk.Context, -) (newCtx sdk.Context, err error, isMandatory bool) { - queryServer := keeper.NewQuerier(app.PerpKeeperV2) - - gotResp, err := queryServer.QueryPositionStore( - sdk.WrapSDKContext(ctx), - &types.QueryPositionStoreRequest{Pagination: q.pageReq}, - ) - if q.wantErr && err != nil { - return action.ActionResp(ctx, nil) // pass - } else if !q.wantErr && err != nil { - return action.ActionResp(ctx, err) // fail - } - - for _, checker := range q.checks { - if err := checker(*gotResp); err != nil { - return action.ActionResp(ctx, err) - } - } - return action.ActionResp(ctx, nil) -} - -type queryPositionStore struct { - pageReq *sdkquery.PageRequest - wantErr bool - checks []QueryPositionStoreChecks -} - -type QueryPositionStoreChecks func(resp types.QueryPositionStoreResponse) error - -func CheckPositionStore_NumPositions(num int) QueryPositionStoreChecks { - return func(got types.QueryPositionStoreResponse) error { - gotNumPos := len(got.Positions) - if num != gotNumPos { - return fmt.Errorf("expected num positions: %v, got: %v", num, gotNumPos) - } - return nil - } -} diff --git a/x/perp/v2/integration/action/settlement.go b/x/perp/v2/integration/action/settlement.go deleted file mode 100644 index a7b4abadc..000000000 --- a/x/perp/v2/integration/action/settlement.go +++ /dev/null @@ -1,26 +0,0 @@ -package action - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -type closeMarket struct { - pair asset.Pair -} - -func (c closeMarket) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.PerpKeeperV2.CloseMarket(ctx, c.pair) - if err != nil { - return ctx, err, false - } - - return ctx, nil, true -} - -func CloseMarket(pair asset.Pair) action.Action { - return closeMarket{pair: pair} -} diff --git a/x/perp/v2/integration/action/snapshot.go b/x/perp/v2/integration/action/snapshot.go deleted file mode 100644 index 8d51a7954..000000000 --- a/x/perp/v2/integration/action/snapshot.go +++ /dev/null @@ -1,60 +0,0 @@ -package action - -import ( - "time" - - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type insertReserveSnapshot struct { - pair asset.Pair - time time.Time - - modifiers []reserveSnapshotModifier -} - -func (i insertReserveSnapshot) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - amm := app.PerpKeeperV2.AMMs.GetOr(ctx, collections.Join(i.pair, uint64(1)), types.AMM{ - Pair: i.pair, - Version: uint64(1), - BaseReserve: sdk.ZeroDec(), - QuoteReserve: sdk.ZeroDec(), - SqrtDepth: sdk.ZeroDec(), - PriceMultiplier: sdk.ZeroDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }) - - for _, modifier := range i.modifiers { - modifier(&amm) - } - - app.PerpKeeperV2.ReserveSnapshots.Insert(ctx, collections.Join(i.pair, i.time), types.ReserveSnapshot{ - TimestampMs: i.time.UnixMilli(), - Amm: amm, - }) - - return ctx, nil, true -} - -func InsertReserveSnapshot(pair asset.Pair, time time.Time, modifiers ...reserveSnapshotModifier) action.Action { - return insertReserveSnapshot{ - pair: pair, - time: time, - modifiers: modifiers, - } -} - -type reserveSnapshotModifier func(amm *types.AMM) - -func WithPriceMultiplier(multiplier sdk.Dec) reserveSnapshotModifier { - return func(amm *types.AMM) { - amm.PriceMultiplier = multiplier - } -} diff --git a/x/perp/v2/integration/action/tx.go b/x/perp/v2/integration/action/tx.go deleted file mode 100644 index 389ed17e1..000000000 --- a/x/perp/v2/integration/action/tx.go +++ /dev/null @@ -1,235 +0,0 @@ -package action - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type msgServerMarketOrder struct { - pair asset.Pair - traderAddress sdk.AccAddress - dir types.Direction - quoteAssetAmt sdkmath.Int - leverage sdk.Dec - baseAssetAmtLimit sdkmath.Int -} - -func (m msgServerMarketOrder) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - // don't need to check response because it's already checked in clearing_house tests - _, err := msgServer.MarketOrder(sdk.WrapSDKContext(ctx), &types.MsgMarketOrder{ - Pair: m.pair, - Sender: m.traderAddress.String(), - Side: m.dir, - QuoteAssetAmount: m.quoteAssetAmt, - Leverage: m.leverage, - BaseAssetAmountLimit: m.baseAssetAmtLimit, - }) - - return ctx, err, true -} - -func MsgServerMarketOrder( - traderAddress sdk.AccAddress, - pair asset.Pair, - dir types.Direction, - quoteAssetAmt sdkmath.Int, - leverage sdk.Dec, - baseAssetAmtLimit sdkmath.Int, -) action.Action { - return msgServerMarketOrder{ - pair: pair, - traderAddress: traderAddress, - dir: dir, - quoteAssetAmt: quoteAssetAmt, - leverage: leverage, - baseAssetAmtLimit: baseAssetAmtLimit, - } -} - -type msgServerClosePosition struct { - pair asset.Pair - traderAddress sdk.AccAddress -} - -func (m msgServerClosePosition) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - // don't need to check response because it's already checked in clearing_house tests - _, err := msgServer.ClosePosition(sdk.WrapSDKContext(ctx), &types.MsgClosePosition{ - Pair: m.pair, - Sender: m.traderAddress.String(), - }) - - return ctx, err, true -} - -func MsgServerClosePosition( - traderAddress sdk.AccAddress, - pair asset.Pair, -) action.Action { - return msgServerClosePosition{ - pair: pair, - traderAddress: traderAddress, - } -} - -type msgServerPartialClose struct { - pair asset.Pair - traderAddress sdk.AccAddress - size sdk.Dec -} - -func (m msgServerPartialClose) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - // don't need to check response because it's already checked in clearing_house tests - _, err := msgServer.PartialClose(sdk.WrapSDKContext(ctx), &types.MsgPartialClose{ - Pair: m.pair, - Sender: m.traderAddress.String(), - Size_: m.size, - }) - - return ctx, err, true -} - -func MsgServerPartialClosePosition( - traderAddress sdk.AccAddress, - pair asset.Pair, - size sdk.Dec, -) action.Action { - return msgServerPartialClose{ - pair: pair, - traderAddress: traderAddress, - size: size, - } -} - -type msgServerAddmargin struct { - pair asset.Pair - traderAddress sdk.AccAddress - amount sdkmath.Int -} - -func (m msgServerAddmargin) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - // don't need to check response because it's already checked in clearing_house tests - _, err := msgServer.AddMargin(sdk.WrapSDKContext(ctx), &types.MsgAddMargin{ - Pair: m.pair, - Sender: m.traderAddress.String(), - Margin: sdk.NewCoin(m.pair.QuoteDenom(), m.amount), - }) - - return ctx, err, true -} - -func MsgServerAddMargin( - traderAddress sdk.AccAddress, - pair asset.Pair, - amount sdkmath.Int, -) action.Action { - return msgServerAddmargin{ - pair: pair, - traderAddress: traderAddress, - amount: amount, - } -} - -type msgServerRemoveMargin struct { - pair asset.Pair - traderAddress sdk.AccAddress - amount sdkmath.Int -} - -func (m msgServerRemoveMargin) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - // don't need to check response because it's already checked in clearing_house tests - _, err := msgServer.RemoveMargin(sdk.WrapSDKContext(ctx), &types.MsgRemoveMargin{ - Pair: m.pair, - Sender: m.traderAddress.String(), - Margin: sdk.NewCoin(m.pair.QuoteDenom(), m.amount), - }) - - return ctx, err, true -} - -func MsgServerRemoveMargin( - traderAddress sdk.AccAddress, - pair asset.Pair, - amount sdkmath.Int, -) action.Action { - return msgServerRemoveMargin{ - pair: pair, - traderAddress: traderAddress, - amount: amount, - } -} - -type msgServerDonateToPerpEf struct { - sender sdk.AccAddress - amount sdkmath.Int -} - -func (m msgServerDonateToPerpEf) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - _, err := msgServer.DonateToEcosystemFund(sdk.WrapSDKContext(ctx), &types.MsgDonateToEcosystemFund{ - Sender: m.sender.String(), - Donation: sdk.NewCoin(denoms.NUSD, m.amount), - }) - - return ctx, err, true -} - -func MsgServerDonateToPerpEf( - traderAddress sdk.AccAddress, - amount sdkmath.Int, -) action.Action { - return msgServerDonateToPerpEf{ - sender: traderAddress, - amount: amount, - } -} - -type msgServerMultiLiquidate struct { - pairTraderTuples []PairTraderTuple - liquidator sdk.AccAddress - shouldAllFail bool -} - -func (m msgServerMultiLiquidate) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - liquidateMsgs := make([]*types.MsgMultiLiquidate_Liquidation, len(m.pairTraderTuples)) - for i, pairTraderTuple := range m.pairTraderTuples { - liquidateMsgs[i] = &types.MsgMultiLiquidate_Liquidation{ - Pair: pairTraderTuple.Pair, - Trader: pairTraderTuple.Trader.String(), - } - } - - _, err := msgServer.MultiLiquidate(sdk.WrapSDKContext(ctx), &types.MsgMultiLiquidate{ - Sender: m.liquidator.String(), - Liquidations: liquidateMsgs, - }) - - return ctx, err, m.shouldAllFail -} - -func MsgServerMultiLiquidate(liquidator sdk.AccAddress, shouldAllFail bool, pairTraderTuples ...PairTraderTuple) action.Action { - return msgServerMultiLiquidate{ - pairTraderTuples: pairTraderTuples, - liquidator: liquidator, - shouldAllFail: shouldAllFail, - } -} diff --git a/x/perp/v2/integration/action/withdraw.go b/x/perp/v2/integration/action/withdraw.go deleted file mode 100644 index 6c8742e7e..000000000 --- a/x/perp/v2/integration/action/withdraw.go +++ /dev/null @@ -1,36 +0,0 @@ -package action - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -type withdraw struct { - Account sdk.AccAddress - Amount sdkmath.Int - Pair asset.Pair -} - -func (w withdraw) Do(app *app.NibiruApp, ctx sdk.Context) ( - outCtx sdk.Context, err error, isMandatory bool, -) { - market, err := app.PerpKeeperV2.GetMarket(ctx, w.Pair) - if err != nil { - return ctx, err, true - } - - err = app.PerpKeeperV2.WithdrawFromVault(ctx, market, w.Account, w.Amount) - return ctx, err, true -} - -func WithdrawFromVault(pair asset.Pair, account sdk.AccAddress, amount sdkmath.Int) action.Action { - return withdraw{ - Account: account, - Amount: amount, - Pair: pair, - } -} diff --git a/x/perp/v2/integration/assertion/bank.go b/x/perp/v2/integration/assertion/bank.go deleted file mode 100644 index a0ee34478..000000000 --- a/x/perp/v2/integration/assertion/bank.go +++ /dev/null @@ -1,32 +0,0 @@ -package assertion - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -type moduleBalanceShouldBeEqual struct { - module string - expectedBalance sdk.Coins -} - -func (p moduleBalanceShouldBeEqual) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - balance := app.BankKeeper.GetAllBalances(ctx, app.AccountKeeper.GetModuleAddress(p.module)) - - if !balance.IsEqual(p.expectedBalance) { - return ctx, fmt.Errorf("balance expected for %s to be %s, received %s", p.module, p.expectedBalance.String(), balance.String()), false - } - - return ctx, nil, false -} - -func ModuleBalanceShouldBeEqualTo(module string, expectedBalance sdk.Coins) action.Action { - return moduleBalanceShouldBeEqual{ - module: module, - expectedBalance: expectedBalance, - } -} diff --git a/x/perp/v2/integration/assertion/event.go b/x/perp/v2/integration/assertion/event.go deleted file mode 100644 index 4142a40f5..000000000 --- a/x/perp/v2/integration/assertion/event.go +++ /dev/null @@ -1,147 +0,0 @@ -package assertion - -import ( - "errors" - "fmt" - "reflect" - "strings" - - abci "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/gogoproto/proto" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -var ( - _ action.Action = (*containsLiquidateEvent)(nil) - _ action.Action = (*positionChangedEventShouldBeEqual)(nil) -) - -// TODO test(perp): Add action for testing the appearance of of successful -// liquidation events. - -// -------------------------------------------------- -// -------------------------------------------------- - -type containsLiquidateEvent struct { - expectedEvent *types.LiquidationFailedEvent -} - -func (act containsLiquidateEvent) Do(_ *app.NibiruApp, ctx sdk.Context) ( - outCtx sdk.Context, err error, isMandatory bool, -) { - foundEvent := false - matchingEvents := []abci.Event{} - - for _, sdkEvent := range ctx.EventManager().Events() { - if sdkEvent.Type != proto.MessageName(act.expectedEvent) { - continue - } - - abciEvent := abci.Event{ - Type: sdkEvent.Type, - Attributes: sdkEvent.Attributes, - } - - typedEvent, err := sdk.ParseTypedEvent(abciEvent) - if err != nil { - return ctx, err, false - } - - liquidationFailedEvent, ok := typedEvent.(*types.LiquidationFailedEvent) - if !ok { - return ctx, - fmt.Errorf("expected event of type %s, got %s", proto.MessageName(act.expectedEvent), abciEvent.Type), - false - } - - if reflect.DeepEqual(act.expectedEvent, liquidationFailedEvent) { - foundEvent = true - break - } - - matchingEvents = append(matchingEvents, abciEvent) - } - - if foundEvent { - // happy path - return ctx, nil, true - } - - // Show descriptive error messages if the expected event is missing - expected, _ := sdk.TypedEventToEvent(act.expectedEvent) - return ctx, errors.New( - strings.Join([]string{ - fmt.Sprintf("expected: %+v.", sdk.StringifyEvents([]abci.Event{abci.Event(expected)})), - fmt.Sprintf("found %v events:", len(ctx.EventManager().Events())), - fmt.Sprintf("events of matching type:\n%v", sdk.StringifyEvents(matchingEvents).String()), - }, "\n"), - ), false -} - -// ContainsLiquidateEvent checks if a typed event (proto.Message) is contained in the -// event manager of the app context. -func ContainsLiquidateEvent( - expectedEvent *types.LiquidationFailedEvent, -) action.Action { - return containsLiquidateEvent{ - expectedEvent: expectedEvent, - } -} - -type positionChangedEventShouldBeEqual struct { - expectedEvent *types.PositionChangedEvent -} - -func (p positionChangedEventShouldBeEqual) Do(_ *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - for _, sdkEvent := range ctx.EventManager().Events() { - if sdkEvent.Type != proto.MessageName(p.expectedEvent) { - continue - } - - abciEvent := abci.Event{ - Type: sdkEvent.Type, - Attributes: sdkEvent.Attributes, - } - - typedEvent, err := sdk.ParseTypedEvent(abciEvent) - if err != nil { - return ctx, err, false - } - - positionChangedEvent, ok := typedEvent.(*types.PositionChangedEvent) - if !ok { - return ctx, fmt.Errorf("expected event is not of type PositionChangedEvent"), false - } - - if err := types.PositionsAreEqual(&p.expectedEvent.FinalPosition, &positionChangedEvent.FinalPosition); err != nil { - return ctx, err, false - } - - if !reflect.DeepEqual(p.expectedEvent, positionChangedEvent) { - expected, _ := sdk.TypedEventToEvent(p.expectedEvent) - return ctx, fmt.Errorf(`expected event is not equal to the actual event. -want: -%+v -got: -%+v`, sdk.StringifyEvents([]abci.Event{abci.Event(expected)}), sdk.StringifyEvents([]abci.Event{abciEvent})), false - } - - return ctx, nil, false - } - - return ctx, fmt.Errorf("unable to find desired event of type %s", proto.MessageName(p.expectedEvent)), false -} - -// PositionChangedEventShouldBeEqual checks that the position changed event is -// equal to the expected event. -func PositionChangedEventShouldBeEqual( - expectedEvent *types.PositionChangedEvent, -) action.Action { - return positionChangedEventShouldBeEqual{ - expectedEvent: expectedEvent, - } -} diff --git a/x/perp/v2/integration/assertion/market.go b/x/perp/v2/integration/assertion/market.go deleted file mode 100644 index 30fce5f7d..000000000 --- a/x/perp/v2/integration/assertion/market.go +++ /dev/null @@ -1,174 +0,0 @@ -package assertion - -import ( - "fmt" - - "github.com/NibiruChain/nibiru/x/common/testutil/action" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type MarketChecker func(resp types.Market) error - -type marketShouldBeEqual struct { - Pair asset.Pair - Checkers []MarketChecker -} - -func (m marketShouldBeEqual) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - market, err := app.PerpKeeperV2.GetMarket(ctx, m.Pair) - if err != nil { - return ctx, err, false - } - - for _, checker := range m.Checkers { - if err := checker(market); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -func MarketShouldBeEqual(pair asset.Pair, marketCheckers ...MarketChecker) action.Action { - return marketShouldBeEqual{ - Pair: pair, - Checkers: marketCheckers, - } -} - -func Market_LatestCPFShouldBeEqualTo(expectedCPF sdk.Dec) MarketChecker { - return func(market types.Market) error { - if !market.LatestCumulativePremiumFraction.Equal(expectedCPF) { - return fmt.Errorf("expected latest cumulative premium fraction to be %s, got %s", expectedCPF, market.LatestCumulativePremiumFraction) - } - return nil - } -} - -func Market_PrepaidBadDebtShouldBeEqualTo(expectedAmount sdkmath.Int) MarketChecker { - return func(market types.Market) error { - expectedBadDebt := sdk.NewCoin(market.Pair.QuoteDenom(), expectedAmount) - if !market.PrepaidBadDebt.Equal(expectedBadDebt) { - return fmt.Errorf("expected prepaid bad debt to be %s, got %s", expectedBadDebt, market.PrepaidBadDebt) - } - return nil - } -} - -func Market_EnableShouldBeEqualTo(expectedEnabled bool) MarketChecker { - return func(market types.Market) error { - if market.Enabled != expectedEnabled { - return fmt.Errorf("expected enabled to be %t, got %t", expectedEnabled, market.Enabled) - } - return nil - } -} - -type ammShouldBeEqual struct { - Pair asset.Pair - Checkers []AMMChecker -} - -type AMMChecker func(amm types.AMM) error - -func (a ammShouldBeEqual) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - amm, err := app.PerpKeeperV2.GetAMM(ctx, a.Pair) - if err != nil { - return ctx, err, false - } - - for _, checker := range a.Checkers { - if err := checker(amm); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -func AMMShouldBeEqual(pair asset.Pair, ammCheckers ...AMMChecker) action.Action { - return ammShouldBeEqual{ - Pair: pair, - Checkers: ammCheckers, - } -} - -func AMM_BaseReserveShouldBeEqual(expectedBaseReserve sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.BaseReserve.Equal(expectedBaseReserve) { - return fmt.Errorf("expected base reserve to be %s, got %s", expectedBaseReserve, amm.BaseReserve) - } - return nil - } -} - -func AMM_QuoteReserveShouldBeEqual(expectedQuoteReserve sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.QuoteReserve.Equal(expectedQuoteReserve) { - return fmt.Errorf("expected quote reserve to be %s, got %s", expectedQuoteReserve, amm.QuoteReserve) - } - return nil - } -} - -func AMM_SqrtDepthShouldBeEqual(expectedSqrtDepth sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.SqrtDepth.Equal(expectedSqrtDepth) { - return fmt.Errorf("expected sqrt depth to be %s, got %s", expectedSqrtDepth, amm.SqrtDepth) - } - return nil - } -} - -func AMM_SwapInvariantShouldBeEqual(expectedSwapInvariant sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - swapInvariant := amm.BaseReserve.Mul(amm.QuoteReserve) - if !swapInvariant.Equal(expectedSwapInvariant) { - return fmt.Errorf("expected swap invariant to be %s, got %s", expectedSwapInvariant, swapInvariant) - } - return nil - } -} - -func AMM_PriceMultiplierShouldBeEqual(expectedPriceMultiplier sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.PriceMultiplier.Equal(expectedPriceMultiplier) { - return fmt.Errorf("expected price multiplier to be %s, got %s", expectedPriceMultiplier, amm.PriceMultiplier) - } - return nil - } -} - -func AMM_BiasShouldBeEqual(expectedBias sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.Bias().Equal(expectedBias) { - return fmt.Errorf("expected bias to be %s, got %s", expectedBias, amm.Bias()) - } - return nil - } -} - -func AMM_VersionShouldBeEqual(expectedVersion uint64) AMMChecker { - return func(amm types.AMM) error { - if amm.Version != expectedVersion { - return fmt.Errorf("expected version to be %d, got %d", expectedVersion, amm.Version) - } - return nil - } -} - -func AMM_SettlementPriceShoulBeEqual(expectedPrice sdk.Dec) AMMChecker { - return func(amm types.AMM) error { - if !amm.SettlementPrice.Equal(expectedPrice) { - return fmt.Errorf("expected settlement price to be %s, got %s", expectedPrice, amm.SettlementPrice) - } - return nil - } -} diff --git a/x/perp/v2/integration/assertion/notional.go b/x/perp/v2/integration/assertion/notional.go deleted file mode 100644 index fed39d2a1..000000000 --- a/x/perp/v2/integration/assertion/notional.go +++ /dev/null @@ -1,46 +0,0 @@ -package assertion - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" -) - -type positionNotionalTwapShouldBeEqualTo struct { - pair asset.Pair - trader sdk.AccAddress - twapLookbackWindow time.Duration - expectedNotionalValue sdk.Dec -} - -func (p positionNotionalTwapShouldBeEqualTo) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - position, err := app.PerpKeeperV2.GetPosition(ctx, p.pair, 1, p.trader) - if err != nil { - return ctx, err, false - } - - notionalValue, err := app.PerpKeeperV2.PositionNotionalTWAP(ctx, position, p.twapLookbackWindow) - if err != nil { - return ctx, err, false - } - - if !notionalValue.Equal(p.expectedNotionalValue) { - return ctx, fmt.Errorf("notional value expected to be %s, received %s", p.expectedNotionalValue, notionalValue), false - } - - return ctx, nil, false -} - -func PositionNotionalTWAPShouldBeEqualTo(pair asset.Pair, trader sdk.AccAddress, twapLookbackWindow time.Duration, expectedNotionalValue sdk.Dec) action.Action { - return positionNotionalTwapShouldBeEqualTo{ - pair: pair, - trader: trader, - twapLookbackWindow: twapLookbackWindow, - expectedNotionalValue: expectedNotionalValue, - } -} diff --git a/x/perp/v2/integration/assertion/position.go b/x/perp/v2/integration/assertion/position.go deleted file mode 100644 index 8f9184ad7..000000000 --- a/x/perp/v2/integration/assertion/position.go +++ /dev/null @@ -1,80 +0,0 @@ -package assertion - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type PositionChecker func(resp types.Position) error - -type positionShouldBeEqual struct { - Account sdk.AccAddress - Pair asset.Pair - - PositionCheckers []PositionChecker -} - -func (p positionShouldBeEqual) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - position, err := app.PerpKeeperV2.GetPosition(ctx, p.Pair, 1, p.Account) - if err != nil { - return ctx, err, false - } - for _, checker := range p.PositionCheckers { - if err := checker(position); err != nil { - return ctx, err, false - } - } - - return ctx, nil, false -} - -func PositionShouldBeEqual( - account sdk.AccAddress, pair asset.Pair, positionCheckers ...PositionChecker, -) action.Action { - return positionShouldBeEqual{ - Account: account, - Pair: pair, - - PositionCheckers: positionCheckers, - } -} - -// PositionCheckers - -// Position_PositionShouldBeEqualTo checks if the position is equal to the expected position -func Position_PositionShouldBeEqualTo(expectedPosition types.Position) PositionChecker { - return func(position types.Position) error { - if err := types.PositionsAreEqual(&expectedPosition, &position); err != nil { - return err - } - - return nil - } -} - -type positionShouldNotExist struct { - Account sdk.AccAddress - Pair asset.Pair -} - -func (p positionShouldNotExist) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - _, err := app.PerpKeeperV2.GetPosition(ctx, p.Pair, 1, p.Account) - if err == nil { - return ctx, fmt.Errorf("position should not exist, but it does with pair %s", p.Pair), false - } - - return ctx, nil, false -} - -func PositionShouldNotExist(account sdk.AccAddress, pair asset.Pair) action.Action { - return positionShouldNotExist{ - Account: account, - Pair: pair, - } -} diff --git a/x/perp/v2/integration/assertion/twap.go b/x/perp/v2/integration/assertion/twap.go deleted file mode 100644 index 09dd9b706..000000000 --- a/x/perp/v2/integration/assertion/twap.go +++ /dev/null @@ -1,47 +0,0 @@ -package assertion - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/testutil/action" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type twalShouldBe struct { - pair asset.Pair - twapCalcOpt types.TwapCalcOption - dir types.Direction - assetAmt sdk.Dec - twapLookbackWindow time.Duration - - expectedTwap sdk.Dec -} - -func (c twalShouldBe) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - twap, err := app.PerpKeeperV2.CalcTwap(ctx, c.pair, c.twapCalcOpt, c.dir, c.assetAmt, c.twapLookbackWindow) - if err != nil { - return ctx, err, false - } - - if !twap.Equal(c.expectedTwap) { - return ctx, fmt.Errorf("invalid twap, expected %s, received %s", c.expectedTwap, twap), false - } - - return ctx, nil, false -} - -func TwapShouldBe(pair asset.Pair, twapCalcOpt types.TwapCalcOption, dir types.Direction, assetAmt sdk.Dec, twapLookbackWindow time.Duration, expectedTwap sdk.Dec) action.Action { - return twalShouldBe{ - pair: pair, - twapCalcOpt: twapCalcOpt, - dir: dir, - assetAmt: assetAmt, - twapLookbackWindow: twapLookbackWindow, - expectedTwap: expectedTwap, - } -} diff --git a/x/perp/v2/keeper/admin.go b/x/perp/v2/keeper/admin.go deleted file mode 100644 index fda963c64..000000000 --- a/x/perp/v2/keeper/admin.go +++ /dev/null @@ -1,116 +0,0 @@ -package keeper - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// Admin is syntactic sugar to separate admin calls off from the other Keeper -// methods. -// -// These Admin functions should: -// 1. Not be wired into the MsgServer or -// 2. Not be called in other methods in the x/perp module. -// 3. Only be callable from x/wasm/binding via sudo contracts. -// -// The intention here is to make it more obvious to the developer that an unsafe -// function is being used when it's called on the Admin() struct. -func (k Keeper) Admin() admin { - return admin{&k} -} - -// Extends the Keeper with admin functions. -type admin struct{ *Keeper } - -/* -WithdrawFromInsuranceFund sends funds from the Insurance Fund to the given "to" -address. - -Args: -- ctx: Blockchain context holding the current state -- amount: Amount of micro-NUSD to withdraw. -- to: Recipient address -*/ -func (k admin) WithdrawFromInsuranceFund( - ctx sdk.Context, amount sdkmath.Int, to sdk.AccAddress, -) (err error) { - coinToSend := sdk.NewCoin(denoms.NUSD, amount) - if err = k.BankKeeper.SendCoinsFromModuleToAccount( - ctx, - /* from */ types.PerpEFModuleAccount, - /* to */ to, - /* amount */ sdk.NewCoins(coinToSend), - ); err != nil { - return err - } - ctx.EventManager().EmitEvent(sdk.NewEvent( - "withdraw_from_if", - sdk.NewAttribute("to", to.String()), - sdk.NewAttribute("funds", coinToSend.String()), - )) - return nil -} - -type ArgsCreateMarket struct { - Pair asset.Pair - PriceMultiplier sdk.Dec - SqrtDepth sdk.Dec - Market *types.Market // pointer makes it optional -} - -// CreateMarket creates a pool for a specific pair. -func (k admin) CreateMarket( - ctx sdk.Context, - args ArgsCreateMarket, -) error { - pair := args.Pair - market, err := k.GetMarket(ctx, pair) - if err == nil && market.Enabled { - return fmt.Errorf("market %s already exists and it is enabled", pair) - } - - // init market - sqrtDepth := args.SqrtDepth - quoteReserve := sqrtDepth - baseReserve := sqrtDepth - if args.Market == nil { - market = types.DefaultMarket(pair) - } else { - market = *args.Market - } - if err := market.Validate(); err != nil { - return err - } - - lastVersion := k.MarketLastVersion.GetOr(ctx, pair, types.MarketLastVersion{Version: 0}) - lastVersion.Version += 1 - market.Version = lastVersion.Version - - // init amm - amm := types.AMM{ - Pair: pair, - Version: lastVersion.Version, - BaseReserve: baseReserve, - QuoteReserve: quoteReserve, - SqrtDepth: sqrtDepth, - PriceMultiplier: args.PriceMultiplier, - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - } - if err := amm.Validate(); err != nil { - return err - } - - k.SaveMarket(ctx, market) - k.SaveAMM(ctx, amm) - k.MarketLastVersion.Insert(ctx, pair, lastVersion) - - return nil -} diff --git a/x/perp/v2/keeper/admin_test.go b/x/perp/v2/keeper/admin_test.go deleted file mode 100644 index cd423cdd0..000000000 --- a/x/perp/v2/keeper/admin_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestAdmin_WithdrawFromInsuranceFund(t *testing.T) { - expectBalance := func( - want sdkmath.Int, t *testing.T, nibiru *app.NibiruApp, ctx sdk.Context, - ) { - insuranceFund := nibiru.AccountKeeper.GetModuleAddress(types.PerpEFModuleAccount) - balances := nibiru.BankKeeper.GetAllBalances(ctx, insuranceFund) - got := balances.AmountOf(denoms.NUSD) - require.EqualValues(t, want.String(), got.String()) - } - - setup := func() (nibiru *app.NibiruApp, ctx sdk.Context) { - nibiru, ctx = testapp.NewNibiruTestAppAndContext() - expectBalance(sdk.ZeroInt(), t, nibiru, ctx) - return nibiru, ctx - } - - fundModule := func(t *testing.T, amount sdkmath.Int, ctx sdk.Context, nibiru *app.NibiruApp) { - coins := sdk.NewCoins(sdk.NewCoin(denoms.NUSD, amount)) - err := testapp.FundModuleAccount( - nibiru.BankKeeper, ctx, types.PerpEFModuleAccount, - coins, - ) - require.NoError(t, err) - } - - testCases := []testutil.FunctionTestCase{ - { - Name: "withdraw all", - Test: func() { - nibiru, ctx := setup() - admin := testutil.AccAddress() - amountToFund := sdk.NewInt(420) - fundModule(t, amountToFund, ctx, nibiru) - - amountToWithdraw := amountToFund - err := nibiru.PerpKeeperV2.Admin().WithdrawFromInsuranceFund( - ctx, amountToWithdraw, admin) - require.NoError(t, err) - - require.EqualValues(t, - amountToFund.String(), - nibiru.BankKeeper.GetBalance(ctx, admin, denoms.NUSD).Amount.String(), - ) - expectBalance(sdk.ZeroInt(), t, nibiru, ctx) - }, - }, - { - Name: "withdraw too much - err", - Test: func() { - nibiru, ctx := setup() - admin := testutil.AccAddress() - amountToFund := sdk.NewInt(420) - fundModule(t, amountToFund, ctx, nibiru) - - amountToWithdraw := amountToFund.MulRaw(5) - err := nibiru.PerpKeeperV2.Admin().WithdrawFromInsuranceFund( - ctx, amountToWithdraw, admin) - require.Error(t, err) - }, - }, - } - - testutil.RunFunctionTests(t, testCases) -} - -func TestCreateMarket(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - amm := *mock.TestAMMDefault() - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Error because of invalid market - market := types.DefaultMarket(pair).WithMaintenanceMarginRatio(sdk.NewDec(2)) - err := app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: amm.PriceMultiplier, - SqrtDepth: amm.SqrtDepth, - Market: &market, // Invalid maintenance ratio - }) - require.ErrorContains(t, err, "maintenance margin ratio ratio must be 0 <= ratio <= 1") - - // Error because of invalid amm - err = app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: sdk.NewDec(-1), - SqrtDepth: amm.SqrtDepth, - }) - require.ErrorContains(t, err, "init price multiplier must be > 0") - - // Set it correctly - err = app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: amm.PriceMultiplier, - SqrtDepth: amm.SqrtDepth, - }) - require.NoError(t, err) - - lastVersion, err := app.PerpKeeperV2.MarketLastVersion.Get(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(1), lastVersion.Version) - - // Check that amm and market have version 1 - amm, err = app.PerpKeeperV2.GetAMM(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(1), amm.Version) - - market, err = app.PerpKeeperV2.GetMarket(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(1), market.Version) - - // Fail since it already exists and it is not disabled - err = app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: amm.PriceMultiplier, - SqrtDepth: amm.SqrtDepth, - }) - require.ErrorContains(t, err, "already exists") - - // Close the market to test that we can create it again but with an increased version - err = app.PerpKeeperV2.CloseMarket(ctx, pair) - require.NoError(t, err) - - err = app.PerpKeeperV2.Admin().CreateMarket(ctx, keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: amm.PriceMultiplier, - SqrtDepth: amm.SqrtDepth, - }) - require.NoError(t, err) - - lastVersion, err = app.PerpKeeperV2.MarketLastVersion.Get(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(2), lastVersion.Version) - - // Check that amm and market have version 2 - amm, err = app.PerpKeeperV2.GetAMM(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(2), amm.Version) - - market, err = app.PerpKeeperV2.GetMarket(ctx, pair) - require.NoError(t, err) - require.Equal(t, uint64(2), market.Version) -} diff --git a/x/perp/v2/keeper/amm.go b/x/perp/v2/keeper/amm.go deleted file mode 100644 index 79b85d182..000000000 --- a/x/perp/v2/keeper/amm.go +++ /dev/null @@ -1,178 +0,0 @@ -package keeper - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// EditPriceMultiplier edits the peg multiplier of an amm pool after making -// sure there's enough money in the perp EF fund to pay for the repeg. These -// funds get send to the vault to pay for trader's new net margin. -func (k Keeper) EditPriceMultiplier( - ctx sdk.Context, - pair asset.Pair, - newPriceMultiplier sdk.Dec, -) (err error) { - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return err - } - - if newPriceMultiplier.Equal(amm.PriceMultiplier) { - // same price multiplier, no-op - return nil - } - - // Compute cost of re-pegging the pool - cost, err := amm.CalcRepegCost(newPriceMultiplier) - if err != nil { - return err - } - - err = k.handleMarketUpdateCost(ctx, pair, cost) - if err != nil { - return err - } - - // Do the re-peg - amm.PriceMultiplier = newPriceMultiplier - k.SaveAMM(ctx, amm) - - return nil -} - -// EditSwapInvariant edits the swap invariant of an amm pool after making -// sure there's enough money in the perp EF fund to pay for the repeg. These -// funds get send to the vault to pay for trader's new net margin. -func (k Keeper) EditSwapInvariant(ctx sdk.Context, pair asset.Pair, newSwapInvariant sdk.Dec) (err error) { - // Get the pool - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return err - } - - // Compute cost of re-pegging the pool - cost, err := amm.CalcUpdateSwapInvariantCost(newSwapInvariant) - if err != nil { - return err - } - - err = k.handleMarketUpdateCost(ctx, pair, cost) - if err != nil { - return err - } - - err = amm.UpdateSwapInvariant(newSwapInvariant) - if err != nil { - return err - } - - k.SaveAMM(ctx, amm) - - return nil -} - -func (k Keeper) handleMarketUpdateCost(ctx sdk.Context, pair asset.Pair, costAmt sdkmath.Int) (err error) { - if costAmt.IsPositive() { - // Positive cost, send from perp EF to vault - cost := sdk.NewCoins( - sdk.NewCoin(pair.QuoteDenom(), costAmt), - ) - err = k.BankKeeper.SendCoinsFromModuleToModule( - ctx, - types.PerpEFModuleAccount, - types.VaultModuleAccount, - cost, - ) - if err != nil { - return types.ErrNotEnoughFundToPayAction.Wrapf( - "not enough fund in perp ef to pay for repeg, need %s got %s", - cost.String(), - k.BankKeeper.GetBalance(ctx, k.AccountKeeper.GetModuleAddress(types.PerpEFModuleAccount), pair.QuoteDenom()).String(), - ) - } - } else if costAmt.IsNegative() { - // Negative cost, send from margin vault to perp ef. - err = k.BankKeeper.SendCoinsFromModuleToModule( - ctx, - types.VaultModuleAccount, - types.PerpEFModuleAccount, - sdk.NewCoins( - sdk.NewCoin(pair.QuoteDenom(), costAmt.Neg()), - ), - ) - if err != nil { // nolint:staticcheck - // if there's no money in margin to pay for the repeg, we still repeg. It's surprising if it's - // happening on mainnet, but it's not a problem. - // It means there's bad debt in the system, and it's preventing to pay for the repeg down. But the bad debt - // end up being paid up by the perp EF anyway. - } - } - return nil -} - -// GetMarket returns the market that is enabled. It is the last version of the market. -func (k Keeper) GetMarket(ctx sdk.Context, pair asset.Pair) (types.Market, error) { - lastVersion, err := k.MarketLastVersion.Get(ctx, pair) - if err != nil { - return types.Market{}, fmt.Errorf("market %s not found", pair) - } - - market, err := k.Markets.Get(ctx, collections.Join(pair, lastVersion.Version)) - if err != nil { - return types.Market{}, fmt.Errorf("market %s not found", pair) - } - - return market, nil -} - -// GetMarketByPairAndVersion this function returns the market by pair and version. It can be enabled or disabled. -func (k Keeper) GetMarketByPairAndVersion(ctx sdk.Context, pair asset.Pair, version uint64) (types.Market, error) { - market, err := k.Markets.Get(ctx, collections.Join(pair, version)) - if err != nil { - return types.Market{}, fmt.Errorf("market with pair %s and version %d not found", pair, version) - } - - return market, nil -} - -// SaveMarket saves the market by pair and version. -func (k Keeper) SaveMarket(ctx sdk.Context, market types.Market) { - k.Markets.Insert(ctx, collections.Join(market.Pair, market.Version), market) -} - -// GetAMM returns the amm with last version. -func (k Keeper) GetAMM(ctx sdk.Context, pair asset.Pair) (types.AMM, error) { - lastVersion, err := k.MarketLastVersion.Get(ctx, pair) - if err != nil { - return types.AMM{}, fmt.Errorf("market %s not found", pair) - } - - amm, err := k.AMMs.Get(ctx, collections.Join(pair, lastVersion.Version)) - if err != nil { - return types.AMM{}, fmt.Errorf("market %s not found", pair) - } - - return amm, nil -} - -// GetAMMByPairAndVersion returns the amm by pair and version. -func (k Keeper) GetAMMByPairAndVersion(ctx sdk.Context, pair asset.Pair, version uint64) (types.AMM, error) { - amm, err := k.AMMs.Get(ctx, collections.Join(pair, version)) - if err != nil { - return types.AMM{}, fmt.Errorf("amm with pair %s and version %d not found", pair, version) - } - - return amm, nil -} - -// SaveAMM saves the amm by pair and version. -func (k Keeper) SaveAMM(ctx sdk.Context, amm types.AMM) { - k.AMMs.Insert(ctx, collections.Join(amm.Pair, amm.Version), amm) -} diff --git a/x/perp/v2/keeper/amm_test.go b/x/perp/v2/keeper/amm_test.go deleted file mode 100644 index 6a15e57da..000000000 --- a/x/perp/v2/keeper/amm_test.go +++ /dev/null @@ -1,467 +0,0 @@ -package keeper_test - -import ( - "fmt" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/collections" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestEditPriceMultipler(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - tests := TestCases{ - TC("same price multiplier"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1000)), WithTotalShort(sdk.NewDec(500))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.OneDec()), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("net bias zero"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1000)), WithTotalShort(sdk.NewDec(1000))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.NewDec(10)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.NewDec(10)), - ), - ), - - TC("long bias, increase price multiplier"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1000)), WithTotalShort(sdk.NewDec(500))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.NewDec(10)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1004500)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(995500)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.NewDec(10)), - ), - ), - - TC("long bias, decrease price multiplier"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1000)), WithTotalShort(sdk.NewDec(500))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.MustNewDecFromStr("0.25")), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(999626)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1000374)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.MustNewDecFromStr("0.25")), - ), - ), - - TC("short bias, increase price multiplier"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(500)), WithTotalShort(sdk.NewDec(1000))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.NewDec(10)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(995500)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1004500)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.NewDec(10)), - ), - ), - - TC("short bias, decrease price multiplier"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(500)), WithTotalShort(sdk.NewDec(1000))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditPriceMultiplier(pair, sdk.MustNewDecFromStr("0.25")), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1000376)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(999624)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e12)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e12)), - AMM_PriceMultiplierShouldBeEqual(sdk.MustNewDecFromStr("0.25")), - ), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestEditPriceMultiplerFail(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - app, ctx := testapp.NewNibiruTestAppAndContext() - account := sdk.MustAccAddressFromBech32("cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v") - - err := app.PerpKeeperV2.Admin().CreateMarket( - ctx, - keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: sdk.NewDec(2), - SqrtDepth: sdk.NewDec(1_000_000), - }, - ) - app.PerpKeeperV2.ReserveSnapshots.Insert( - ctx, - collections.Join(pair, ctx.BlockTime()), - types.ReserveSnapshot{ - Amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(1_000), - QuoteReserve: sdk.NewDec(1_000), - SqrtDepth: sdk.NewDec(1_000_000), - PriceMultiplier: sdk.NewDec(2), - TotalLong: sdk.NewDec(100), - TotalShort: sdk.ZeroDec(), - }, - TimestampMs: ctx.BlockTime().UnixMilli(), - }) - require.NoError(t, err) - - // Error because of invalid pair - err = app.PerpKeeperV2.Admin().EditPriceMultiplier(ctx, asset.MustNewPair("luna:usdt"), sdk.NewDec(-1)) - require.ErrorContains(t, err, "market luna:usdt not found") - - // Error because of invalid price multiplier - err = app.PerpKeeperV2.Admin().EditPriceMultiplier(ctx, pair, sdk.NewDec(-1)) - require.ErrorIs(t, err, types.ErrNonPositivePegMultiplier) - - // Add market activity - err = app.BankKeeper.MintCoins(ctx, "inflation", sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1020)))) - require.NoError(t, err) - - err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, "inflation", account, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1020)))) - require.NoError(t, err) - - _, err = app.PerpKeeperV2.MarketOrder( - ctx, - pair, - types.Direction_LONG, - sdk.MustAccAddressFromBech32("cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v"), - sdk.NewInt(1000), - sdk.OneDec(), - sdk.ZeroDec(), - ) - require.NoError(t, err) - - // Error because no money in perp ef fund - err = app.PerpKeeperV2.Admin().EditPriceMultiplier(ctx, pair, sdk.NewDec(3)) - require.ErrorContains(t, err, "not enough fund in perp ef to pay for repeg") - - // Works because it goes in the other way - err = app.PerpKeeperV2.Admin().EditPriceMultiplier(ctx, pair, sdk.NewDec(1)) - require.NoError(t, err) -} - -func TestEditSwapInvariantFail(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - app, ctx := testapp.NewNibiruTestAppAndContext() - account := sdk.MustAccAddressFromBech32("cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v") - - err := app.PerpKeeperV2.Admin().CreateMarket( - ctx, - keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: sdk.NewDec(2), - SqrtDepth: sdk.NewDec(1_000), - }, - ) - app.PerpKeeperV2.ReserveSnapshots.Insert( - ctx, - collections.Join(pair, ctx.BlockTime()), - types.ReserveSnapshot{ - Amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(1_000), - QuoteReserve: sdk.NewDec(1_000), - SqrtDepth: sdk.NewDec(1_000), - PriceMultiplier: sdk.NewDec(2), - TotalLong: sdk.NewDec(100), - TotalShort: sdk.ZeroDec(), - }, - TimestampMs: ctx.BlockTime().UnixMilli(), - }) - require.NoError(t, err) - - // Error because of invalid price multiplier - err = app.PerpKeeperV2.Admin().EditSwapInvariant(ctx, asset.MustNewPair("luna:usdt"), sdk.NewDec(-1)) - require.ErrorContains(t, err, "market luna:usdt not found") - - // Error because of invalid price multiplier - err = app.PerpKeeperV2.Admin().EditSwapInvariant(ctx, pair, sdk.NewDec(-1)) - require.ErrorIs(t, err, types.ErrNegativeSwapInvariant) - - // Add market activity - err = app.BankKeeper.MintCoins(ctx, "inflation", sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(102)))) - require.NoError(t, err) - - err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, "inflation", account, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(102)))) - require.NoError(t, err) - - _, err = app.PerpKeeperV2.MarketOrder( - ctx, - pair, - types.Direction_LONG, - sdk.MustAccAddressFromBech32("cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v"), - sdk.NewInt(100), - sdk.OneDec(), - sdk.ZeroDec(), - ) - require.NoError(t, err) - - // Error because no money in perp ef fund - err = app.PerpKeeperV2.Admin().EditSwapInvariant(ctx, pair, sdk.NewDec(2_000_000)) - require.ErrorContains(t, err, "not enough fund in perp ef to pay for repeg") - - // Fail at validate - err = app.PerpKeeperV2.Admin().EditSwapInvariant(ctx, pair, sdk.NewDec(0)) - require.ErrorContains(t, err, "swap multiplier must be > 0") - - // Works because it goes in the other way - err = app.PerpKeeperV2.Admin().EditSwapInvariant(ctx, pair, sdk.NewDec(500_000)) - require.NoError(t, err) -} - -func TestEditSwapInvariant(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - tests := TestCases{ - TC("same swap invariant"). - Given( - CreateCustomMarket(pair, - WithTotalLong(sdk.NewDec(1000)), - WithTotalShort(sdk.NewDec(500)), - WithSqrtDepth(sdk.NewDec(1e6)), - ), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e12)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e6)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e6)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e6)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("net bias zero"). - Given( - CreateCustomMarket(pair, - WithTotalLong(sdk.NewDec(1000)), - WithTotalShort(sdk.NewDec(1000)), - WithSqrtDepth(sdk.NewDec(1e6)), - ), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e18)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1e6)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e9)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e9)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e9)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("long bias, increase swap invariant"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1e5)), WithSqrtDepth(sdk.NewDec(1e6))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e14)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1008101)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(991899)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e7)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e7)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e7)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("long bias, decrease swap invariant"). - Given( - CreateCustomMarket(pair, WithTotalLong(sdk.NewDec(1e2)), WithSqrtDepth(sdk.NewDec(1e6))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e6)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(999991)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1000009)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e3)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e3)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e3)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("short bias, increase swap invariant"). - Given( - CreateCustomMarket(pair, WithTotalShort(sdk.NewDec(1e5)), WithSqrtDepth(sdk.NewDec(1e6))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e14)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1010102)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(989898)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e7)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e7)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e7)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - - TC("short bias, decrease swap invariant"). - Given( - CreateCustomMarket(pair, WithTotalShort(sdk.NewDec(1e2)), WithSqrtDepth(sdk.NewDec(1e6))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - EditSwapInvariant(pair, sdk.NewDec(1e6)), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(999989)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(1000011)), - AMMShouldBeEqual(pair, - AMM_SqrtDepthShouldBeEqual(sdk.NewDec(1e3)), - AMM_BaseReserveShouldBeEqual(sdk.NewDec(1e3)), - AMM_QuoteReserveShouldBeEqual(sdk.NewDec(1e3)), - AMM_PriceMultiplierShouldBeEqual(sdk.OneDec()), - ), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestKeeper_GetMarketByPairAndVersion(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - err := app.PerpKeeperV2.Admin().CreateMarket( - ctx, - keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: sdk.NewDec(2), - SqrtDepth: sdk.NewDec(1_000_000), - }, - ) - require.NoError(t, err) - - market, err := app.PerpKeeperV2.Admin().GetMarketByPairAndVersion(ctx, pair, 1) - require.NoError(t, err) - require.Equal(t, market.Version, uint64(1)) - require.Equal(t, market.Pair, pair) - - market, err = app.PerpKeeperV2.Admin().GetMarketByPairAndVersion(ctx, pair, 2) - require.ErrorContains(t, err, fmt.Sprintf("market with pair %s and version 2 not found", pair.String())) -} - -func TestKeeper_GetAMMByPairAndVersion(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - err := app.PerpKeeperV2.Admin().CreateMarket( - ctx, - keeper.ArgsCreateMarket{ - Pair: pair, - PriceMultiplier: sdk.NewDec(2), - SqrtDepth: sdk.NewDec(1_000_000), - }, - ) - require.NoError(t, err) - - amm, err := app.PerpKeeperV2.Admin().GetAMMByPairAndVersion(ctx, pair, 1) - require.NoError(t, err) - require.Equal(t, amm.Version, uint64(1)) - require.Equal(t, amm.Pair, pair) - - amm, err = app.PerpKeeperV2.Admin().GetAMMByPairAndVersion(ctx, pair, 2) - require.ErrorContains(t, err, fmt.Sprintf("amm with pair %s and version 2 not found", pair.String())) -} diff --git a/x/perp/v2/keeper/calc.go b/x/perp/v2/keeper/calc.go deleted file mode 100644 index d09e19f97..000000000 --- a/x/perp/v2/keeper/calc.go +++ /dev/null @@ -1,98 +0,0 @@ -package keeper - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// PositionNotionalSpot returns the position's notional value based on the spot price. -func PositionNotionalSpot(amm types.AMM, position types.Position) (positionNotional sdk.Dec, err error) { - // we want to know the price if the user closes their position - // e.g. if the user has positive size, we want to short - if position.Size_.IsNil() { - return sdk.Dec{}, fmt.Errorf("input base amt is nil") - } - - var dir types.Direction - if position.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - quoteReserve, err := amm.GetQuoteReserveAmt(position.Size_.Abs(), dir) - if err != nil { - return sdk.Dec{}, err - } - return amm.QuoteReserveToAsset(quoteReserve), nil -} - -// PositionNotionalTWAP returns the position's notional value based on the TWAP price. -func (k Keeper) PositionNotionalTWAP(ctx sdk.Context, - position types.Position, - twapLookbackWindow time.Duration, -) (positionNotional sdk.Dec, err error) { - // we want to know the price if the user closes their position - // e.g. if the user has positive size, we want to short - var dir types.Direction - if position.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - return k.CalcTwap( - ctx, - position.Pair, - types.TwapCalcOption_BASE_ASSET_SWAP, - dir, - position.Size_.Abs(), - /*lookbackInterval=*/ twapLookbackWindow, - ) -} - -// UnrealizedPnl calculates the unrealized profits and losses (PnL) of a position. -func UnrealizedPnl(position types.Position, positionNotional sdk.Dec) (unrealizedPnlSigned sdk.Dec) { - if position.Size_.IsPositive() { - // LONG - return positionNotional.Sub(position.OpenNotional) - } else { - // SHORT - return position.OpenNotional.Sub(positionNotional) - } -} - -// MarginRatio Given a position and it's notional value, returns the margin ratio. -func MarginRatio( - position types.Position, - positionNotional sdk.Dec, - marketLatestCumulativePremiumFraction sdk.Dec, -) sdk.Dec { - if position.Size_.IsZero() || positionNotional.IsZero() { - return sdk.ZeroDec() - } - - unrealizedPnl := UnrealizedPnl(position, positionNotional) - fundingPayment := FundingPayment(position, marketLatestCumulativePremiumFraction) - remainingMargin := position.Margin.Add(unrealizedPnl).Sub(fundingPayment) - - return remainingMargin.Quo(positionNotional) -} - -// FundingPayment calculates the funding payment of a position. -// -// args: -// - position: the position to calculate funding payment for -// - marketLatestCumulativePremiumFraction: the latest cumulative premium fraction of the market -// -// returns: -// - fundingPayment: the funding payment of the position, signed -func FundingPayment(position types.Position, marketLatestCumulativePremiumFraction sdk.Dec) sdk.Dec { - return marketLatestCumulativePremiumFraction. - Sub(position.LatestCumulativePremiumFraction). - Mul(position.Size_) -} diff --git a/x/perp/v2/keeper/calc_test.go b/x/perp/v2/keeper/calc_test.go deleted file mode 100644 index dade53d60..000000000 --- a/x/perp/v2/keeper/calc_test.go +++ /dev/null @@ -1,395 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" - - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" -) - -func TestPositionNotionalSpot(t *testing.T) { - tests := []struct { - name string - amm *types.AMM - position types.Position - expectedNotional sdk.Dec - }{ - { - name: "long position", - amm: mock.TestAMM(sdk.NewDec(1_000), sdk.NewDec(2)), - position: types.Position{ - Size_: sdk.NewDec(10), - }, - expectedNotional: sdk.MustNewDecFromStr("19.801980198019801980"), - }, - { - name: "short position", - amm: mock.TestAMM(sdk.NewDec(1_000), sdk.NewDec(2)), - position: types.Position{ - Size_: sdk.NewDec(-10), - }, - expectedNotional: sdk.MustNewDecFromStr("20.202020202020202020"), - }, - { - name: "zero position", - amm: mock.TestAMM(sdk.NewDec(1_000), sdk.NewDec(2)), - position: types.Position{ - Size_: sdk.ZeroDec(), - }, - expectedNotional: sdk.ZeroDec(), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - notional, err := keeper.PositionNotionalSpot(*tc.amm, tc.position) - require.NoError(t, err) - assert.EqualValues(t, tc.expectedNotional, notional) - }) - } -} - -func TestPositionNotionalTWAP(t *testing.T) { - alice := testutil.AccAddress() - pair := asset.Registry.Pair(denoms.BTC, denoms.USDC) - startTime := time.Now() - - tc := TestCases{ - TC("long position"). - Given( - SetBlockTime(startTime), - SetBlockNumber(1), - CreateCustomMarket(pair), - InsertPosition(WithSize(sdk.NewDec(10)), WithTrader(alice)), - InsertReserveSnapshot(pair, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pair, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("8.5"))), - InsertReserveSnapshot(pair, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("9.5"))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - PositionNotionalTWAPShouldBeEqualTo(pair, alice, 30*time.Second, sdk.MustNewDecFromStr("89.999999999100000000")), - ), - - TC("short position"). - Given( - SetBlockTime(startTime), - SetBlockNumber(1), - CreateCustomMarket(pair), - InsertPosition(WithSize(sdk.NewDec(-10)), WithTrader(alice)), - InsertReserveSnapshot(pair, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pair, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("8.5"))), - InsertReserveSnapshot(pair, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("9.5"))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - PositionNotionalTWAPShouldBeEqualTo(pair, alice, 30*time.Second, sdk.MustNewDecFromStr("90.000000000900000000")), - ), - - TC("zero position"). - Given( - SetBlockTime(startTime), - SetBlockNumber(1), - CreateCustomMarket(pair), - InsertPosition(WithSize(sdk.ZeroDec()), WithTrader(alice)), - InsertReserveSnapshot(pair, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pair, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("8.5"))), - InsertReserveSnapshot(pair, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.MustNewDecFromStr("9.5"))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - PositionNotionalTWAPShouldBeEqualTo(pair, alice, 30*time.Second, sdk.ZeroDec()), - ), - - TC("single snapshot"). - Given( - SetBlockTime(startTime), - SetBlockNumber(1), - CreateCustomMarket(pair), - ). - When( - InsertPosition(WithSize(sdk.NewDec(100)), WithTrader(alice)), - InsertReserveSnapshot(pair, startTime, WithPriceMultiplier(sdk.NewDec(9))), - ). - Then( - PositionNotionalTWAPShouldBeEqualTo(pair, alice, 30*time.Second, sdk.MustNewDecFromStr("899.999999910000000009")), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestUnrealizedPnl(t *testing.T) { - tests := []struct { - name string - position types.Position - positionNotional sdk.Dec - expectedUnrealizedPnl sdk.Dec - }{ - { - name: "long position positive pnl", - position: types.Position{ - Size_: sdk.NewDec(10), - OpenNotional: sdk.NewDec(10), - }, - positionNotional: sdk.NewDec(15), - expectedUnrealizedPnl: sdk.NewDec(5), - }, - { - name: "long position negative pnl", - position: types.Position{ - Size_: sdk.NewDec(10), - OpenNotional: sdk.NewDec(10), - }, - positionNotional: sdk.NewDec(5), - expectedUnrealizedPnl: sdk.NewDec(-5), - }, - { - name: "short position positive pnl", - position: types.Position{ - Size_: sdk.NewDec(-10), - OpenNotional: sdk.NewDec(10), - }, - positionNotional: sdk.NewDec(5), - expectedUnrealizedPnl: sdk.NewDec(5), - }, - { - name: "short position negative pnl", - position: types.Position{ - Size_: sdk.NewDec(-10), - OpenNotional: sdk.NewDec(10), - }, - positionNotional: sdk.NewDec(15), - expectedUnrealizedPnl: sdk.NewDec(-5), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - assert.EqualValues(t, tc.expectedUnrealizedPnl, keeper.UnrealizedPnl(tc.position, tc.positionNotional)) - }) - } -} - -func TestMarginRatio(t *testing.T) { - tests := []struct { - name string - position types.Position - positionNotional sdk.Dec - latestCPF sdk.Dec - expectedMarginRatio sdk.Dec - }{ - { - name: "long position, no change", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(100), - latestCPF: sdk.ZeroDec(), - expectedMarginRatio: sdk.OneDec(), - }, - { - name: "long position, positive PnL, positive cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(110), - latestCPF: sdk.NewDec(2), - expectedMarginRatio: sdk.MustNewDecFromStr("0.981818181818181818"), // 108 / 110 - }, - { - name: "long position, positive PnL, negative cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(110), - latestCPF: sdk.NewDec(-2), - expectedMarginRatio: sdk.MustNewDecFromStr("1.018181818181818182"), // 112 / 110 - }, - { - name: "long position, negative PnL, positive cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(90), - latestCPF: sdk.NewDec(2), - expectedMarginRatio: sdk.MustNewDecFromStr("0.977777777777777778"), // 88 / 90 - }, - { - name: "long position, negative PnL, negative cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(90), - latestCPF: sdk.NewDec(-2), - expectedMarginRatio: sdk.MustNewDecFromStr("1.022222222222222222"), // 92 / 90 - }, - { - name: "short position, no change", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.NewDec(-1), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(100), - latestCPF: sdk.ZeroDec(), - expectedMarginRatio: sdk.OneDec(), - }, - { - name: "short position, positive PnL, positive cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.NewDec(-1), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(90), - latestCPF: sdk.NewDec(2), - expectedMarginRatio: sdk.MustNewDecFromStr("1.244444444444444444"), // 112 / 90 - }, - { - name: "short position, positive PnL, negative cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.NewDec(-1), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(90), - latestCPF: sdk.NewDec(-2), - expectedMarginRatio: sdk.MustNewDecFromStr("1.2"), // 108 / 90 - }, - { - name: "short position, negative PnL, positive cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.NewDec(-1), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(110), - latestCPF: sdk.NewDec(2), - expectedMarginRatio: sdk.MustNewDecFromStr("0.836363636363636364"), // 92 / 110 - }, - { - name: "short position, negative PnL, negative cumulative premium fraction", - position: types.Position{ - Margin: sdk.NewDec(100), - Size_: sdk.NewDec(-1), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - OpenNotional: sdk.NewDec(100), - }, - positionNotional: sdk.NewDec(110), - latestCPF: sdk.NewDec(-2), - expectedMarginRatio: sdk.MustNewDecFromStr("0.8"), // 88 / 110 - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - assert.EqualValues(t, tc.expectedMarginRatio, keeper.MarginRatio(tc.position, tc.positionNotional, tc.latestCPF)) - }) - } -} - -func TestFundingPayment(t *testing.T) { - tests := []struct { - name string - position types.Position - marketLatestCPF sdk.Dec - expectedFundingPayment sdk.Dec - }{ - { - name: "long position, positive cumulative premium fraction", - position: types.Position{ - Size_: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.001"), - }, - marketLatestCPF: sdk.MustNewDecFromStr("0.002"), - expectedFundingPayment: sdk.MustNewDecFromStr("0.010"), - }, - { - name: "long position, negative cumulative premium fraction", - position: types.Position{ - Size_: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.002"), - }, - marketLatestCPF: sdk.MustNewDecFromStr("0.001"), - expectedFundingPayment: sdk.MustNewDecFromStr("-0.010"), - }, - { - name: "short position, positive cumulative premium fraction", - position: types.Position{ - Size_: sdk.NewDec(-10), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.002"), - }, - marketLatestCPF: sdk.MustNewDecFromStr("0.001"), - expectedFundingPayment: sdk.MustNewDecFromStr("0.010"), - }, - { - name: "short position, negative cumulative premium fraction", - position: types.Position{ - Size_: sdk.NewDec(-10), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.001"), - }, - marketLatestCPF: sdk.MustNewDecFromStr("0.002"), - expectedFundingPayment: sdk.MustNewDecFromStr("-0.010"), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - fundingPayment := keeper.FundingPayment(tc.position, tc.marketLatestCPF) - assert.EqualValues(t, tc.expectedFundingPayment, fundingPayment) - }) - } -} - -func TestMarginRatioFail(t *testing.T) { - val := keeper.MarginRatio(types.Position{Size_: sdk.ZeroDec()}, sdk.ZeroDec(), sdk.ZeroDec()) - require.Equal(t, sdk.ZeroDec(), val) - - _, err := keeper.PositionNotionalSpot(types.AMM{PriceMultiplier: sdk.OneDec()}, types.Position{Size_: sdk.ZeroDec()}) - require.NoError(t, err) - - _, err = keeper.PositionNotionalSpot(types.AMM{}, types.Position{}) - require.ErrorContains(t, err, "input base amt is nil") -} diff --git a/x/perp/v2/keeper/clearing_house.go b/x/perp/v2/keeper/clearing_house.go deleted file mode 100644 index 672449d35..000000000 --- a/x/perp/v2/keeper/clearing_house.go +++ /dev/null @@ -1,910 +0,0 @@ -package keeper - -import ( - "errors" - "fmt" - - sdkmath "cosmossdk.io/math" - - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// MarketOrder opens a position on the selected pair. -// -// args: -// - ctx: cosmos-sdk context -// - pair: pair to open position on -// - dir: direction the user is taking -// - traderAddr: address of the trader -// - quoteAssetAmt: amount of quote asset to open position with -// - leverage: leverage to open position with -// - baseAmtLimit: minimum base asset amount to open position with -// -// ret: -// - positionResp: contains the result of the open position and the new position -// - err: error -func (k Keeper) MarketOrder( - ctx sdk.Context, - pair asset.Pair, - dir types.Direction, - traderAddr sdk.AccAddress, - quoteAssetAmt sdkmath.Int, - leverage sdk.Dec, - baseAmtLimit sdk.Dec, -) (positionResp *types.PositionResp, err error) { - market, err := k.GetMarket(ctx, pair) - if err != nil { - return nil, types.ErrPairNotFound.Wrapf("pair %s not found", pair) - } - - if !market.Enabled { - return nil, types.ErrMarketNotEnabled.Wrapf("market pair %s not enabled", pair) - } - - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return nil, types.ErrPairNotFound.Wrapf("pair %s not found", pair) - } - - err = checkMarketOrderRequirements(market, quoteAssetAmt, leverage) - if err != nil { - return nil, err - } - - position, err := k.GetPosition(ctx, pair, market.Version, traderAddr) - isNewPosition := errors.Is(err, types.ErrPositionNotFound) - if isNewPosition { - position = types.ZeroPosition(ctx, pair, traderAddr) - } - - sameSideLong := position.Size_.IsPositive() && dir == types.Direction_LONG - sameSideShort := position.Size_.IsNegative() && dir == types.Direction_SHORT - - var updatedAMM *types.AMM - openSideMatchesPosition := sameSideLong || sameSideShort - if isNewPosition || openSideMatchesPosition { - updatedAMM, positionResp, err = k.increasePosition( - ctx, - market, - amm, - position, - dir, - /* openNotional */ leverage.MulInt(quoteAssetAmt), - /* minPositionSize */ baseAmtLimit, - /* leverage */ leverage) - if err != nil { - return nil, err - } - } else { - quoteAssetAmtToDec := sdk.NewDecFromInt(quoteAssetAmt) - updatedAMM, positionResp, err = k.openReversePosition( - ctx, - market, - amm, - position, - /* quoteAssetAmount */ quoteAssetAmtToDec, - /* leverage */ leverage, - /* baseAmtLimit */ baseAmtLimit, - ) - if err != nil { - return nil, err - } - } - - // check bad debt - if !positionResp.Position.Size_.IsZero() { - if !positionResp.BadDebt.IsZero() { - return nil, types.ErrBadDebt.Wrapf("position has bad debt %s", positionResp.BadDebt) - } - - err = k.checkMarginRatio(ctx, market, *updatedAMM, positionResp.Position) - if err != nil { - return nil, err - } - } - - if err = k.afterPositionUpdate( - ctx, market, *updatedAMM, traderAddr, *positionResp, types.ChangeReason_MarketOrder, position, - ); err != nil { - return nil, err - } - - return positionResp, nil -} - -// increases a position by increasedNotional amount in margin units. -// Calculates the amount of margin required given the leverage parameter. -// Recalculates the remaining margin after applying a funding payment. -// Does not realize PnL. -// -// For example, a long position with position notional value of 150 NUSD and unrealized PnL of 50 NUSD -// could increase their position by 30 NUSD using 10x leverage. -// This would be: -// - 3 NUSD as margin requirement -// - new open notional value of 130 NUSD -// - new position notional value of 150 NUSD -// - unrealized PnL remains unchanged at 50 NUSD -// - remaining margin is calculated by applying the funding payment -// -// args: -// - ctx: sdk.Context -// - market: the perp market -// - amm: the amm reserves -// - currentPosition: the current position -// - dir: the direction the user is taking -// - increasedNotional: the amount of notional the user is increasing by, must be positive -// - baseAmtLimit: the user-specified limit on the base reserves -// - leverage: the leverage the user is taking -// -// returns: -// - updatedAMM: the updated AMM reserves -// - positionResp: updated position information -// - err: error -func (k Keeper) increasePosition( - ctx sdk.Context, - market types.Market, - amm types.AMM, - currentPosition types.Position, - dir types.Direction, - increasedNotional sdk.Dec, // unsigned - baseAmtLimit sdk.Dec, // unsigned - leverage sdk.Dec, // unsigned -) (updatedAMM *types.AMM, positionResp *types.PositionResp, err error) { - positionNotional, err := PositionNotionalSpot(amm, currentPosition) - if err != nil { - return nil, nil, err - } - - positionResp = &types.PositionResp{ - RealizedPnl: sdk.ZeroDec(), - MarginToVault: increasedNotional.Quo(leverage), // unsigned - FundingPayment: FundingPayment(currentPosition, market.LatestCumulativePremiumFraction), // signed - ExchangedNotionalValue: increasedNotional, // unsigned - PositionNotional: positionNotional.Add(increasedNotional), // unsigned - } - - remainingMargin := currentPosition.Margin.Add(positionResp.MarginToVault).Sub(positionResp.FundingPayment) // signed - - updatedAMM, baseAssetDeltaAbs, err := k.SwapQuoteAsset( - ctx, - amm, - dir, - increasedNotional, - baseAmtLimit, - ) - if err != nil { - return nil, nil, err - } - - if dir == types.Direction_LONG { - positionResp.ExchangedPositionSize = baseAssetDeltaAbs - } else if dir == types.Direction_SHORT { - positionResp.ExchangedPositionSize = baseAssetDeltaAbs.Neg() - } - - positionResp.BadDebt = sdk.MinDec(sdk.ZeroDec(), remainingMargin).Abs() - positionResp.Position = types.Position{ - TraderAddress: currentPosition.TraderAddress, - Pair: currentPosition.Pair, - Size_: currentPosition.Size_.Add(positionResp.ExchangedPositionSize), - Margin: sdk.MaxDec(sdk.ZeroDec(), remainingMargin).Abs(), - OpenNotional: currentPosition.OpenNotional.Add(increasedNotional), - LatestCumulativePremiumFraction: market.LatestCumulativePremiumFraction, - LastUpdatedBlockNumber: ctx.BlockHeight(), - } - positionResp.UnrealizedPnlAfter = UnrealizedPnl(positionResp.Position, positionResp.PositionNotional) - - return updatedAMM, positionResp, nil -} - -// decreases a position by decreasedNotional amount in margin units. -// Calculates the amount of margin required given the leverage parameter. -// Recalculates the remaining margin after applying a funding payment. -// -// args: -// - ctx: sdk.Context -// - market: the perp market -// - amm: the amm reserves -// - currentPosition: the current position -// - decreasedNotional: the amount of notional the user is decreasing by -// - baseAmtLimit: the user-specified limit on the base reserves -// -// returns: -// - updatedAMM: the updated AMM reserves -// - positionResp: updated position information -// - err: error -func (k Keeper) openReversePosition( - ctx sdk.Context, - market types.Market, - amm types.AMM, - currentPosition types.Position, - quoteAssetAmount sdk.Dec, - leverage sdk.Dec, - baseAmtLimit sdk.Dec, -) (updatedAMM *types.AMM, positionResp *types.PositionResp, err error) { - notionalToDecreaseBy := leverage.Mul(quoteAssetAmount) - currentPositionNotional, err := PositionNotionalSpot(amm, currentPosition) - if err != nil { - return nil, nil, err - } - - if currentPositionNotional.GT(notionalToDecreaseBy) { - // position reduction - return k.decreasePosition( - ctx, - market, - amm, - currentPosition, - notionalToDecreaseBy, - baseAmtLimit, - ) - } else { - // close and reverse - return k.closeAndOpenReversePosition( - ctx, - market, - amm, - currentPosition, - quoteAssetAmount, - leverage, - baseAmtLimit, - ) - } -} - -// Decreases a position by decreasedNotional amount in margin units. -// Realizes PnL and calculates remaining margin after applying a funding payment. -// -// For example, a long position with position notional value of 150 NUSD and PnL of 50 NUSD -// could decrease their position by 30 NUSD. This would realize a PnL of 10 NUSD (50NUSD * 30/150) -// and update their margin (old margin + realized PnL - funding payment). -// Their new position notional value would be 120 NUSD and their position size would -// shrink by 20%. -// -// args: -// - ctx: cosmos-sdk context -// - market: the perp market -// - amm: the amm reserves -// - currentPosition: the current position -// - decreasedNotional: the amount of notional the user is decreasing by -// - baseAmtLimit: the user-specified limit on the base reserves -// -// returns: -// - updatedAMM: the updated AMM reserves -// - positionResp: updated position information -// - err: error -func (k Keeper) decreasePosition( - ctx sdk.Context, - market types.Market, - amm types.AMM, - currentPosition types.Position, - decreasedNotional sdk.Dec, - baseAmtLimit sdk.Dec, -) (updatedAMM *types.AMM, positionResp *types.PositionResp, err error) { - if currentPosition.Size_.IsZero() { - return nil, nil, fmt.Errorf("current position size is zero, nothing to decrease") - } - - trader, err := sdk.AccAddressFromBech32(currentPosition.TraderAddress) - if err != nil { - return nil, nil, err - } - - var dir types.Direction - if currentPosition.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - positionResp = &types.PositionResp{ - MarginToVault: sdk.ZeroDec(), - } - - currentPositionNotional, err := PositionNotionalSpot(amm, currentPosition) - if err != nil { - return nil, nil, err - } - currentUnrealizedPnl := UnrealizedPnl(currentPosition, currentPositionNotional) - - updatedAMM, baseAssetDeltaAbs, err := k.SwapQuoteAsset( - ctx, - amm, - dir, - decreasedNotional, - baseAmtLimit, - ) - if err != nil { - return nil, nil, err - } - - if dir == types.Direction_LONG { - positionResp.ExchangedPositionSize = baseAssetDeltaAbs - } else { - positionResp.ExchangedPositionSize = baseAssetDeltaAbs.Neg() - } - - positionResp.RealizedPnl = currentUnrealizedPnl.Mul( - positionResp.ExchangedPositionSize.Abs(). - Quo(currentPosition.Size_.Abs()), - ) - - fundingPayment := FundingPayment(currentPosition, market.LatestCumulativePremiumFraction) - remainingMargin := currentPosition.Margin.Add(positionResp.RealizedPnl).Sub(fundingPayment) - - positionResp.BadDebt = sdk.MinDec(sdk.ZeroDec(), remainingMargin).Abs() - positionResp.FundingPayment = fundingPayment - positionResp.UnrealizedPnlAfter = currentUnrealizedPnl.Sub(positionResp.RealizedPnl) - positionResp.ExchangedNotionalValue = decreasedNotional - positionResp.PositionNotional = currentPositionNotional.Sub(decreasedNotional) - - // calculate openNotional (it's different depends on long or short side) - // long: unrealizedPnl = positionNotional - openNotional => openNotional = positionNotional - unrealizedPnl - // short: unrealizedPnl = openNotional - positionNotional => openNotional = positionNotional + unrealizedPnl - // positionNotional = oldPositionNotional - notionalValueToDecrease - var remainOpenNotional sdk.Dec - if currentPosition.Size_.IsPositive() { - remainOpenNotional = positionResp.PositionNotional.Sub(positionResp.UnrealizedPnlAfter) - } else { - remainOpenNotional = positionResp.PositionNotional.Add(positionResp.UnrealizedPnlAfter) - } - - if remainOpenNotional.IsNegative() { - return nil, nil, fmt.Errorf("value of open notional < 0") - } - - positionResp.Position = types.Position{ - TraderAddress: currentPosition.TraderAddress, - Pair: currentPosition.Pair, - Size_: currentPosition.Size_.Add(positionResp.ExchangedPositionSize), - Margin: sdk.MaxDec(sdk.ZeroDec(), remainingMargin).Abs(), - OpenNotional: remainOpenNotional, - LatestCumulativePremiumFraction: market.LatestCumulativePremiumFraction, - LastUpdatedBlockNumber: ctx.BlockHeight(), - } - - if positionResp.Position.Size_.IsZero() { - err := k.Positions.Delete(ctx, collections.Join(collections.Join(currentPosition.Pair, amm.Version), trader)) - if err != nil { - return nil, nil, err - } - } - - return updatedAMM, positionResp, nil -} - -// Closes a position and realizes PnL and funding payments. -// Opens a position in the opposite direction if there is notional value remaining. -// Errors out if the provided notional value is not greater than the existing position's notional value. -// Errors out if there is bad debt. -// -// args: -// - ctx: cosmos-sdk context -// - market: the perp market -// - amm: the amm reserves -// - existingPosition: the existing position -// - quoteAssetAmount: the amount of quote asset to close -// - leverage: the leverage to open the new position with -// - baseAmtLimit: the user-specified limit on the base reserves -// -// returns: -// - updatedAMM: the updated AMM reserves -// - positionResp: updated position information -// - err: error -func (k Keeper) closeAndOpenReversePosition( - ctx sdk.Context, - market types.Market, - amm types.AMM, - existingPosition types.Position, - quoteAssetAmount sdk.Dec, - leverage sdk.Dec, - baseAmtLimit sdk.Dec, -) (updatedAMM *types.AMM, positionResp *types.PositionResp, err error) { - trader, err := sdk.AccAddressFromBech32(existingPosition.TraderAddress) - if err != nil { - return nil, nil, err - } - - updatedAMM, closePositionResp, err := k.closePositionEntirely( - ctx, - market, - amm, - existingPosition, - /* quoteAssetAmountLimit */ sdk.ZeroDec(), - ) - if err != nil { - return nil, nil, err - } - - if closePositionResp.BadDebt.IsPositive() { - // if there's already bad debt, then we don't allow the user to continue and just early return - return updatedAMM, closePositionResp, nil - } - - reverseNotionalValue := leverage.Mul(quoteAssetAmount) - remainingReverseNotionalValue := reverseNotionalValue.Sub( - closePositionResp.ExchangedNotionalValue) - if remainingReverseNotionalValue.IsNegative() { - // should never happen as openReversePosition should have checked this - return nil, nil, fmt.Errorf( - "provided quote asset amount and leverage not large enough to close position. need %s but got %s", - closePositionResp.ExchangedNotionalValue, reverseNotionalValue) - } - - var dir types.Direction - // flipped since we are going against the current position - if existingPosition.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - // check if it's worth continuing with the increase position - quoteReserveAmt := updatedAMM.QuoteAssetToReserve(remainingReverseNotionalValue) - possibleNextSize, err := updatedAMM.GetBaseReserveAmt(quoteReserveAmt, dir) - if err != nil { - return nil, nil, err - } - if possibleNextSize.IsZero() { - // nothing to do, early return - return updatedAMM, closePositionResp, nil - } - - if baseAmtLimit.IsPositive() { - baseAmtLimit = baseAmtLimit.Sub(closePositionResp.ExchangedPositionSize.Abs()) - } - if baseAmtLimit.IsNegative() { - return nil, nil, fmt.Errorf( - "position size changed by greater than the specified base limit: %s", - baseAmtLimit, - ) - } - - newPosition := types.ZeroPosition( - ctx, - existingPosition.Pair, - trader, - ) - updatedAMM, increasePositionResp, err := k.increasePosition( - ctx, - market, - *updatedAMM, - newPosition, - dir, - remainingReverseNotionalValue, - baseAmtLimit, - leverage, - ) - if err != nil { - return nil, nil, err - } - - positionResp = &types.PositionResp{ - Position: increasePositionResp.Position, - PositionNotional: increasePositionResp.PositionNotional, - ExchangedNotionalValue: closePositionResp.ExchangedNotionalValue.Add(increasePositionResp.ExchangedNotionalValue), - BadDebt: closePositionResp.BadDebt.Add(increasePositionResp.BadDebt), - ExchangedPositionSize: closePositionResp.ExchangedPositionSize.Add(increasePositionResp.ExchangedPositionSize), - FundingPayment: closePositionResp.FundingPayment.Add(increasePositionResp.FundingPayment), - RealizedPnl: closePositionResp.RealizedPnl.Add(increasePositionResp.RealizedPnl), - MarginToVault: closePositionResp.MarginToVault.Add(increasePositionResp.MarginToVault), - UnrealizedPnlAfter: sdk.ZeroDec(), - } - - return updatedAMM, positionResp, nil -} - -// checkMarketOrderRequirements checks the minimum requirements to open a position. -// -// - Checks that quote asset is not zero. -// - Checks that leverage is not zero. -// - Checks that leverage is below requirement. -// -// args: -// - market: the market where the position will be opened -// - quoteAssetAmt: the amount of quote asset -// - leverage: the amount of leverage to take, as sdk.Dec -// -// returns: -// - error: if any of the requirements is not met -func checkMarketOrderRequirements(market types.Market, quoteAssetAmt sdkmath.Int, userLeverage sdk.Dec) error { - if !quoteAssetAmt.IsPositive() { - return types.ErrInputQuoteAmtNegative - } - - if !userLeverage.IsPositive() { - return types.ErrUserLeverageNegative - } - - if userLeverage.GT(market.MaxLeverage) { - return types.ErrLeverageIsTooHigh - } - - return nil -} - -// afterPositionUpdate is called when a position has been updated. -func (k Keeper) afterPositionUpdate( - ctx sdk.Context, - market types.Market, - amm types.AMM, - traderAddr sdk.AccAddress, - positionResp types.PositionResp, - changeType types.ChangeReason, - existingPosition types.Position, -) (err error) { - // transfer trader <=> vault - marginToVault := positionResp.MarginToVault.RoundInt() - switch { - case marginToVault.IsPositive(): - coinToSend := sdk.NewCoin(market.Pair.QuoteDenom(), marginToVault) - if err = k.BankKeeper.SendCoinsFromAccountToModule( - ctx, traderAddr, types.VaultModuleAccount, sdk.NewCoins(coinToSend)); err != nil { - return err - } - case marginToVault.IsNegative(): - if err = k.WithdrawFromVault(ctx, market, traderAddr, marginToVault.Abs()); err != nil { - return err - } - } - - transferredFee, err := k.transferFee(ctx, market.Pair, traderAddr, positionResp.ExchangedNotionalValue, - market.ExchangeFeeRatio, market.EcosystemFundFeeRatio, - ) - if err != nil { - return err - } - - if !positionResp.Position.Size_.IsZero() { - k.SavePosition(ctx, market.Pair, market.Version, traderAddr, positionResp.Position) - } - - // calculate positionNotional (it's different depends on long or short side) - // long: unrealizedPnl = positionNotional - openNotional => positionNotional = openNotional + unrealizedPnl - // short: unrealizedPnl = openNotional - positionNotional => positionNotional = openNotional - unrealizedPnl - positionNotional := sdk.ZeroDec() - if positionResp.Position.Size_.IsPositive() { - positionNotional = positionResp.Position.OpenNotional.Add(positionResp.UnrealizedPnlAfter) - } else if positionResp.Position.Size_.IsNegative() { - positionNotional = positionResp.Position.OpenNotional.Sub(positionResp.UnrealizedPnlAfter) - } - - _ = ctx.EventManager().EmitTypedEvents( - &types.PositionChangedEvent{ - FinalPosition: positionResp.Position, - PositionNotional: positionNotional, - TransactionFee: sdk.NewCoin(market.Pair.QuoteDenom(), transferredFee), - RealizedPnl: positionResp.RealizedPnl, - BadDebt: sdk.NewCoin(market.Pair.QuoteDenom(), positionResp.BadDebt.RoundInt()), - FundingPayment: positionResp.FundingPayment, - BlockHeight: ctx.BlockHeight(), - MarginToUser: marginToVault.Neg().Sub(transferredFee), - ChangeReason: changeType, - ExchangedSize: positionResp.Position.Size_.Sub(existingPosition.Size_), - ExchangedNotional: positionResp.PositionNotional.Sub(existingPosition.OpenNotional), - }, - ) - - return nil -} - -// checkMarginRatio checks if the margin ratio of the position is below the liquidation threshold. -func (k Keeper) checkMarginRatio(ctx sdk.Context, market types.Market, amm types.AMM, position types.Position) (err error) { - spotNotional, err := PositionNotionalSpot(amm, position) - if err != nil { - return - } - twapNotional, err := k.PositionNotionalTWAP(ctx, position, market.TwapLookbackWindow) - if err != nil { - return - } - var preferredPositionNotional sdk.Dec - if position.Size_.IsPositive() { - preferredPositionNotional = sdk.MaxDec(spotNotional, twapNotional) - } else { - preferredPositionNotional = sdk.MinDec(spotNotional, twapNotional) - } - - marginRatio := MarginRatio(position, preferredPositionNotional, market.LatestCumulativePremiumFraction) - if marginRatio.LT(market.MaintenanceMarginRatio) { - return types.ErrMarginRatioTooLow.Wrapf("position margin ratio: %s, maintenance margin ratio: %s", marginRatio, market.MaintenanceMarginRatio) - } - return -} - -// transfers the fee to the exchange fee pool -// -// args: -// - ctx: the cosmos-sdk context -// - pair: the trading pair -// - trader: the trader's address -// - positionNotional: the position's notional value -// -// returns: -// - fees: the fees to be transferred -// - err: error if any -func (k Keeper) transferFee( - ctx sdk.Context, - pair asset.Pair, - trader sdk.AccAddress, - positionNotional sdk.Dec, - exchangeFeeRatio sdk.Dec, - ecosystemFundFeeRatio sdk.Dec, -) (fees sdkmath.Int, err error) { - exchangeFeeRatio, err = k.applyDiscountAndRebate(ctx, pair, trader, positionNotional, exchangeFeeRatio) - if err != nil { - return sdkmath.Int{}, err - } - feeToExchangeFeePool := exchangeFeeRatio.Mul(positionNotional).RoundInt() - if feeToExchangeFeePool.IsPositive() { - if err = k.BankKeeper.SendCoinsFromAccountToModule( - ctx, - /* from */ trader, - /* to */ types.FeePoolModuleAccount, - /* coins */ sdk.NewCoins( - sdk.NewCoin( - pair.QuoteDenom(), - feeToExchangeFeePool, - ), - ), - ); err != nil { - return sdkmath.Int{}, err - } - } - - feeToEcosystemFund := ecosystemFundFeeRatio.Mul(positionNotional).RoundInt() - if feeToEcosystemFund.IsPositive() { - if err = k.BankKeeper.SendCoinsFromAccountToModule( - ctx, - /* from */ trader, - /* to */ types.PerpEFModuleAccount, - /* coins */ sdk.NewCoins( - sdk.NewCoin( - pair.QuoteDenom(), - feeToEcosystemFund, - ), - ), - ); err != nil { - return sdkmath.Int{}, err - } - } - - return feeToExchangeFeePool.Add(feeToEcosystemFund), nil -} - -// ClosePosition closes a position entirely and transfers the remaining margin back to the user. -// Errors if the position has bad debt. -// -// args: -// - ctx: the cosmos-sdk context -// - pair: the pair of the position -// - traderAddr: the address of the trader -// -// returns: -// - positionResp: response object containing information about the position change -// - err: error if any -func (k Keeper) ClosePosition(ctx sdk.Context, pair asset.Pair, traderAddr sdk.AccAddress) (*types.PositionResp, error) { - market, err := k.GetMarket(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - - if !market.Enabled { - return nil, fmt.Errorf("%w: this position can be only closed by Settlement", types.ErrMarketNotEnabled) - } - - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - - position, err := k.GetPosition(ctx, pair, market.Version, traderAddr) - if err != nil { - return nil, err - } - - updatedAMM, positionResp, err := k.closePositionEntirely( - ctx, - market, - amm, - position, - /* quoteAssetAmountLimit */ sdk.ZeroDec(), - ) - if err != nil { - return nil, err - } - - if positionResp.BadDebt.IsPositive() { - if err = k.realizeBadDebt( - ctx, - market, - positionResp.BadDebt.RoundInt(), - ); err != nil { - return nil, err - } - } - - if err = k.afterPositionUpdate( - ctx, - market, - *updatedAMM, - traderAddr, - *positionResp, - types.ChangeReason_ClosePosition, - position, - ); err != nil { - return nil, err - } - - return positionResp, nil -} - -// Closes a position and realizes PnL and funding payments. -// Does not error out if there is bad debt, that is for callers to decide. -// -// args: -// - ctx: cosmos-sdk context -// - market: the perp market -// - amm: the amm reserves -// - currentPosition: the existing position -// - quoteAssetAmountLimit: the user-specified limit on the quote asset reserves -// -// returns: -// - updatedAMM: updated AMM reserves -// - positionResp: response object containing information about the position change -// - err: error -func (k Keeper) closePositionEntirely( - ctx sdk.Context, - market types.Market, - amm types.AMM, - currentPosition types.Position, - quoteAssetAmountLimit sdk.Dec, -) (updatedAMM *types.AMM, resp *types.PositionResp, err error) { - if currentPosition.Size_.IsZero() { - return nil, nil, fmt.Errorf("zero position size") - } - positionNotional, err := PositionNotionalSpot(amm, currentPosition) - if err != nil { - return nil, nil, err - } - - trader, err := sdk.AccAddressFromBech32(currentPosition.TraderAddress) - if err != nil { - return nil, nil, err - } - - resp = &types.PositionResp{ - ExchangedPositionSize: currentPosition.Size_.Neg(), - PositionNotional: sdk.ZeroDec(), - FundingPayment: FundingPayment(currentPosition, market.LatestCumulativePremiumFraction), - RealizedPnl: UnrealizedPnl(currentPosition, positionNotional), - UnrealizedPnlAfter: sdk.ZeroDec(), - } - - remainingMargin := currentPosition.Margin.Add(resp.RealizedPnl).Sub(resp.FundingPayment) - - if remainingMargin.IsPositive() { - resp.BadDebt = sdk.ZeroDec() - resp.MarginToVault = remainingMargin.Neg() - } else { - resp.BadDebt = remainingMargin.Abs() - resp.MarginToVault = sdk.ZeroDec() - } - - var dir types.Direction - // flipped since we are going against the current position - if currentPosition.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - updatedAMM, exchangedNotionalValue, err := k.SwapBaseAsset( - ctx, - amm, - dir, - currentPosition.Size_.Abs(), - quoteAssetAmountLimit, - ) - if err != nil { - return nil, nil, err - } - - resp.ExchangedNotionalValue = exchangedNotionalValue - resp.Position = types.Position{ - TraderAddress: currentPosition.TraderAddress, - Pair: currentPosition.Pair, - Size_: sdk.ZeroDec(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - LatestCumulativePremiumFraction: market.LatestCumulativePremiumFraction, - LastUpdatedBlockNumber: ctx.BlockHeight(), - } - - err = k.DeletePosition(ctx, currentPosition.Pair, market.Version, trader) - if err != nil { - return nil, nil, err - } - - return updatedAMM, resp, nil -} - -func (k Keeper) PartialClose( - ctx sdk.Context, - pair asset.Pair, - traderAddr sdk.AccAddress, - sizeAmt sdk.Dec, // unsigned -) (*types.PositionResp, error) { - market, err := k.GetMarket(ctx, pair) - if err != nil { - return nil, types.ErrPairNotFound.Wrapf("pair: %s", pair) - } - - if !market.Enabled { - return nil, fmt.Errorf("%w: this position can be only closed by Settlement", types.ErrMarketNotEnabled) - } - - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return nil, types.ErrPairNotFound.Wrapf("pair: %s", pair) - } - - position, err := k.GetPosition(ctx, pair, market.Version, traderAddr) - if err != nil { - return nil, err - } - - if position.Size_.IsZero() { - return nil, fmt.Errorf("zero position size") - } - - if sizeAmt.Abs().GT(position.Size_.Abs()) { - return nil, fmt.Errorf("position size is smaller than the amount to close") - } - - var dir types.Direction - if position.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - reverseNotionalAmt, err := amm.GetQuoteReserveAmt(sizeAmt.Abs(), dir) - if err != nil { - return nil, err - } - reverseNotionalAmt = amm.QuoteReserveToAsset(reverseNotionalAmt) - - updatedAMM, positionResp, err := k.decreasePosition(ctx, market, amm, position, reverseNotionalAmt, sdk.ZeroDec()) - if err != nil { - return nil, err - } - - if positionResp.BadDebt.IsPositive() { - if err = k.realizeBadDebt( - ctx, - market, - positionResp.BadDebt.RoundInt(), - ); err != nil { - return nil, err - } - } - - err = k.afterPositionUpdate( - ctx, - market, - *updatedAMM, - traderAddr, - *positionResp, - types.ChangeReason_PartialClose, - position, - ) - if err != nil { - return nil, err - } - - return positionResp, nil -} diff --git a/x/perp/v2/keeper/clearing_house_test.go b/x/perp/v2/keeper/clearing_house_test.go deleted file mode 100644 index 93b034732..000000000 --- a/x/perp/v2/keeper/clearing_house_test.go +++ /dev/null @@ -1,2104 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdkmath "cosmossdk.io/math" - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestMarketOrder(t *testing.T) { - alice := testutil.AccAddress() - bob := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - startBlockTime := time.Now() - - tc := TestCases{ - TC("open big short position and then close after reducing swap invariant"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200)))), - FundAccount(bob, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(bob, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - - EditSwapInvariant(pairBtcNusd, sdk.OneDec()), - ). - When( - PartialCloseFails(alice, pairBtcNusd, sdk.NewDec(5_000), types.ErrBaseReserveAtZero), - ). - Then( - ClosePosition(bob, pairBtcNusd), - PartialClose(alice, pairBtcNusd, sdk.NewDec(5_000)), - ), - - TC("new long position"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1020)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("9999.999900000001"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(10_000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("9999.999900000001")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(10_000)), - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("9999.999900000001"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("9999.999900000001"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(10_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), - BlockHeight: 1, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 20).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("9999.999900000001000000"), - }), - ), - - TC("existing long position, go more long"). - Given( - SetBlockNumber(1), - SetBlockTime(startBlockTime), - CreateCustomMarket(pairBtcNusd), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(2040)))), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20_000), - Size_: sdk.MustNewDecFromStr("19999.999600000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(10_000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("9999.999700000007000000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(20_000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20_000), - Size_: sdk.MustNewDecFromStr("19999.999600000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(20_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 20).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("9999.999700000007000000"), - }), - ), - - TC("existing long position, go more long but there's bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.89")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarginRatioTooLow, - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.NewDec(10_000), - Margin: sdk.NewDec(1_000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - })), - ), - - TC("existing long position, close a bit but there's bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.89")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrderFails(alice, pairBtcNusd, types.Direction_SHORT, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarginRatioTooLow, - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.NewDec(10_000), - Margin: sdk.NewDec(1_000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - })), - ), - - TC("open big long position and then close after reducing swap invariant"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_000)))), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(9_000), sdk.NewDec(10), sdk.ZeroDec()), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - EditSwapInvariant(pairBtcNusd, sdk.OneDec()), - ). - When( - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("existing long position, decrease a bit"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1030)))), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(500), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(5000), - Size_: sdk.MustNewDecFromStr("4999.999975000000125000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(5000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("-4999.999925000000875000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(5000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(5000), - Size_: sdk.MustNewDecFromStr("4999.999975000000125000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(5000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(0 + 10).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("-5000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-4999.999925000000875000"), - }), - ), - - TC("existing long position, decrease a bit but there's bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.89")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarginRatioTooLow, - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.NewDec(10_000), - Margin: sdk.NewDec(1_000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - })), - ), - - TC("existing long position, decrease a lot"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(4080)))), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(3000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20000), - Size_: sdk.MustNewDecFromStr("-20000.000400000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(30000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("-30000.000300000009000000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(20000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20000), - Size_: sdk.MustNewDecFromStr("-20000.000400000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(20000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(60)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 60).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-30000.000300000009000000"), - }), - ), - - TC("existing long position, decrease a lot but there's bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.89")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(3000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.MustNewDecFromStr("8899.999911000000890000")), - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("-10000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.MustNewDecFromStr("102.000088999999110000")), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.NewDec(2)), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.MustNewDecFromStr("-1100.000088999999110000")), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.ZeroDec()), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("-1100.000088999999110000"), - BadDebt: sdk.NewInt64Coin(denoms.NUSD, 102), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewInt64Coin(denoms.NUSD, 18), // 20 bps - BlockHeight: 2, - MarginToUser: sdk.NewInt(-18), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000000000000000000"), - }), - ), - - TC("new short position"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1020)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("-10000.000100000001000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(10_000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("-10000.000100000001000000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(10_000)), - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, - Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("-10000.000100000001000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }), - ), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - Size_: sdk.MustNewDecFromStr("-10000.000100000001000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(10_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), - BlockHeight: 1, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 20).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000100000001000000"), - }), - ), - - TC("existing short position, go more short"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(2040)))), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20_000), - Size_: sdk.MustNewDecFromStr("-20000.000400000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(10_000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("-10000.000300000007000000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(20_000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20_000), - Size_: sdk.MustNewDecFromStr("-20000.000400000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(20_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 20).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000300000007000000"), - }), - ), - - TC("existing short position, go more short but there's bad debt"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.11")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(22)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(-10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrderFails(alice, pairBtcNusd, types.Direction_SHORT, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarginRatioTooLow, - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.NewDec(-10_000), - Margin: sdk.NewDec(1_000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - })), - ), - - TC("existing short position, decrease a bit"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1030)))), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(500), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(5000), - Size_: sdk.MustNewDecFromStr("-5000.000025000000125000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(5000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("5000.000075000000875000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(5000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(5000), - Size_: sdk.MustNewDecFromStr("-5000.000025000000125000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(5000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(0 + 10).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("-5000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("5000.000075000000875000"), - }), - ), - - TC("existing short position, decrease a bit but there's bad debt"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.11")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(22)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(-10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarginRatioTooLow, - ), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.NewDec(-10_000), - Margin: sdk.NewDec(1_000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - })), - ), - - TC("existing short position, decrease a lot"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(4080)))), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(3000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20000), - Size_: sdk.MustNewDecFromStr("19999.999600000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.NewDec(30000)), // margin * leverage - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("29999.999700000009000000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.NewDec(1000)), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.NewDec(20000)), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(20000), - Size_: sdk.MustNewDecFromStr("19999.999600000008000000"), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - }, - PositionNotional: sdk.NewDec(20000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(60)), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(1_000 + 60).Neg(), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("29999.999700000009000000"), - }), - ), - - TC("existing short position, decrease a lot but there's bad debt"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.11")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(22)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithMargin(sdk.NewDec(1_000)), - WithSize(sdk.NewDec(-10_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - MoveToNextBlock(), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(3000), sdk.NewDec(10), sdk.ZeroDec(), - MarketOrderResp_PositionShouldBeEqual( - types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - ), - MarketOrderResp_ExchangeNotionalValueShouldBeEqual(sdk.MustNewDecFromStr("11100.000111000001110000")), - MarketOrderResp_ExchangedPositionSizeShouldBeEqual(sdk.MustNewDecFromStr("10000")), - MarketOrderResp_BadDebtShouldBeEqual(sdk.MustNewDecFromStr("98.000111000001110000")), - MarketOrderResp_FundingPaymentShouldBeEqual(sdk.NewDec(-2)), - MarketOrderResp_RealizedPnlShouldBeEqual(sdk.MustNewDecFromStr("-1100.000111000001110000")), - MarketOrderResp_UnrealizedPnlAfterShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_MarginToVaultShouldBeEqual(sdk.ZeroDec()), - MarketOrderResp_PositionNotionalShouldBeEqual(sdk.ZeroDec()), - ), - ). - Then( - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("-1100.000111000001110000"), - BadDebt: sdk.NewInt64Coin(denoms.NUSD, 98), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewInt64Coin(denoms.NUSD, 22), // 20 bps - BlockHeight: 2, - // exchangedMargin = - marginToVault - transferredFee - MarginToUser: sdk.NewInt(-22), - ChangeReason: types.ChangeReason_MarketOrder, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("10000.000000000000000000"), - }), - ), - - TC("user has insufficient funds"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(99)))), - ). - When( - MarketOrderFails( - alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(100), sdk.OneDec(), sdk.ZeroDec(), - sdkerrors.ErrInsufficientFunds), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("new long position, can not open new position after market is not enabled"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(47_714_285_715)))), - CloseMarket(pairBtcNusd), - ). - When( - MarketOrderFails(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(47_619_047_619), sdk.OneDec(), sdk.ZeroDec(), - types.ErrMarketNotEnabled), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("market doesn't exist"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(47_714_285_715)))), - ). - When( - MarketOrderFails(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(47_619_047_619), sdk.OneDec(), sdk.ZeroDec(), - types.ErrPairNotFound), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("zero quote asset amount"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(47_714_285_715)))), - ). - When( - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.ZeroInt(), sdk.OneDec(), sdk.ZeroDec(), - types.ErrInputQuoteAmtNegative), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("zero leverage"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.OneInt(), sdk.ZeroDec(), sdk.ZeroDec(), - types.ErrUserLeverageNegative), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("user leverage greater than market max leverage"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrderFails(alice, pairBtcNusd, types.Direction_LONG, sdk.OneInt(), sdk.NewDec(11), sdk.ZeroDec(), - types.ErrLeverageIsTooHigh), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("position should not exist after opening a closing manually"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd, WithPricePeg(sdk.MustNewDecFromStr("25001.0112"))), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20_000_000_000+20_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("position should not exist after opening a closing manually - reverse with leverage"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd, WithPricePeg(sdk.MustNewDecFromStr("25001.0112"))), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(100_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(50_000), sdk.NewDec(2), sdk.ZeroDec()), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - TC("position should not exist after opening a closing manually - open with leverage"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd, WithPricePeg(sdk.MustNewDecFromStr("25001.0112"))), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(50_000), sdk.NewDec(2), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(100_000), sdk.OneDec(), sdk.ZeroDec()), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("position should not exist after opening a closing manually - reverse with leverage"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd, WithPricePeg(sdk.MustNewDecFromStr("25001.0112"))), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(100_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(50_000), sdk.NewDec(2), sdk.ZeroDec()), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - - TC("position should not exist after opening a closing manually - reverse with leverage - more steps"). - Given( - SetBlockTime(startBlockTime), - SetBlockNumber(1), - CreateCustomMarket(pairBtcNusd, WithPricePeg(sdk.MustNewDecFromStr("25000"))), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(100_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(50_000), sdk.NewDec(4), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(50_000), sdk.NewDec(2), sdk.ZeroDec()), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestMarketOrderError(t *testing.T) { - testCases := []struct { - name string - traderFunds sdk.Coins - - initialPosition *types.Position - - // position arguments - side types.Direction - margin sdkmath.Int - leverage sdk.Dec - baseLimit sdk.Dec - - expectedErr error - }{ - { - name: "not enough trader funds", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 999)), - initialPosition: nil, - side: types.Direction_LONG, - margin: sdk.NewInt(1000), - leverage: sdk.NewDec(10), - baseLimit: sdk.ZeroDec(), - expectedErr: sdkerrors.ErrInsufficientFunds, - }, - { - name: "position has bad debt", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 999)), - initialPosition: &types.Position{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - Size_: sdk.OneDec(), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10_000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - }, - side: types.Direction_LONG, - margin: sdk.OneInt(), - leverage: sdk.OneDec(), - baseLimit: sdk.ZeroDec(), - expectedErr: types.ErrMarginRatioTooLow, - }, - { - name: "new long position not over base limit", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_LONG, - margin: sdk.NewInt(1000), - leverage: sdk.NewDec(10), - baseLimit: sdk.NewDec(10_000), - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "new short position not under base limit", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_SHORT, - margin: sdk.NewInt(1000), - leverage: sdk.NewDec(10), - baseLimit: sdk.NewDec(10_000), - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "quote asset amount is zero", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_SHORT, - margin: sdk.ZeroInt(), - leverage: sdk.NewDec(10), - baseLimit: sdk.NewDec(10_000), - expectedErr: types.ErrInputQuoteAmtNegative, - }, - { - name: "leverage amount is zero", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_SHORT, - margin: sdk.NewInt(1000), - leverage: sdk.ZeroDec(), - baseLimit: sdk.NewDec(10_000), - expectedErr: types.ErrUserLeverageNegative, - }, - { - name: "leverage amount is too high - SELL", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_SHORT, - margin: sdk.NewInt(100), - leverage: sdk.NewDec(100), - baseLimit: sdk.NewDec(11_000), - expectedErr: types.ErrLeverageIsTooHigh, - }, - { - name: "leverage amount is too high - BUY", - traderFunds: sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1020)), - initialPosition: nil, - side: types.Direction_LONG, - margin: sdk.NewInt(100), - leverage: sdk.NewDec(16), - baseLimit: sdk.ZeroDec(), - expectedErr: types.ErrLeverageIsTooHigh, - }, - } - - for _, testCase := range testCases { - tc := testCase - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - traderAddr := testutil.AccAddress() - - market := mock.TestMarket() - app.PerpKeeperV2.SaveMarket(ctx, *market) - app.PerpKeeperV2.MarketLastVersion.Insert(ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), types.MarketLastVersion{Version: market.Version}) - amm := mock.TestAMMDefault() - app.PerpKeeperV2.SaveAMM(ctx, *amm) - app.PerpKeeperV2.ReserveSnapshots.Insert(ctx, collections.Join(amm.Pair, ctx.BlockTime()), types.ReserveSnapshot{ - Amm: *amm, - TimestampMs: ctx.BlockTime().UnixMilli(), - }) - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, traderAddr, tc.traderFunds)) - - if tc.initialPosition != nil { - tc.initialPosition.TraderAddress = traderAddr.String() - app.PerpKeeperV2.SavePosition(ctx, tc.initialPosition.Pair, 1, traderAddr, *tc.initialPosition) - } - - ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1).WithBlockTime(ctx.BlockTime().Add(time.Second * 5)) - resp, err := app.PerpKeeperV2.MarketOrder(ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), tc.side, traderAddr, tc.margin, tc.leverage, tc.baseLimit) - require.ErrorContains(t, err, tc.expectedErr.Error()) - require.Nil(t, resp) - }) - } -} - -func TestPartialClose(t *testing.T) { - alice := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - startBlockTime := time.Now() - - tc := TestCases{ - TC("partial close long position with positive PnL"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.NewDec(2)), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(2_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("3497.999950000000500000"), - OpenNotional: sdk.MustNewDecFromStr("7499.999962500000468750"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("3497.999950000000500000"), - OpenNotional: sdk.MustNewDecFromStr("7499.999962500000468750"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("14999.999812500001968750"), - RealizedPnl: sdk.MustNewDecFromStr("2499.999950000000500000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-10), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("4999.999812500001968750"), - ExchangedSize: sdk.MustNewDecFromStr("-2500.000000000000000000"), - }), - ), - - TC("partial close long position with negative PnL"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.95")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(4)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(2_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("872.999976250000237500"), - OpenNotional: sdk.MustNewDecFromStr("7499.999982187500222656"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("872.999976250000237500"), - OpenNotional: sdk.MustNewDecFromStr("7499.999982187500222656"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("7124.999910937500935156"), - RealizedPnl: sdk.MustNewDecFromStr("-125.000023749999762500"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(4)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-4), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-2875.000089062499064844"), - ExchangedSize: sdk.MustNewDecFromStr("-2500.000000000000000000"), - }), - ), - - TC("partial close long position without bad debt but below maintenance margin ratio"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.94")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(4)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(2_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("847.999976500000235000"), - OpenNotional: sdk.MustNewDecFromStr("7499.999982375000220312"), - Size_: sdk.MustNewDecFromStr("7499.999999999999999999"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("847.999976500000235000"), - OpenNotional: sdk.MustNewDecFromStr("7499.999982375000220312"), - Size_: sdk.MustNewDecFromStr("7499.999999999999999999"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("7049.999911875000925312"), - RealizedPnl: sdk.MustNewDecFromStr("-150.000023499999765000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(4)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-4), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-2950.000088124999074688"), - ExchangedSize: sdk.MustNewDecFromStr("-2500.000000000000000001"), - })), - - TC("partial close long position with bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.59")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 2))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 27))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(2_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.MustNewDecFromStr("7499.999988937500138281"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.MustNewDecFromStr("7499.999988937500138281"), - Size_: sdk.MustNewDecFromStr("7500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("4424.999944687500580781"), - RealizedPnl: sdk.MustNewDecFromStr("-1025.000014749999852500"), - BadDebt: sdk.NewInt64Coin(denoms.NUSD, 27), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewInt64Coin(denoms.NUSD, 2), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-2), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-5575.000055312499419219"), - ExchangedSize: sdk.MustNewDecFromStr("-2500.000000000000000000"), - })), - - TC("partial close short position with positive PnL"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.10")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(2)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(7_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("7751.999992499999925000"), - OpenNotional: sdk.MustNewDecFromStr("2500.000001875000032812"), - Size_: sdk.MustNewDecFromStr("-2499.999999999999999995"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("7751.999992499999925000"), - OpenNotional: sdk.MustNewDecFromStr("2500.000001875000032812"), - Size_: sdk.MustNewDecFromStr("-2499.999999999999999995"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("250.000004375000057812"), - RealizedPnl: sdk.MustNewDecFromStr("6749.999992499999925000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(2)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-2), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-9749.999995624999942188"), - ExchangedSize: sdk.MustNewDecFromStr("7500.000000000000000005"), - }), - ), - - TC("partial close short position with negative PnL"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.05")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(16)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(7_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("626.999921249999212500"), - OpenNotional: sdk.MustNewDecFromStr("2500.000019687500344531"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("626.999921249999212500"), - OpenNotional: sdk.MustNewDecFromStr("2500.000019687500344531"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("2625.000045937500607031"), - RealizedPnl: sdk.MustNewDecFromStr("-375.000078750000787500"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(16)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-16), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-7374.999954062499392969"), - ExchangedSize: sdk.MustNewDecFromStr("7500.000000000000000000"), - }), - ), - - TC("partial close short position with no bad debt but below maintenance margin ratio"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.09")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(16)))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(7_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("326.999918249999182500"), - OpenNotional: sdk.MustNewDecFromStr("2500.000020437500357656"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.MustNewDecFromStr("326.999918249999182500"), - OpenNotional: sdk.MustNewDecFromStr("2500.000020437500357656"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("2725.000047687500630156"), - RealizedPnl: sdk.MustNewDecFromStr("-675.000081750000817500"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(16)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-16), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-7274.999952312499369844"), - ExchangedSize: sdk.MustNewDecFromStr("7500.000000000000000000"), - }), - ), - - TC("partial close short position with bad debt"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.14")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 48))), - InsertPosition( - WithPair(pairBtcNusd), - WithTrader(alice), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - PartialClose(alice, pairBtcNusd, sdk.NewDec(7_500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcNusd, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.MustNewDecFromStr("2500.000021375000374062"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.MustNewDecFromStr("2500.000021375000374062"), - Size_: sdk.MustNewDecFromStr("-2500.000000000000000000"), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.MustNewDecFromStr("2850.000049875000659062"), - RealizedPnl: sdk.MustNewDecFromStr("-1050.000085500000855000"), - BadDebt: sdk.NewInt64Coin(denoms.NUSD, 48), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(18)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(-18), - ChangeReason: types.ChangeReason_PartialClose, - ExchangedNotional: sdk.MustNewDecFromStr("-7149.999950124999340938"), - ExchangedSize: sdk.MustNewDecFromStr("7500.000000000000000000"), - }), - ), - TC("test partial closes fail"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(10_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200)))), - - PartialCloseFails(alice, pairBtcNusd, sdk.NewDec(5_000), types.ErrPositionNotFound), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(9_000), sdk.OneDec(), sdk.ZeroDec()), - ). - When( - PartialCloseFails(alice, asset.MustNewPair("luna:usdt"), sdk.NewDec(5_000), types.ErrPairNotFound), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestClosePosition(t *testing.T) { - alice := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - startBlockTime := time.Now() - - tc := TestCases{ - TC("close long position with positive PnL"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.NewDec(2)), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(40)))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 10_998))), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("9999.999800000002000000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(40)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(10_958), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000000000000000000"), - }), - ), - - TC("close long position with negative PnL"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.99")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 898))), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("-100.000098999999010000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(878), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000000000000000000"), - }), - ), - - TC("close long position with bad debt"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.89")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 18))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1000))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 102))), - ). - When( - MoveToNextBlock(), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.ZeroDec(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.ZeroDec(), - TransactionFee: sdk.NewInt64Coin(denoms.NUSD, 18), - RealizedPnl: sdk.MustNewDecFromStr("-1100.000088999999110000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.NewInt(102)), - FundingPayment: sdk.NewDec(2), - BlockHeight: 2, - MarginToUser: sdk.NewInt(-18), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("-10000.000000000000000000"), - }), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1102)), // 1000 + 102 from perp ef - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(9)), - ), - - TC("close short position with positive PnL"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("0.10")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(2)))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 10_002))), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("8999.999989999999900000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(2)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(10_000), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("10000.000000000000000000"), - }), - ), - - TC("close short position with negative PnL"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.01")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 902))), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - ). - When( - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcNusd, - TraderAddress: alice.String(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - Size_: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - }, - PositionNotional: sdk.ZeroDec(), - RealizedPnl: sdk.MustNewDecFromStr("-100.000101000001010000"), - BadDebt: sdk.NewCoin(denoms.NUSD, sdk.ZeroInt()), - FundingPayment: sdk.NewDec(-2), - TransactionFee: sdk.NewCoin(denoms.NUSD, sdk.NewInt(20)), - BlockHeight: 1, - MarginToUser: sdk.NewInt(882), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("10000.000000000000000000"), - }), - ), - - TC("close short position with bad debt"). - Given( - CreateCustomMarket(pairBtcNusd, - WithPricePeg(sdk.MustNewDecFromStr("1.11")), - WithLatestMarketCPF(sdk.MustNewDecFromStr("0.0002")), - ), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - InsertPosition( - WithTrader(alice), - WithPair(pairBtcNusd), - WithSize(sdk.NewDec(-10_000)), - WithMargin(sdk.NewDec(1_000)), - WithOpenNotional(sdk.NewDec(10_000)), - ), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 22))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 1000))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 98))), - ). - When( - MoveToNextBlock(), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - TraderAddress: alice.String(), - Pair: pairBtcNusd, - Size_: sdk.ZeroDec(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - LatestCumulativePremiumFraction: sdk.MustNewDecFromStr("0.0002"), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.ZeroDec(), - TransactionFee: sdk.NewInt64Coin(denoms.NUSD, 22), - RealizedPnl: sdk.MustNewDecFromStr("-1100.000111000001110000"), - BadDebt: sdk.NewInt64Coin(denoms.NUSD, 98), - FundingPayment: sdk.NewDec(-2), - BlockHeight: 2, - MarginToUser: sdk.NewInt(-22), - ChangeReason: types.ChangeReason_ClosePosition, - ExchangedNotional: sdk.MustNewDecFromStr("-10000.000000000000000000"), - ExchangedSize: sdk.MustNewDecFromStr("10000.000000000000000000"), - }), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.NUSD, sdk.NewInt(1098)), // 1000 + 98 from perp ef - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(11)), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestUpdateSwapInvariant(t *testing.T) { - alice := testutil.AccAddress() - bob := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - startBlockTime := time.Now() - - startingSwapInvariant := sdk.NewDec(1_000_000_000_000).Mul(sdk.NewDec(1_000_000_000_000)) - - tc := TestCases{ - TC("only long position - no change to swap invariant"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - TC("only short position - no change to swap invariant"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.NewDec(10_000_000_000_000)), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ), - TC("only long position - increasing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.MulInt64(100)), - AMMShouldBeEqual( - pairBtcNusd, - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("99999999999999999999999999.999999000000000000"))), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins()), - ), - TC("only short position - increasing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.MulInt64(100)), - AMMShouldBeEqual( - pairBtcNusd, - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("99999999999999999999999999.999999000000000000"))), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.OneInt()))), - ), - - TC("only long position - decreasing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.Mul(sdk.MustNewDecFromStr("0.1"))), - AMMShouldBeEqual( - pairBtcNusd, - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("99999999999999999873578.871987715651277660"))), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins()), - ), - TC("only short position - decreasing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.Mul(sdk.MustNewDecFromStr("0.1"))), - AMMShouldBeEqual( - pairBtcNusd, - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("99999999999999999873578.871987801032774485"))), - ClosePosition(alice, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins()), - ), - - TC("long and short position - increasing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundAccount(bob, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(bob, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.NewDec(10_000_000_000_000)), - - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.MulInt64(100)), - AMMShouldBeEqual( - pairBtcNusd, - AMM_BiasShouldBeEqual(sdk.ZeroDec()), - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("100000000000000000000000000.000000000000000000"))), - - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20_000_000_000)))), - ModuleBalanceShouldBeEqualTo(types.FeePoolModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20_000_000)))), // Fees are 10_000_000_000 * 0.0010 * 2 - - ClosePosition(alice, pairBtcNusd), - ClosePosition(bob, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionShouldNotExist(bob, pairBtcNusd), - - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins()), - ModuleBalanceShouldBeEqualTo(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(39_782_394)))), - ), - TC("long and short position - reducing k"). - Given( - CreateCustomMarket(pairBtcNusd), - SetBlockTime(startBlockTime), - SetBlockNumber(1), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - FundAccount(bob, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(bob, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000_000_000), sdk.OneDec(), sdk.NewDec(10_000_000_000_000)), - - EditSwapInvariant(pairBtcNusd, startingSwapInvariant.Mul(sdk.MustNewDecFromStr("0.1"))), - AMMShouldBeEqual( - pairBtcNusd, - AMM_BiasShouldBeEqual(sdk.ZeroDec()), - AMM_SwapInvariantShouldBeEqual(sdk.MustNewDecFromStr("99999999999999999873578.871987712489000000"))), - - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20_000_000_000)))), - ModuleBalanceShouldBeEqualTo(types.FeePoolModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(20_000_000)))), // Fees are 10_000_000_000 * 0.0010 * 2 - - ClosePosition(alice, pairBtcNusd), - ClosePosition(bob, pairBtcNusd), - ). - Then( - PositionShouldNotExist(alice, pairBtcNusd), - PositionShouldNotExist(bob, pairBtcNusd), - - ModuleBalanceShouldBeEqualTo(types.VaultModuleAccount, sdk.NewCoins()), - ModuleBalanceShouldBeEqualTo(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(39_200_810)))), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/keeper/dnr.go b/x/perp/v2/keeper/dnr.go deleted file mode 100644 index 599a0a8f9..000000000 --- a/x/perp/v2/keeper/dnr.go +++ /dev/null @@ -1,174 +0,0 @@ -package keeper - -import ( - "math/big" - - "cosmossdk.io/math" - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -// DnRGCFrequency is the frequency at which the DnR garbage collector runs. -const DnRGCFrequency = 1000 - -// IntValueEncoder instructs collections on how to encode a math.Int as a value. -// TODO: move to collections. -var IntValueEncoder collections.ValueEncoder[math.Int] = intValueEncoder{} - -// IntKeyEncoder instructs collections on how to encode a math.Int as a key. -// NOTE: unsafe to use as the first part of a composite key. -var IntKeyEncoder collections.KeyEncoder[math.Int] = intKeyEncoder{} - -type intValueEncoder struct{} - -func (intValueEncoder) Encode(value math.Int) []byte { - return IntKeyEncoder.Encode(value) -} - -func (intValueEncoder) Decode(b []byte) math.Int { - _, got := IntKeyEncoder.Decode(b) - return got -} - -func (intValueEncoder) Stringify(value math.Int) string { - return IntKeyEncoder.Stringify(value) -} - -func (intValueEncoder) Name() string { - return "math.Int" -} - -type intKeyEncoder struct{} - -const maxIntKeyLen = math.MaxBitLen / 8 - -func (intKeyEncoder) Encode(key math.Int) []byte { - if key.IsNil() { - panic("cannot encode invalid math.Int") - } - if key.IsNegative() { - panic("cannot encode negative math.Int") - } - i := key.BigInt() - - be := i.Bytes() - padded := make([]byte, maxIntKeyLen) - copy(padded[maxIntKeyLen-len(be):], be) - return padded -} - -func (intKeyEncoder) Decode(b []byte) (int, math.Int) { - if len(b) != maxIntKeyLen { - panic("invalid key length") - } - i := new(big.Int).SetBytes(b) - return maxIntKeyLen, math.NewIntFromBigInt(i) -} - -func (intKeyEncoder) Stringify(key math.Int) string { return key.String() } - -// IncreaseTraderVolume adds the volume to the user's volume for the current epoch. -func (k Keeper) IncreaseTraderVolume(ctx sdk.Context, currentEpoch uint64, user sdk.AccAddress, volume math.Int) { - currentVolume := k.TraderVolumes.GetOr(ctx, collections.Join(user, currentEpoch), math.ZeroInt()) - newVolume := currentVolume.Add(volume) - k.TraderVolumes.Insert(ctx, collections.Join(user, currentEpoch), newVolume) - k.gcUserVolume(ctx, user, currentEpoch) -} - -// gcUserVolume deletes the un-needed user epochs. -func (k Keeper) gcUserVolume(ctx sdk.Context, user sdk.AccAddress, currentEpoch uint64) { - // we do not want to do this always. - if ctx.BlockHeight()%DnRGCFrequency != 0 { - return - } - - rng := collections.PairRange[sdk.AccAddress, uint64]{}. - Prefix(user). // only iterate over the user's epochs. - EndExclusive(currentEpoch - 1). // we want to preserve current and last epoch, as it's needed to compute DnR rewards. - Descending() - - for _, key := range k.TraderVolumes.Iterate(ctx, rng).Keys() { - err := k.TraderVolumes.Delete(ctx, key) - if err != nil { - panic(err) - } - } -} - -// GetTraderVolumeLastEpoch returns the user's volume for the last epoch. -// Returns zero if the user has no volume for the last epoch. -func (k Keeper) GetTraderVolumeLastEpoch(ctx sdk.Context, currentEpoch uint64, user sdk.AccAddress) math.Int { - // if it's the first epoch, we do not have any user volume. - if currentEpoch == 0 { - return math.ZeroInt() - } - // return the user's volume for the last epoch, or zero. - return k.TraderVolumes.GetOr(ctx, collections.Join(user, currentEpoch-1), math.ZeroInt()) -} - -// GetTraderDiscount will check if the trader has a custom discount for the given volume. -// If it does not have a custom discount, it will return the global discount for the given volume. -// The discount is the nearest left entry of the trader volume. -func (k Keeper) GetTraderDiscount(ctx sdk.Context, trader sdk.AccAddress, volume math.Int) (math.LegacyDec, bool) { - // we try to see if the trader has a custom discount. - customDiscountRng := collections.PairRange[sdk.AccAddress, math.Int]{}. - Prefix(trader). - EndInclusive(volume). - Descending() - - customDiscount := k.TraderDiscounts.Iterate(ctx, customDiscountRng) - defer customDiscount.Close() - - if customDiscount.Valid() { - return customDiscount.Value(), true - } - - // if it does not have a custom discount we try with global ones - globalDiscountRng := collections.Range[math.Int]{}. - EndInclusive(volume). - Descending() - - globalDiscounts := k.GlobalDiscounts.Iterate(ctx, globalDiscountRng) - defer globalDiscounts.Close() - - if globalDiscounts.Valid() { - return globalDiscounts.Value(), true - } - return math.LegacyZeroDec(), false -} - -// applyDiscountAndRebate applies the discount and rebate to the given exchange fee ratio. -// It updates the current epoch trader volume. -// It returns the new exchange fee ratio. -func (k Keeper) applyDiscountAndRebate( - ctx sdk.Context, - _ asset.Pair, - trader sdk.AccAddress, - positionNotional math.LegacyDec, - feeRatio sdk.Dec, -) (sdk.Dec, error) { - // update user volume - dnrEpoch, err := k.DnREpoch.Get(ctx) - if err != nil { - return feeRatio, err - } - k.IncreaseTraderVolume(ctx, dnrEpoch, trader, positionNotional.Abs().TruncateInt()) - - // get past epoch volume - pastVolume := k.GetTraderVolumeLastEpoch(ctx, dnrEpoch, trader) - // if the trader has no volume for the last epoch, we return the provided fee ratios. - if pastVolume.IsZero() { - return feeRatio, nil - } - - // try to apply discount - discountedFeeRatio, hasDiscount := k.GetTraderDiscount(ctx, trader, pastVolume) - // if the trader does not have any discount, we return the provided fee ratios. - if !hasDiscount { - return feeRatio, nil - } - // return discounted fee ratios - return discountedFeeRatio, nil -} diff --git a/x/perp/v2/keeper/dnr_int_encoder_test.go b/x/perp/v2/keeper/dnr_int_encoder_test.go deleted file mode 100644 index f59ce1bd3..000000000 --- a/x/perp/v2/keeper/dnr_int_encoder_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package keeper - -import ( - "math/big" - "testing" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestIntEncoder(t *testing.T) { - // we test our assumptions around int are correct. - outOfBounds := new(big.Int).Lsh(big.NewInt(1), 256) // 2^256 - maxBigInt := new(big.Int).Sub(outOfBounds, big.NewInt(1)) // 2^256 - 1 - require.Equal(t, maxBigInt.BitLen(), math.MaxBitLen) - require.Greater(t, outOfBounds.BitLen(), math.MaxBitLen) - - require.NotPanics(t, func() { - sdk.NewIntFromBigInt(maxBigInt) - }) - require.Panics(t, func() { - sdk.NewIntFromBigInt(outOfBounds) - }) - - require.Equal(t, maxIntKeyLen, len(maxBigInt.Bytes())) - - // test encoding ordering - enc1 := IntKeyEncoder.Encode(sdk.NewInt(50_000)) - enc2 := IntKeyEncoder.Encode(sdk.NewInt(100_000)) - require.Less(t, enc1, enc2) - - // test decoding - size, got1 := IntKeyEncoder.Decode(enc1) - require.Equal(t, maxIntKeyLen, size) - _, got2 := IntKeyEncoder.Decode(enc2) - require.Equal(t, sdk.NewInt(50_000), got1) - require.Equal(t, sdk.NewInt(100_000), got2) - - // require panics on negative values - require.Panics(t, func() { - IntKeyEncoder.Encode(sdk.NewInt(-1)) - }) - // require panics on invalid int - require.Panics(t, func() { - IntKeyEncoder.Encode(math.Int{}) - }) - - // test value encoder - value := sdk.NewInt(50_000) - valueBytes := IntValueEncoder.Encode(value) - gotValue := IntValueEncoder.Decode(valueBytes) - require.Equal(t, value, gotValue) - - // panics on invalid math.Int - require.Panics(t, func() { - IntValueEncoder.Encode(math.Int{}) - }) -} diff --git a/x/perp/v2/keeper/dnr_test.go b/x/perp/v2/keeper/dnr_test.go deleted file mode 100644 index fa1450ca1..000000000 --- a/x/perp/v2/keeper/dnr_test.go +++ /dev/null @@ -1,205 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestUserVolumes(t *testing.T) { - alice := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - positionSize := sdk.NewInt(10_000) - startBlockTime := time.Now() - - tests := TestCases{ - TC("user volume correctly sets the first time and the second time"). - Given( - DnREpochIs(1), - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - ). - Then( - DnRCurrentVolumeIs(alice, positionSize.MulRaw(2)), - ), - TC("user volume correctly sets across epochs"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - DnREpochIs(1), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), // open epoch 1 - DnREpochIs(2), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), // close epoch 2 - ). - Then( - DnRCurrentVolumeIs(alice, positionSize), - DnRPreviousVolumeIs(alice, positionSize), - ), - TC("user volume is correctly cleaned up"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ).When( - DnREpochIs(1), - MarketOrder(alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), // open epoch 1 - DnREpochIs(2), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(5_000), sdk.OneDec(), sdk.ZeroDec()), // reduce epoch 2 - DnREpochIs(3), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(2_000), sdk.OneDec(), sdk.ZeroDec()), // reduce epoch 3 - SetBlockNumber(keeper.DnRGCFrequency), - MarketOrder(alice, pairBtcNusd, types.Direction_SHORT, sdk.NewInt(2_000), sdk.OneDec(), sdk.ZeroDec()), // reduce more epoch 3 - ). - Then( - DnRCurrentVolumeIs(alice, math.NewInt(4000)), // for current epoch only 4k in volume. - DnRPreviousVolumeIs(alice, math.NewInt(5000)), // for previous epoch only 5k in volume. - DnRVolumeNotExist(alice, 1), // volume for epoch 1 should not exist. - ), - } - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestDiscount(t *testing.T) { - alice := testutil.AccAddress() - pairBtcNusd := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - positionSize := sdk.NewInt(10_000) - startBlockTime := time.Now() - - exchangeFee := sdk.MustNewDecFromStr("0.0010") // 0.1%, default fee taken from CreateCustomMarketAction - globalFeeDiscount := sdk.MustNewDecFromStr("0.0005") // 0.05% - fauxGlobalFeeDiscount := sdk.MustNewDecFromStr("0.0006") // 0.06% - customFeeDiscount := sdk.MustNewDecFromStr("0.0002") // 0.02% - fauxCustomFeeDiscount := sdk.MustNewDecFromStr("0.0003") // 0.03% - - tests := TestCases{ - TC("user does not have any past epoch volume: no discount applies"). - Given( - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - DnREpochIs(1), - ). - Then( - MarketOrderFeeIs(exchangeFee, alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - ), - TC("user has past epoch volume: no discount applies"). - Given( - DnREpochIs(2), - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - SetGlobalDiscount(fauxGlobalFeeDiscount, sdk.NewInt(50_000)), - SetGlobalDiscount(globalFeeDiscount, sdk.NewInt(100_000)), - SetCustomDiscount(alice, fauxCustomFeeDiscount, sdk.NewInt(50_000)), - SetCustomDiscount(alice, customFeeDiscount, sdk.NewInt(100_000)), - SetPreviousEpochUserVolume(alice, sdk.NewInt(10_000)), // lower than 50_000 - ). - Then( - MarketOrderFeeIs(exchangeFee, alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - ), - TC("user has past epoch volume: custom discount applies"). - Given( - DnREpochIs(2), - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - SetGlobalDiscount(globalFeeDiscount, sdk.NewInt(50_000)), - SetGlobalDiscount(fauxGlobalFeeDiscount, sdk.NewInt(100_000)), - SetCustomDiscount(alice, fauxCustomFeeDiscount, sdk.NewInt(50_000)), - SetCustomDiscount(alice, customFeeDiscount, sdk.NewInt(100_000)), - SetPreviousEpochUserVolume(alice, sdk.NewInt(100_001)), - ). - Then( - MarketOrderFeeIs(customFeeDiscount, alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - ), - TC("user has past epoch volume: global discount applies"). - Given( - DnREpochIs(2), - CreateCustomMarket( - pairBtcNusd, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, positionSize.AddRaw(1000)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(100_000_000)))), - ). - When( - SetGlobalDiscount(sdk.MustNewDecFromStr("0.0004"), sdk.NewInt(50_000)), - SetGlobalDiscount(globalFeeDiscount, sdk.NewInt(100_000)), - SetPreviousEpochUserVolume(alice, sdk.NewInt(100_000)), - ). - Then( - MarketOrderFeeIs(globalFeeDiscount, alice, pairBtcNusd, types.Direction_LONG, sdk.NewInt(10_000), sdk.OneDec(), sdk.ZeroDec()), - ), - } - NewTestSuite(t).WithTestCases(tests...).Run() -} diff --git a/x/perp/v2/keeper/grpc_query.go b/x/perp/v2/keeper/grpc_query.go deleted file mode 100644 index 167262cdc..000000000 --- a/x/perp/v2/keeper/grpc_query.go +++ /dev/null @@ -1,192 +0,0 @@ -package keeper - -import ( - "context" - - "github.com/NibiruChain/collections" - - storeprefix "github.com/cosmos/cosmos-sdk/store/prefix" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkquery "github.com/cosmos/cosmos-sdk/types/query" - - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - grpccodes "google.golang.org/grpc/codes" - grpcstatus "google.golang.org/grpc/status" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type queryServer struct { - k Keeper -} - -func NewQuerier(k Keeper) types.QueryServer { - return queryServer{k: k} -} - -var _ types.QueryServer = queryServer{} - -func (q queryServer) QueryPositions( - goCtx context.Context, req *types.QueryPositionsRequest, -) (*types.QueryPositionsResponse, error) { - if req == nil { - return nil, grpcstatus.Error(grpccodes.InvalidArgument, "nil request") - } - traderAddr, err := sdk.AccAddressFromBech32(req.Trader) // just for validation purposes - if err != nil { - return nil, err - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - markets := q.k.Markets.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() - - var positions []types.QueryPositionResponse - for _, market := range markets { - amm, err := q.k.GetAMM(ctx, market.Pair) - if err != nil { - return nil, err - } - position, err := q.position(ctx, market.Pair, traderAddr, market, amm) - if err == nil { - positions = append(positions, position) - } - } - - return &types.QueryPositionsResponse{ - Positions: positions, - }, nil -} - -func (q queryServer) QueryPosition( - goCtx context.Context, req *types.QueryPositionRequest, -) (*types.QueryPositionResponse, error) { - if req == nil { - return nil, grpcstatus.Error(grpccodes.InvalidArgument, "nil request") - } - traderAddr, err := sdk.AccAddressFromBech32(req.Trader) // just for validation purposes - if err != nil { - return nil, err - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - market, err := q.k.GetMarket(ctx, req.Pair) - if err != nil { - return nil, err - } - - amm, err := q.k.GetAMM(ctx, req.Pair) - if err != nil { - return nil, err - } - - resp, err := q.position(ctx, req.Pair, traderAddr, market, amm) - return &resp, err -} - -func (q queryServer) QueryPositionStore( - goCtx context.Context, req *types.QueryPositionStoreRequest, -) (resp *types.QueryPositionStoreResponse, err error) { - if req == nil { - return nil, grpcstatus.Error(grpccodes.InvalidArgument, "nil request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - store := storeprefix.NewStore(ctx.KVStore(q.k.storeKey), NamespacePositions.Prefix()) - - pagination, _, err := common.ParsePagination(req.Pagination) - if err != nil { - return resp, grpcstatus.Error(grpccodes.InvalidArgument, err.Error()) - } - - var respPayload []types.Position - pageRes, err := sdkquery.Paginate(store, pagination, func(key, value []byte) error { - pos := new(types.Position) - if err := q.k.cdc.Unmarshal(value, pos); err != nil { - return grpcstatus.Error(grpccodes.Internal, err.Error()) - } - respPayload = append(respPayload, *pos) - return nil - }) - if err != nil { - return resp, err - } - - return &types.QueryPositionStoreResponse{ - Positions: respPayload, - Pagination: pageRes, - }, err -} - -func (q queryServer) position(ctx sdk.Context, pair asset.Pair, trader sdk.AccAddress, market types.Market, amm types.AMM) (types.QueryPositionResponse, error) { - position, err := q.k.GetPosition(ctx, pair, market.Version, trader) - if err != nil { - return types.QueryPositionResponse{}, err - } - - positionNotional, err := PositionNotionalSpot(amm, position) - if err != nil { - return types.QueryPositionResponse{}, err - } - unrealizedPnl := UnrealizedPnl(position, positionNotional) - - return types.QueryPositionResponse{ - Position: position, - PositionNotional: positionNotional, - UnrealizedPnl: unrealizedPnl, - MarginRatio: MarginRatio(position, positionNotional, market.LatestCumulativePremiumFraction), - }, nil -} - -func (q queryServer) ModuleAccounts( - ctx context.Context, _ *types.QueryModuleAccountsRequest, -) (*types.QueryModuleAccountsResponse, error) { - sdkContext := sdk.UnwrapSDKContext(ctx) - - var moduleAccountsWithBalances []types.AccountWithBalance - for _, acc := range types.ModuleAccounts { - account := authtypes.NewModuleAddress(acc) - - balances := q.k.BankKeeper.GetAllBalances(sdkContext, account) - - accWithBalance := types.AccountWithBalance{ - Name: acc, - Address: account.String(), - Balance: balances, - } - moduleAccountsWithBalances = append(moduleAccountsWithBalances, accWithBalance) - } - - return &types.QueryModuleAccountsResponse{Accounts: moduleAccountsWithBalances}, nil -} - -func (q queryServer) QueryMarkets( - goCtx context.Context, req *types.QueryMarketsRequest, -) (*types.QueryMarketsResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - var ammMarkets []types.AmmMarket - markets := q.k.Markets.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() - for _, market := range markets { - // disabled markets are not returned - if !req.Versioned && !market.Enabled { - continue - } - - pair := market.Pair - amm, err := q.k.AMMs.Get(ctx, collections.Join(pair, market.Version)) - if err != nil { - return nil, err - } - duo := types.AmmMarket{ - Amm: amm, - Market: market, - } - ammMarkets = append(ammMarkets, duo) - } - - return &types.QueryMarketsResponse{AmmMarkets: ammMarkets}, nil -} diff --git a/x/perp/v2/keeper/grpc_query_test.go b/x/perp/v2/keeper/grpc_query_test.go deleted file mode 100644 index 09302cac4..000000000 --- a/x/perp/v2/keeper/grpc_query_test.go +++ /dev/null @@ -1,442 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkquery "github.com/cosmos/cosmos-sdk/types/query" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestQueryPositions(t *testing.T) { - alice := testutil.AccAddress() - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - pair2 := asset.Registry.Pair(denoms.ETH, denoms.NUSD) - - tc := TestCases{ - TC("positive PnL"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.NewDec(2)), - ), - CreateCustomMarket( - pair2, - WithPricePeg(sdk.NewDec(3)), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - InsertPosition( - WithPair(pair2), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPositions(alice, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("19.9999999998")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("9.9999999998")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.5499999999955")), - }, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair2, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("29.9999999997")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("19.9999999997")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.699999999997")), - }, - ), - ), - - TC("negative PnL, positive margin ratio"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.OneDec()), - ), - CreateCustomMarket( - pair2, - WithPricePeg(sdk.MustNewDecFromStr("0.95")), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - InsertPosition( - WithPair(pair2), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPositions(alice, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("9.9999999999")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-0.0000000001")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.099999999991")), - }, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair2, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("9.499999999905")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-0.500000000095")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.052631578937894737")), - }, - ), - ), - - TC("negative PnL, negative margin ratio"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.MustNewDecFromStr("0.5")), - ), - CreateCustomMarket( - pair2, - WithPricePeg(sdk.MustNewDecFromStr("0.9")), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - InsertPosition( - WithPair(pair2), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPositions(alice, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("4.99999999995")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-5.00000000005")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("-0.800000000018")), - }, - []QueryPositionChecker{ - QueryPosition_PositionEquals(types.Position{ - Pair: pair2, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("8.99999999991")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-1.00000000009")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("-0.00000000001")), - }, - ), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestQueryPosition(t *testing.T) { - alice := testutil.AccAddress() - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - tc := TestCases{ - TC("positive PnL"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.NewDec(2)), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPosition(pair, alice, - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("19.9999999998")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("9.9999999998")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.5499999999955")), - ), - ), - - TC("negative PnL, positive margin ratio"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.OneDec()), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPosition(pair, alice, - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("9.9999999999")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-0.0000000001")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("0.099999999991")), - ), - ), - - TC("negative PnL, negative margin ratio"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.MustNewDecFromStr("0.5")), - ), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryPosition(pair, alice, - QueryPosition_PositionEquals(types.Position{ - Pair: pair, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(10), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }), - QueryPosition_PositionNotionalEquals(sdk.MustNewDecFromStr("4.99999999995")), - QueryPosition_UnrealizedPnlEquals(sdk.MustNewDecFromStr("-5.00000000005")), - QueryPosition_MarginRatioEquals(sdk.MustNewDecFromStr("-0.800000000018")), - ), - ), - - TC("non existent position"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.NewDec(2)), - ), - ). - When(). - Then( - QueryPositionNotFound(pair, alice), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestQueryMarkets(t *testing.T) { - alice := testutil.AccAddress() - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - tc := TestCases{ - TC("positive PnL"). - Given( - CreateCustomMarket( - pair, - WithPricePeg(sdk.NewDec(2)), - ), - FundModule("perp_ef", sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)))), - ). - When( - InsertPosition( - WithPair(pair), - WithTrader(alice), - WithMargin(sdk.OneDec()), - WithSize(sdk.NewDec(10)), - WithOpenNotional(sdk.NewDec(10)), - ), - ). - Then( - QueryMarkets(false, QueryMarkets_MarketsShouldContain(types.DefaultMarket(pair))), - QueryModuleAccounts(QueryModuleAccounts_ModulesBalanceShouldBe( - map[string]sdk.Coins{ - "perp_ef": sdk.NewCoins( - sdk.NewCoin(denoms.BTC, sdk.ZeroInt()), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(10)), - ), - }, - )), - ), - TC("versioned, all markets (active and inactive)").Given( - CreateCustomMarket("BTC:USD", WithVersion(1), WithEnabled(true)), - CreateCustomMarket("ETC:USD", WithVersion(1), WithEnabled(false)), - CreateCustomMarket("ETC:USD", WithVersion(2), WithEnabled(true)), - ).Then( - QueryMarkets(true, QueryMarkets_ShouldLength(3)), - ), - TC("not versioned, only active markets").Given( - CreateCustomMarket("BTC:USD", WithVersion(1), WithEnabled(true)), - CreateCustomMarket("ETC:USD", WithVersion(1), WithEnabled(false)), - CreateCustomMarket("ETC:USD", WithVersion(2), WithEnabled(true)), - ).Then( - QueryMarkets(true, QueryMarkets_ShouldLength(3)), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestQueryPositionStore(t *testing.T) { - pairs := []asset.Pair{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - asset.Registry.Pair(denoms.ETH, denoms.NUSD), - asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - } - - insertManyPositions := func(num int, pair asset.Pair) []Action { - var actions []Action - for idx := 0; idx < num; idx++ { - insertAction := InsertPosition(WithPair(pair)) - actions = append(actions, insertAction) - } - - return actions - } - - tc := TestCases{ - TC("paginated positions in state"). - Given( - CreateCustomMarket(pairs[0]), - CreateCustomMarket(pairs[1]), - CreateCustomMarket(pairs[2]), - ). - When( - InsertPosition(WithPair(pairs[2])), - InsertPosition(WithPair(pairs[1])), - InsertPosition(WithPair(pairs[2])), - ). - Then( - QueryPositionStore(&sdkquery.PageRequest{}, false, CheckPositionStore_NumPositions(3)), - ), - - TC("get default number of positions per page"). - Given( - CreateCustomMarket(pairs[2]), - ). - When( - insertManyPositions(99, pairs[2])..., - ). - Then( - QueryPositionStore(&sdkquery.PageRequest{}, false, - CheckPositionStore_NumPositions(int(common.DefaultPageItemsLimit)), - ), - ), - - TC("invalid request (key and offset defined)"). - Given( - CreateCustomMarket(pairs[2]), - ). - When( - insertManyPositions(2, pairs[2])..., - ). - Then( - QueryPositionStore(&sdkquery.PageRequest{ - Key: []byte{}, Offset: 25, - }, true, - ), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/keeper/hooks.go b/x/perp/v2/keeper/hooks.go deleted file mode 100644 index 51beabff8..000000000 --- a/x/perp/v2/keeper/hooks.go +++ /dev/null @@ -1,89 +0,0 @@ -package keeper - -import ( - "time" - - "github.com/NibiruChain/collections" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) { -} - -func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, _ uint64) { - for _, market := range k.Markets.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() { - if !market.Enabled || epochIdentifier != market.FundingRateEpochId { - return - } - - indexTwap, err := k.OracleKeeper.GetExchangeRateTwap(ctx, market.Pair) - if err != nil { - ctx.Logger().Error("failed to fetch twap index price", "market.Pair", market.Pair, "error", err) - continue - } - if indexTwap.IsZero() { - ctx.Logger().Error("index price is zero", "market.Pair", market.Pair) - continue - } - - markTwap, err := k.CalcTwap(ctx, market.Pair, types.TwapCalcOption_SPOT, types.Direction_DIRECTION_UNSPECIFIED, sdk.ZeroDec(), market.TwapLookbackWindow) - if err != nil { - ctx.Logger().Error("failed to fetch twap mark price", "market.Pair", market.Pair, "error", err) - continue - } - if markTwap.IsZero() { - ctx.Logger().Error("mark price is zero", "market.Pair", market.Pair) - continue - } - - epochInfo, err := k.EpochKeeper.GetEpochInfo(ctx, epochIdentifier) - if err != nil { - ctx.Logger().Error("failed to fetch epoch info", "epochIdentifier", epochIdentifier, "error", err) - continue - } - intervalsPerDay := (24 * time.Hour) / epochInfo.Duration - // See https://www.notion.so/nibiru/Funding-Payments-5032d0f8ed164096808354296d43e1fa for an explanation of these terms. - clampedDivergence := common.Clamp(markTwap.Sub(indexTwap).Quo(indexTwap), market.MaxFundingRate) - premiumFraction := clampedDivergence.Mul(indexTwap).QuoInt64(int64(intervalsPerDay)) - - market.LatestCumulativePremiumFraction = market.LatestCumulativePremiumFraction.Add(premiumFraction) - k.SaveMarket(ctx, market) - - _ = ctx.EventManager().EmitTypedEvent(&types.FundingRateChangedEvent{ - Pair: market.Pair, - MarkPriceTwap: markTwap, - IndexPriceTwap: indexTwap, - PremiumFraction: premiumFraction, - CumulativePremiumFraction: market.LatestCumulativePremiumFraction, - }) - } -} - -// ___________________________________________________________________________________________________ - -// Hooks wrapper struct for perps keeper. -type Hooks struct { - k Keeper -} - -var _ epochstypes.EpochHooks = Hooks{} - -// Hooks Return the wrapper struct. -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// BeforeEpochStart epochs hooks. -func (h Hooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.BeforeEpochStart(ctx, epochIdentifier, epochNumber) -} - -func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.AfterEpochEnd(ctx, epochIdentifier, epochNumber) -} diff --git a/x/perp/v2/keeper/hooks_test.go b/x/perp/v2/keeper/hooks_test.go deleted file mode 100644 index 7b9a67d35..000000000 --- a/x/perp/v2/keeper/hooks_test.go +++ /dev/null @@ -1,153 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/epochs/integration/action" - epochtypes "github.com/NibiruChain/nibiru/x/epochs/types" - . "github.com/NibiruChain/nibiru/x/oracle/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" -) - -func TestAfterEpochEnd(t *testing.T) { - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - startTime := time.Now() - - tc := TestCases{ - TC("index > mark"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.MustNewDecFromStr("5.8")), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.MustNewDecFromStr("-0.099999999999999999"))), - ), - - TC("index < mark"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.MustNewDecFromStr("0.52")), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.MustNewDecFromStr("0.01"))), - ), - - TC("index > mark - max funding rate"). - Given( - CreateCustomMarket(pairBtcUsdc, WithMaxFundingRate(sdk.MustNewDecFromStr("0.001"))), - SetBlockTime(startTime), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.MustNewDecFromStr("5.8")), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.MustNewDecFromStr("-0.000120833333333333"))), - ), - - TC("index < mark - max funding rate"). - Given( - CreateCustomMarket(pairBtcUsdc, WithMaxFundingRate(sdk.MustNewDecFromStr("0.001"))), - SetBlockTime(startTime), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.MustNewDecFromStr("0.52")), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.MustNewDecFromStr("0.000010833333333333"))), - ), - - TC("index == mark"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.OneDec()), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.ZeroDec())), - ), - - TC("missing twap"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.ZeroDec())), - ), - - TC("0 price mark"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.ZeroDec()), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.ZeroDec())), - ), - - TC("market not enabled"). - Given( - CreateCustomMarket(pairBtcUsdc), - CloseMarket(pairBtcUsdc), - SetBlockTime(startTime), - StartEpoch(epochtypes.ThirtyMinuteEpochID), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.NewDec(2)), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.ZeroDec())), - ), - - TC("not correct epoch id"). - Given( - CreateCustomMarket(pairBtcUsdc), - CloseMarket(pairBtcUsdc), - SetBlockTime(startTime), - StartEpoch(epochtypes.FifteenMinuteEpochID), - InsertOraclePriceSnapshot(pairBtcUsdc, startTime.Add(15*time.Minute), sdk.NewDec(2)), - ). - When( - MoveToNextBlockWithDuration(30 * time.Minute), - ). - Then( - MarketShouldBeEqual(pairBtcUsdc, Market_LatestCPFShouldBeEqualTo(sdk.ZeroDec())), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/keeper/keeper.go b/x/perp/v2/keeper/keeper.go deleted file mode 100644 index 6d4cab188..000000000 --- a/x/perp/v2/keeper/keeper.go +++ /dev/null @@ -1,124 +0,0 @@ -package keeper - -import ( - "fmt" - "time" - - "cosmossdk.io/math" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - - "github.com/NibiruChain/collections" - - "github.com/cometbft/cometbft/libs/log" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - - BankKeeper types.BankKeeper - AccountKeeper types.AccountKeeper - OracleKeeper types.OracleKeeper - EpochKeeper types.EpochKeeper - - MarketLastVersion collections.Map[asset.Pair, types.MarketLastVersion] - Markets collections.Map[collections.Pair[asset.Pair, uint64], types.Market] - AMMs collections.Map[collections.Pair[asset.Pair, uint64], types.AMM] - - Positions collections.Map[collections.Pair[collections.Pair[asset.Pair, uint64], sdk.AccAddress], types.Position] - ReserveSnapshots collections.Map[collections.Pair[asset.Pair, time.Time], types.ReserveSnapshot] - DnREpoch collections.Item[uint64] - TraderVolumes collections.Map[collections.Pair[sdk.AccAddress, uint64], math.Int] // Keeps track of user volumes for each epoch. - GlobalDiscounts collections.Map[math.Int, math.LegacyDec] // maps a volume level to a discount - TraderDiscounts collections.Map[collections.Pair[sdk.AccAddress, math.Int], math.LegacyDec] // maps a user and volume level to a discount, supersedes global discounts -} - -// NewKeeper Creates a new x/perp Keeper instance. -func NewKeeper( - cdc codec.BinaryCodec, - storeKey storetypes.StoreKey, - - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - oracleKeeper types.OracleKeeper, - epochKeeper types.EpochKeeper, -) Keeper { - // Ensure that the module account is set. - if moduleAcc := accountKeeper.GetModuleAddress(types.ModuleName); moduleAcc == nil { - panic("The x/perp module account has not been set") - } - - return Keeper{ - cdc: cdc, - storeKey: storeKey, - BankKeeper: bankKeeper, - AccountKeeper: accountKeeper, - OracleKeeper: oracleKeeper, - EpochKeeper: epochKeeper, - Markets: collections.NewMap( - storeKey, NamespaceMarkets, - collections.PairKeyEncoder(asset.PairKeyEncoder, collections.Uint64KeyEncoder), - collections.ProtoValueEncoder[types.Market](cdc), - ), - MarketLastVersion: collections.NewMap( - storeKey, NamespaceMarketLastVersion, - asset.PairKeyEncoder, - collections.ProtoValueEncoder[types.MarketLastVersion](cdc), - ), - AMMs: collections.NewMap( - storeKey, NamespaceAmms, - collections.PairKeyEncoder(asset.PairKeyEncoder, collections.Uint64KeyEncoder), - collections.ProtoValueEncoder[types.AMM](cdc), - ), - Positions: collections.NewMap( - storeKey, NamespacePositions, - collections.PairKeyEncoder(collections.PairKeyEncoder(asset.PairKeyEncoder, collections.Uint64KeyEncoder), collections.AccAddressKeyEncoder), - collections.ProtoValueEncoder[types.Position](cdc), - ), - ReserveSnapshots: collections.NewMap( - storeKey, NamespaceReserveSnapshots, - collections.PairKeyEncoder(asset.PairKeyEncoder, collections.TimeKeyEncoder), - collections.ProtoValueEncoder[types.ReserveSnapshot](cdc), - ), - DnREpoch: collections.NewItem( - storeKey, NamespaceDnrEpoch, - collections.Uint64ValueEncoder, - ), - TraderVolumes: collections.NewMap( - storeKey, NamespaceUserVolumes, - collections.PairKeyEncoder(collections.AccAddressKeyEncoder, collections.Uint64KeyEncoder), - IntValueEncoder, - ), - GlobalDiscounts: collections.NewMap( - storeKey, NamespaceGlobalDiscounts, - IntKeyEncoder, - collections.DecValueEncoder, - ), - TraderDiscounts: collections.NewMap( - storeKey, NamespaceUserDiscounts, - collections.PairKeyEncoder(collections.AccAddressKeyEncoder, IntKeyEncoder), - collections.DecValueEncoder, - ), - } -} - -const ( - NamespaceMarkets collections.Namespace = iota + 11 // == 11 because iota starts from 0 - NamespaceAmms - NamespacePositions - NamespaceReserveSnapshots - NamespaceDnrEpoch - NamespaceUserVolumes - NamespaceGlobalDiscounts - NamespaceUserDiscounts - NamespaceMarketLastVersion -) - -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) -} diff --git a/x/perp/v2/keeper/liquidate.go b/x/perp/v2/keeper/liquidate.go deleted file mode 100644 index 79b92c76e..000000000 --- a/x/perp/v2/keeper/liquidate.go +++ /dev/null @@ -1,429 +0,0 @@ -package keeper - -import ( - "encoding/json" - "fmt" - "strings" - - sdkerrors "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func (k Keeper) MultiLiquidate( - ctx sdk.Context, liquidator sdk.AccAddress, liquidationRequests []*types.MsgMultiLiquidate_Liquidation, -) ([]*types.MsgMultiLiquidateResponse_LiquidationResponse, error) { - resps := make([]*types.MsgMultiLiquidateResponse_LiquidationResponse, len(liquidationRequests)) - - var allFailed bool = true - - for reqIdx, req := range liquidationRequests { - traderAddr, errAccAddress := sdk.AccAddressFromBech32(req.Trader) - liquidatorFee, perpEfFee, err := k.liquidate( - ctx, liquidator, req.Pair, traderAddr, - ) - - switch { - case errAccAddress != nil: - resps[reqIdx] = &types.MsgMultiLiquidateResponse_LiquidationResponse{ - Success: false, - Error: errAccAddress.Error(), - Trader: req.Trader, - Pair: req.Pair, - } - case err != nil: - resps[reqIdx] = &types.MsgMultiLiquidateResponse_LiquidationResponse{ - Success: false, - Error: err.Error(), - Trader: req.Trader, - Pair: req.Pair, - } - default: - // Success case - allFailed = false - resps[reqIdx] = &types.MsgMultiLiquidateResponse_LiquidationResponse{ - Success: true, - LiquidatorFee: &liquidatorFee, - PerpEfFee: &perpEfFee, - Trader: req.Trader, - Pair: req.Pair, - } - } - } - - if allFailed { - prettyResps, errPrettyResp := PrettyLiquidateResponse(resps) - - numLiquidations := len(liquidationRequests) - errDescription := strings.Join( - []string{ - fmt.Sprintf("%d liquidations failed", numLiquidations), - fmt.Sprintf("liquidate_responses: %s", prettyResps), - }, - "\n", - ) - if errPrettyResp != nil { - errDescription += fmt.Sprintf("\n%s", errPrettyResp.Error()) - } - return resps, types.ErrAllLiquidationsFailed.Wrap(errDescription) - } - - return resps, nil -} - -/* -PrettyLiquidateResponse converts a slice of liquidation responses into a -pretty formatted JSON array for each response. This helps with providing -descriptive error messages in the case of failed liquidations. - -Example outputs: - -```json -[ - - { - "success": false, - "error": "failed liquidation A", - "liquidator_fee": null, - "perp_ef_fee": null, - "trader": "dummytraderA" - }, - { - "success": true, - "error": "", - "liquidator_fee": { denom: "unibi", amount: "420"}, - "perp_ef_fee": null, - "trader": "dummytraderB" - } - -] -``` -*/ -func PrettyLiquidateResponse( - resps []*types.MsgMultiLiquidateResponse_LiquidationResponse, -) (pretty string, err error) { - protoCodec := codec.NewProtoCodec(codectypes.NewInterfaceRegistry()) - var respJsons []json.RawMessage - var jsonErrs string = "" - for _, resp := range resps { - respJsonBz, jsonErr := protoCodec.MarshalJSON(resp) - if jsonErr != nil { - jsonErrs += jsonErr.Error() - } - respJsons = append(respJsons, respJsonBz) - } - - prettyBz, _ := json.MarshalIndent(respJsons, "", " ") - pretty = string(prettyBz) - if jsonErrs != "" { - return pretty, types.ErrParseLiquidateResponse.Wrap(jsonErrs) - } - return -} - -/* -liquidate allows to liquidate the trader position if the margin is below the -required margin maintenance ratio. - -args: - - liquidator: the liquidator who is executing the liquidation - - pair: the asset pair - - trader: the trader who owns the position being liquidated - -returns: - - liquidatorFee: the amount of coins given to the liquidator - - ecosystemFundFee: the amount of coins given to the ecosystem fund - - err: error - - event: pointer to a typed event (proto.Message). The 'event' value - exists when the liquidation fails and is nil when the liquidation succeeds. -*/ -func (k Keeper) liquidate( - ctx sdk.Context, - liquidator sdk.AccAddress, - pair asset.Pair, - trader sdk.AccAddress, -) (liquidatorFee sdk.Coin, ecosystemFundFee sdk.Coin, err error) { - // eventLiqFailed exists when the liquidation fails and is nil when the - // liquidation succeeds. - - market, err := k.GetMarket(ctx, pair) - if err != nil { - eventLiqFailed := &types.LiquidationFailedEvent{ - Pair: pair, - Trader: trader.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_NONEXISTENT_PAIR, - } - _ = ctx.EventManager().EmitTypedEvent(eventLiqFailed) - err = sdkerrors.Wrapf(types.ErrPairNotFound, "pair: %s", pair) - return - } - - amm, err := k.GetAMM(ctx, pair) - if err != nil { - eventLiqFailed := &types.LiquidationFailedEvent{ - Pair: pair, - Trader: trader.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_NONEXISTENT_PAIR, - } - _ = ctx.EventManager().EmitTypedEvent(eventLiqFailed) - err = sdkerrors.Wrapf(types.ErrPairNotFound, "pair: %s", pair) - return - } - - position, err := k.GetPosition(ctx, pair, market.Version, trader) - if err != nil { - eventLiqFailed := &types.LiquidationFailedEvent{ - Pair: pair, - Trader: trader.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_NONEXISTENT_POSITION, - } - _ = ctx.EventManager().EmitTypedEvent(eventLiqFailed) - return - } - - spotNotional, err := PositionNotionalSpot(amm, position) - if err != nil { - return - } - twapNotional, err := k.PositionNotionalTWAP(ctx, position, market.TwapLookbackWindow) - if err != nil { - return - } - - // give the user the preferred position notional - var preferredPositionNotional sdk.Dec - if position.Size_.IsPositive() { - preferredPositionNotional = sdk.MaxDec(spotNotional, twapNotional) - } else { - preferredPositionNotional = sdk.MinDec(spotNotional, twapNotional) - } - - marginRatio := MarginRatio(position, preferredPositionNotional, market.LatestCumulativePremiumFraction) - if marginRatio.GTE(market.MaintenanceMarginRatio) { - eventLiqFailed := &types.LiquidationFailedEvent{ - Pair: pair, - Trader: trader.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_POSITION_HEALTHY, - } - _ = ctx.EventManager().EmitTypedEvent(eventLiqFailed) - err = types.ErrPositionHealthy - return - } - - spotMarginRatio := MarginRatio(position, spotNotional, market.LatestCumulativePremiumFraction) - if spotMarginRatio.GTE(market.LiquidationFeeRatio) { - liquidatorFee, ecosystemFundFee, err = k.executePartialLiquidation(ctx, market, amm, liquidator, &position) - } else { - liquidatorFee, ecosystemFundFee, err = k.executeFullLiquidation(ctx, market, amm, liquidator, &position) - } - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - return liquidatorFee, ecosystemFundFee, nil -} - -/* -executeFullLiquidation Fully liquidates a position. It is assumed that the margin ratio has already been -checked prior to calling this method. - -args: - - ctx: cosmos-sdk context - - liquidator: the liquidator's address - - position: the position to liquidate - -ret: - - liquidationResp: a response object containing the results of the liquidation - - err: error -*/ -func (k Keeper) executeFullLiquidation( - ctx sdk.Context, market types.Market, amm types.AMM, liquidator sdk.AccAddress, position *types.Position, -) (liquidatorfee sdk.Coin, ecosystemFundFee sdk.Coin, err error) { - _, positionResp, err := k.closePositionEntirely( - ctx, - market, - amm, - /* currentPosition */ *position, - /* quoteAssetAmountLimit */ sdk.ZeroDec(), - ) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - remainMargin := positionResp.MarginToVault.Abs() - - liquidatorFeeAmount := market.LiquidationFeeRatio. - Mul(positionResp.ExchangedNotionalValue). - QuoInt64(2) - totalBadDebt := positionResp.BadDebt - - if liquidatorFeeAmount.GT(remainMargin) { - // if the remainMargin is not enough for liquidationFee, count it as bad debt - totalBadDebt = totalBadDebt.Add(liquidatorFeeAmount.Sub(remainMargin)) - remainMargin = sdk.ZeroDec() - } else { - // Otherwise, the remaining margin will be transferred to ecosystemFund - remainMargin = remainMargin.Sub(liquidatorFeeAmount) - } - - // Realize bad debt - if totalBadDebt.IsPositive() { - if err = k.realizeBadDebt( - ctx, - market, - totalBadDebt.RoundInt(), - ); err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - } - - ecosystemFundFeeAmount := sdk.ZeroDec() - if remainMargin.IsPositive() { - ecosystemFundFeeAmount = remainMargin - } - - quoteDenom := market.Pair.QuoteDenom() - - liquidatorfee = sdk.NewCoin(quoteDenom, liquidatorFeeAmount.RoundInt()) - ecosystemFundFee = sdk.NewCoin(quoteDenom, ecosystemFundFeeAmount.RoundInt()) - - err = k.distributeLiquidateRewards( - ctx, - market, - liquidator, - liquidatorfee, - ecosystemFundFee, - ) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - _ = ctx.EventManager().EmitTypedEvent(&types.PositionLiquidatedEvent{ - PositionChangedEvent: types.PositionChangedEvent{ - FinalPosition: positionResp.Position, - PositionNotional: positionResp.PositionNotional, - TransactionFee: sdk.NewCoin(position.Pair.QuoteDenom(), sdk.ZeroInt()), // no transaction fee for liquidation - RealizedPnl: positionResp.RealizedPnl, - BadDebt: sdk.NewCoin(position.Pair.QuoteDenom(), totalBadDebt.RoundInt()), - FundingPayment: positionResp.FundingPayment, - BlockHeight: ctx.BlockHeight(), - MarginToUser: sdk.ZeroInt(), // no margin to user for full liquidation - ChangeReason: types.ChangeReason_FullLiquidation, - }, - LiquidatorAddress: liquidator.String(), - FeeToLiquidator: sdk.NewCoin(position.Pair.QuoteDenom(), liquidatorFeeAmount.RoundInt()), - FeeToEcosystemFund: sdk.NewCoin(position.Pair.QuoteDenom(), ecosystemFundFeeAmount.RoundInt()), - }) - - return liquidatorfee, ecosystemFundFee, err -} - -// executePartialLiquidation partially liquidates a position -func (k Keeper) executePartialLiquidation( - ctx sdk.Context, market types.Market, amm types.AMM, liquidator sdk.AccAddress, position *types.Position, -) (liquidatorFee sdk.Coin, ecosystemFundFee sdk.Coin, err error) { - traderAddr, err := sdk.AccAddressFromBech32(position.TraderAddress) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - var dir types.Direction - if position.Size_.IsPositive() { - dir = types.Direction_SHORT - } else { - dir = types.Direction_LONG - } - - quoteReserveDelta, err := amm.GetQuoteReserveAmt(position.Size_.Mul(market.PartialLiquidationRatio), dir) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - quoteAssetDelta := amm.QuoteReserveToAsset(quoteReserveDelta) - - _, positionResp, err := k.decreasePosition( - /* ctx */ ctx, - market, - amm, - /* currentPosition */ *position, - /* quoteAssetAmount */ quoteAssetDelta, - /* baseAmtLimit */ sdk.ZeroDec(), - ) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - // Remove the liquidation fee from the margin of the position - liquidationFeeAmount := quoteAssetDelta.Mul(market.LiquidationFeeRatio) - positionResp.Position.Margin = positionResp.Position.Margin.Sub(liquidationFeeAmount) - k.SavePosition(ctx, positionResp.Position.Pair, market.Version, traderAddr, positionResp.Position) - - // Compute splits for the liquidation fee - feeToLiquidator := liquidationFeeAmount.QuoInt64(2) - feeToPerpEcosystemFund := liquidationFeeAmount.Sub(feeToLiquidator) - - err = k.distributeLiquidateRewards(ctx, market, liquidator, - sdk.NewCoin(market.Pair.QuoteDenom(), feeToPerpEcosystemFund.RoundInt()), - sdk.NewCoin(market.Pair.QuoteDenom(), feeToLiquidator.RoundInt()), - ) - if err != nil { - return sdk.Coin{}, sdk.Coin{}, err - } - - _ = ctx.EventManager().EmitTypedEvent(&types.PositionLiquidatedEvent{ - PositionChangedEvent: types.PositionChangedEvent{ - FinalPosition: positionResp.Position, - PositionNotional: positionResp.PositionNotional, - TransactionFee: sdk.NewCoin(position.Pair.QuoteDenom(), sdk.ZeroInt()), // no transaction fee for liquidation - RealizedPnl: positionResp.RealizedPnl, - BadDebt: sdk.NewCoin(position.Pair.QuoteDenom(), sdk.ZeroInt()), // no bad debt for partial liquidation - FundingPayment: positionResp.FundingPayment, - BlockHeight: ctx.BlockHeight(), - MarginToUser: sdk.ZeroInt(), // no margin to user for partial liquidation - ChangeReason: types.ChangeReason_PartialLiquidation, - }, - LiquidatorAddress: liquidator.String(), - FeeToLiquidator: sdk.NewCoin(position.Pair.QuoteDenom(), feeToLiquidator.RoundInt()), - FeeToEcosystemFund: sdk.NewCoin(position.Pair.QuoteDenom(), feeToPerpEcosystemFund.RoundInt()), - }) - - return liquidatorFee, ecosystemFundFee, err -} - -func (k Keeper) distributeLiquidateRewards( - ctx sdk.Context, market types.Market, liquidator sdk.AccAddress, liquidatorFee sdk.Coin, ecosystemFundFee sdk.Coin, -) (err error) { - // -------------------------------------------------------------- - // Distribution of rewards - // -------------------------------------------------------------- - - // Transfer fee from vault to PerpEF - if ecosystemFundFee.IsPositive() { - if err = k.BankKeeper.SendCoinsFromModuleToModule( - ctx, - /* from */ types.VaultModuleAccount, - /* to */ types.PerpEFModuleAccount, - sdk.NewCoins(ecosystemFundFee), - ); err != nil { - return err - } - } - - // Transfer fee from vault to liquidator - if liquidatorFee.IsPositive() { - err = k.WithdrawFromVault(ctx, market, liquidator, liquidatorFee.Amount) - if err != nil { - return err - } - } - - return nil -} diff --git a/x/perp/v2/keeper/liquidate_test.go b/x/perp/v2/keeper/liquidate_test.go deleted file mode 100644 index d0a408d9f..000000000 --- a/x/perp/v2/keeper/liquidate_test.go +++ /dev/null @@ -1,404 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestMultiLiquidate(t *testing.T) { - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - pairEthUsdc := asset.Registry.Pair(denoms.ETH, denoms.USDC) - pairAtomUsdc := asset.Registry.Pair(denoms.ATOM, denoms.USDC) - pairSolUsdc := asset.Registry.Pair(denoms.SOL, denoms.USDC) - - alice := testutil.AccAddress() - bob := testutil.AccAddress() - liquidator := testutil.AccAddress() - startTime := time.Now() - - tc := TestCases{ - TC("partial liquidation"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10400))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(750)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(125)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(125)), - PositionShouldBeEqual(alice, pairBtcUsdc, - Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.NewDec(5000), - Margin: sdk.MustNewDecFromStr("549.999951250000493750"), - OpenNotional: sdk.MustNewDecFromStr("5199.999975000000375000"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - ), - ), - ), - - TC("full liquidation"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - PairTraderTuple{Pair: pairAtomUsdc, Trader: alice, Successful: false}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(600)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(150)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - - TC("full liquidation"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(600)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(150)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - - TC("one fail liquidation - one correct"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Successful: false}, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(600)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(150)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - - TC("one fail liquidation because market does not exists- one correct"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: asset.MustNewPair("luna:usdt"), Successful: false}, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(600)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(150)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - - TC("realizes bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10800))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 50))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(800)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - - TC("uses prepaid bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc, WithPrepaidBadDebt(sdk.NewInt(50))), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10800))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(750)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - MarketShouldBeEqual(pairBtcUsdc, Market_PrepaidBadDebtShouldBeEqualTo(sdk.ZeroInt())), - ), - - TC("healthy position"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(100)), WithMargin(sdk.NewDec(10)), WithOpenNotional(sdk.NewDec(100))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 10))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, true, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: false}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(10)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - BalanceEqual(liquidator, denoms.USDC, sdk.ZeroInt()), - PositionShouldBeEqual(alice, pairBtcUsdc, - Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.NewDec(100), - Margin: sdk.NewDec(10), - OpenNotional: sdk.NewDec(100), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }, - ), - ), - ContainsLiquidateEvent(&types.LiquidationFailedEvent{ - Pair: pairBtcUsdc, - Trader: alice.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_POSITION_HEALTHY, - }), - ), - - TC("mixed bag"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - CreateCustomMarket(pairEthUsdc), - CreateCustomMarket(pairAtomUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10400))), // partial - InsertPosition(WithTrader(alice), WithPair(pairEthUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), // full - InsertPosition(WithTrader(alice), WithPair(pairAtomUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10000))), // healthy - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 3000))), - ). - When( - MoveToNextBlock(), - MultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - PairTraderTuple{Pair: pairEthUsdc, Trader: alice, Successful: true}, - PairTraderTuple{Pair: pairAtomUsdc, Trader: alice, Successful: false}, - PairTraderTuple{Pair: pairSolUsdc, Trader: alice, Successful: false}, // non-existent market - PairTraderTuple{Pair: pairBtcUsdc, Trader: bob, Successful: false}, // non-existent position - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(2350)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(275)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(375)), - PositionShouldBeEqual(alice, pairBtcUsdc, - Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.NewDec(5000), - Margin: sdk.MustNewDecFromStr("549.999951250000493750"), - OpenNotional: sdk.MustNewDecFromStr("5199.999975000000375000"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - ), - ), - PositionShouldNotExist(alice, pairEthUsdc), - PositionShouldBeEqual(alice, pairAtomUsdc, - Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairAtomUsdc, - TraderAddress: alice.String(), - Size_: sdk.NewDec(10000), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(10000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 0, - }, - ), - ), - - ContainsLiquidateEvent(&types.LiquidationFailedEvent{ - Pair: pairAtomUsdc, - Trader: alice.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_POSITION_HEALTHY, - }), - ContainsLiquidateEvent(&types.LiquidationFailedEvent{ - Pair: pairSolUsdc, - Trader: alice.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_NONEXISTENT_PAIR, - }), - ContainsLiquidateEvent(&types.LiquidationFailedEvent{ - Pair: pairBtcUsdc, - Trader: bob.String(), - Liquidator: liquidator.String(), - Reason: types.LiquidationFailedEvent_NONEXISTENT_POSITION, - }), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestPrettyLiquidateResponse(t *testing.T) { - type TestCase struct { - name string - resps []*types.MsgMultiLiquidateResponse_LiquidationResponse - shouldError bool - // prettyContains: sections of JSON string expected to be contained in - // the pretty output. - prettyContains []string - } - - dummy := struct { - LiquidatorFee sdk.Coin - PerpEfFee sdk.Coin - Trader string - }{ - LiquidatorFee: sdk.NewInt64Coin("unibi", 420), - PerpEfFee: sdk.NewInt64Coin("unibi", 420), - Trader: "dummytrader", - } - - testCases := []TestCase{ - { - name: "empty", - resps: []*types.MsgMultiLiquidateResponse_LiquidationResponse{}, - shouldError: false, - }, - - { - name: "success only", - resps: []*types.MsgMultiLiquidateResponse_LiquidationResponse{ - { - Success: true, - LiquidatorFee: &dummy.LiquidatorFee, - PerpEfFee: &dummy.PerpEfFee, - Trader: dummy.Trader, - }, - }, - shouldError: false, - prettyContains: []string{ - `success": true`, - `liquidator_fee": {`, - `perp_ef_fee": {`, - `denom": "unibi`, - `amount": "420`, - `trader": "dummytrader"`, - }, - }, - - { - name: "errors only", - resps: []*types.MsgMultiLiquidateResponse_LiquidationResponse{ - { - Success: false, - Error: "failed liquidation A", - Trader: dummy.Trader, - }, - { - Success: false, - Error: "failed liquidation B", - Trader: dummy.Trader, - }, - }, - shouldError: false, - prettyContains: []string{ - `success": false`, - `liquidator_fee": null`, - `perp_ef_fee": null`, - `trader": "dummytrader"`, - `error": "failed liquidation A"`, - `error": "failed liquidation B"`, - }, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - pretty, err := keeper.PrettyLiquidateResponse(tc.resps) - - if tc.shouldError { - require.Errorf(t, err, "pretty: %s", pretty) - } else { - require.NoErrorf(t, err, "pretty: %s", pretty) - } - - for _, prettyContains := range tc.prettyContains { - require.Contains(t, pretty, prettyContains) - } - }) - } -} diff --git a/x/perp/v2/keeper/margin.go b/x/perp/v2/keeper/margin.go deleted file mode 100644 index a62bb9be1..000000000 --- a/x/perp/v2/keeper/margin.go +++ /dev/null @@ -1,197 +0,0 @@ -package keeper - -import ( - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// AddMargin adds margin to an existing position, effectively deleveraging it. -// Adding margin increases the margin ratio of the corresponding position. -// -// args: -// - ctx: the cosmos-sdk context -// - pair: the asset pair -// - traderAddr: the trader's address -// - marginToAdd: the amount of margin to add. Must be positive. -// -// ret: -// - res: the response -// - err: error if any -func (k Keeper) AddMargin( - ctx sdk.Context, pair asset.Pair, traderAddr sdk.AccAddress, marginToAdd sdk.Coin, -) (res *types.MsgAddMarginResponse, err error) { - market, err := k.GetMarket(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - - if marginToAdd.Denom != amm.Pair.QuoteDenom() { - return nil, fmt.Errorf("invalid margin denom: %s", marginToAdd.Denom) - } - - position, err := k.GetPosition(ctx, pair, market.Version, traderAddr) - if err != nil { - return nil, err - } - - fundingPayment := FundingPayment(position, market.LatestCumulativePremiumFraction) - remainingMargin := position.Margin.Add(sdk.NewDecFromInt(marginToAdd.Amount)).Sub(fundingPayment) - - if remainingMargin.IsNegative() { - return nil, types.ErrBadDebt.Wrapf("applying funding payment would result in negative remaining margin: %s", remainingMargin) - } - - if err = k.BankKeeper.SendCoinsFromAccountToModule( - ctx, - /* from */ traderAddr, - /* to */ types.VaultModuleAccount, - /* amount */ sdk.NewCoins(marginToAdd), - ); err != nil { - return nil, err - } - - // apply funding payment and add margin - position.Margin = remainingMargin - position.LatestCumulativePremiumFraction = market.LatestCumulativePremiumFraction - position.LastUpdatedBlockNumber = ctx.BlockHeight() - k.SavePosition(ctx, pair, market.Version, traderAddr, position) - - positionNotional, err := PositionNotionalSpot(amm, position) - if err != nil { - return nil, err - } - - if err = ctx.EventManager().EmitTypedEvent( - &types.PositionChangedEvent{ - FinalPosition: position, - PositionNotional: positionNotional, - TransactionFee: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), // always zero when adding margin - RealizedPnl: sdk.ZeroDec(), // always zero when adding margin - BadDebt: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), // always zero when adding margin - FundingPayment: fundingPayment, - BlockHeight: ctx.BlockHeight(), - MarginToUser: marginToAdd.Amount.Neg(), - ChangeReason: types.ChangeReason_AddMargin, - }, - ); err != nil { - return nil, err - } - - return &types.MsgAddMarginResponse{ - FundingPayment: fundingPayment, - Position: &position, - }, nil -} - -/* - RemoveMargin further leverages an existing position by directly removing - -the margin (collateral) that backs it from the vault. This also decreases the -margin ratio of the position. - -Fails if the position goes underwater. - -args: - - ctx: the cosmos-sdk context - - pair: the asset pair - - traderAddr: the trader's address - - margin: the amount of margin to withdraw. Must be positive. - -ret: - - marginOut: the amount of margin removed - - fundingPayment: the funding payment that was applied with this position interaction - - err: error if any -*/ -func (k Keeper) RemoveMargin( - ctx sdk.Context, pair asset.Pair, traderAddr sdk.AccAddress, marginToRemove sdk.Coin, -) (res *types.MsgRemoveMarginResponse, err error) { - // fetch objects from state - market, err := k.GetMarket(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return nil, fmt.Errorf("%w: %s", types.ErrPairNotFound, pair) - } - if marginToRemove.Denom != amm.Pair.QuoteDenom() { - return nil, fmt.Errorf("invalid margin denom: %s", marginToRemove.Denom) - } - - position, err := k.GetPosition(ctx, pair, market.Version, traderAddr) - if err != nil { - return nil, err - } - - // ensure we have enough free collateral - spotNotional, err := PositionNotionalSpot(amm, position) - if err != nil { - return nil, err - } - twapNotional, err := k.PositionNotionalTWAP(ctx, position, market.TwapLookbackWindow) - if err != nil { - return nil, err - } - minPositionNotional := sdk.MinDec(spotNotional, twapNotional) - - // account for funding payment - fundingPayment := FundingPayment(position, market.LatestCumulativePremiumFraction) - remainingMargin := position.Margin.Sub(fundingPayment) - - // account for negative PnL - unrealizedPnl := UnrealizedPnl(position, minPositionNotional) - if unrealizedPnl.IsNegative() { - remainingMargin = remainingMargin.Add(unrealizedPnl) - } - - if remainingMargin.LT(sdk.NewDecFromInt(marginToRemove.Amount)) { - return nil, types.ErrBadDebt.Wrapf( - "not enough free collateral to remove margin; remainingMargin %s, marginToRemove %s", remainingMargin, marginToRemove, - ) - } - - // apply funding payment and remove margin - position.Margin = position.Margin.Sub(fundingPayment).Sub(sdk.NewDecFromInt(marginToRemove.Amount)) - position.LatestCumulativePremiumFraction = market.LatestCumulativePremiumFraction - position.LastUpdatedBlockNumber = ctx.BlockHeight() - - err = k.checkMarginRatio(ctx, market, amm, position) - if err != nil { - return nil, err - } - - if err = k.WithdrawFromVault(ctx, market, traderAddr, marginToRemove.Amount); err != nil { - return nil, err - } - k.SavePosition(ctx, pair, market.Version, traderAddr, position) - - if err = ctx.EventManager().EmitTypedEvent( - &types.PositionChangedEvent{ - FinalPosition: position, - PositionNotional: spotNotional, - TransactionFee: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), // always zero when removing margin - RealizedPnl: sdk.ZeroDec(), // always zero when removing margin - BadDebt: sdk.NewCoin(pair.QuoteDenom(), sdk.ZeroInt()), // always zero when removing margin - FundingPayment: fundingPayment, - BlockHeight: ctx.BlockHeight(), - MarginToUser: marginToRemove.Amount, - ChangeReason: types.ChangeReason_RemoveMargin, - }, - ); err != nil { - return nil, err - } - - return &types.MsgRemoveMarginResponse{ - FundingPayment: fundingPayment, - Position: &position, - }, nil -} diff --git a/x/perp/v2/keeper/margin_test.go b/x/perp/v2/keeper/margin_test.go deleted file mode 100644 index da071743b..000000000 --- a/x/perp/v2/keeper/margin_test.go +++ /dev/null @@ -1,312 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestAddMargin(t *testing.T) { - alice := testutil.AccAddress() - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - pairEthUsdc := asset.Registry.Pair(denoms.ETH, denoms.USDC) - startBlockTime := time.Now() - - tc := TestCases{ - TC("existing long position, add margin"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(2020)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - AddMargin(alice, pairBtcUsdc, sdk.NewInt(1000)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("9999.999900000001000000"), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(10000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - )), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("9999.999900000001000000"), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(10000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.NewDec(10_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - BlockHeight: 2, - MarginToUser: sdk.NewInt(-1_000), - ChangeReason: types.ChangeReason_AddMargin, - ExchangedNotional: sdk.MustNewDecFromStr("0"), - ExchangedSize: sdk.MustNewDecFromStr("0"), - }), - BalanceEqual(alice, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(10)), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.NewInt(10)), - ), - - TC("existing short position, add margin"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(2020)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_SHORT, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - AddMargin(alice, pairBtcUsdc, sdk.NewInt(1000)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("-10000.000100000001000000"), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(10000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - )), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("-10000.000100000001000000"), - Margin: sdk.NewDec(2000), - OpenNotional: sdk.NewDec(10000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.NewDec(10_000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - BlockHeight: 2, - MarginToUser: sdk.NewInt(-1000), - ChangeReason: types.ChangeReason_AddMargin, - ExchangedNotional: sdk.MustNewDecFromStr("0"), - ExchangedSize: sdk.MustNewDecFromStr("0"), - }), - BalanceEqual(alice, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(10)), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.NewInt(10)), - ), - - TC("Testing fails"). - Given( - CreateCustomMarket(pairBtcUsdc), - CreateCustomMarket(pairEthUsdc), - - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1020)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_LONG, sdk.NewInt(1000), sdk.NewDec(10), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - AddMarginFail(alice, asset.MustNewPair("luna:usdt"), sdk.NewInt(1000), types.ErrPairNotFound), - AddMarginFail(alice, pairEthUsdc, sdk.NewInt(1000), types.ErrPositionNotFound), - AddMarginFail(alice, pairBtcUsdc, sdk.NewInt(1000), sdkerrors.ErrInsufficientFunds), - - RemoveMarginFail(alice, asset.MustNewPair("luna:usdt"), sdk.NewInt(1000), types.ErrPairNotFound), - RemoveMarginFail(alice, pairEthUsdc, sdk.NewInt(1000), types.ErrPositionNotFound), - RemoveMarginFail(alice, pairBtcUsdc, sdk.NewInt(2000), types.ErrBadDebt), - RemoveMarginFail(alice, pairBtcUsdc, sdk.NewInt(900), types.ErrMarginRatioTooLow), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestRemoveMargin(t *testing.T) { - alice := testutil.AccAddress() - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - startBlockTime := time.Now() - - tc := TestCases{ - TC("existing long position, remove margin"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1002)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_LONG, sdk.NewInt(1000), sdk.OneDec(), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - RemoveMargin(alice, pairBtcUsdc, sdk.NewInt(500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("999.999999000000001000"), - Margin: sdk.NewDec(500), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("999.999999000000001000"), - Margin: sdk.NewDec(500), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.NewDec(1000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - BlockHeight: 2, - MarginToUser: sdk.NewInt(500), - ChangeReason: types.ChangeReason_RemoveMargin, - ExchangedNotional: sdk.MustNewDecFromStr("0"), - ExchangedSize: sdk.MustNewDecFromStr("0"), - }), - BalanceEqual(alice, denoms.USDC, sdk.NewInt(500)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.OneInt()), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.OneInt()), - ), - - TC("existing long position, remove almost all margin fails"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1002)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_LONG, sdk.NewInt(1000), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - RemoveMarginFail(alice, pairBtcUsdc, sdk.NewInt(999), types.ErrMarginRatioTooLow), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("999.999999000000001000"), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - })), - BalanceEqual(alice, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.OneInt()), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.OneInt()), - ), - - TC("existing short position, remove margin"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1002)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_SHORT, sdk.NewInt(1000), sdk.OneDec(), sdk.ZeroDec()), - ). - When( - MoveToNextBlock(), - RemoveMargin(alice, pairBtcUsdc, sdk.NewInt(500)), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("-1000.000001000000001000"), - Margin: sdk.NewDec(500), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - })), - PositionChangedEventShouldBeEqual(&types.PositionChangedEvent{ - FinalPosition: types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("-1000.000001000000001000"), - Margin: sdk.NewDec(500), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - PositionNotional: sdk.NewDec(1000), - RealizedPnl: sdk.ZeroDec(), - BadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - FundingPayment: sdk.ZeroDec(), - TransactionFee: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - BlockHeight: 2, - MarginToUser: sdk.NewInt(500), - ChangeReason: types.ChangeReason_RemoveMargin, - ExchangedNotional: sdk.MustNewDecFromStr("0"), - ExchangedSize: sdk.MustNewDecFromStr("0"), - }), - BalanceEqual(alice, denoms.USDC, sdk.NewInt(500)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.OneInt()), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.OneInt()), - ), - - TC("existing short position, remove almost all margin fails"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockNumber(1), - SetBlockTime(startBlockTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1002)))), - MarketOrder(alice, pairBtcUsdc, types.Direction_SHORT, sdk.NewInt(1000), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - RemoveMarginFail(alice, pairBtcUsdc, sdk.NewInt(999), types.ErrMarginRatioTooLow), - ). - Then( - PositionShouldBeEqual(alice, pairBtcUsdc, Position_PositionShouldBeEqualTo(types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.MustNewDecFromStr("-1000.000001000000001000"), - Margin: sdk.NewDec(1000), - OpenNotional: sdk.NewDec(1000), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - })), - BalanceEqual(alice, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.OneInt()), - ModuleBalanceEqual(types.FeePoolModuleAccount, denoms.USDC, sdk.OneInt()), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/keeper/msg_server.go b/x/perp/v2/keeper/msg_server.go deleted file mode 100644 index 9c0bfb61e..000000000 --- a/x/perp/v2/keeper/msg_server.go +++ /dev/null @@ -1,122 +0,0 @@ -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type msgServer struct { - k Keeper -} - -var _ types.MsgServer = msgServer{} - -// NewMsgServerImpl returns an implementation of the MsgServer interface -// for the provided Keeper. -func NewMsgServerImpl(keeper Keeper) types.MsgServer { - return &msgServer{k: keeper} -} - -func (m msgServer) RemoveMargin(ctx context.Context, msg *types.MsgRemoveMargin, -) (*types.MsgRemoveMarginResponse, error) { - // These fields should have already been validated by MsgRemoveMargin.ValidateBasic() prior to being sent to the msgServer. - traderAddr := sdk.MustAccAddressFromBech32(msg.Sender) - return m.k.RemoveMargin(sdk.UnwrapSDKContext(ctx), msg.Pair, traderAddr, msg.Margin) -} - -func (m msgServer) AddMargin(ctx context.Context, msg *types.MsgAddMargin, -) (*types.MsgAddMarginResponse, error) { - // These fields should have already been validated by MsgAddMargin.ValidateBasic() prior to being sent to the msgServer. - traderAddr := sdk.MustAccAddressFromBech32(msg.Sender) - return m.k.AddMargin(sdk.UnwrapSDKContext(ctx), msg.Pair, traderAddr, msg.Margin) -} - -func (m msgServer) MarketOrder(goCtx context.Context, req *types.MsgMarketOrder, -) (response *types.MsgMarketOrderResponse, err error) { - traderAddr := sdk.MustAccAddressFromBech32(req.Sender) - - positionResp, err := m.k.MarketOrder( - sdk.UnwrapSDKContext(goCtx), - req.Pair, - req.Side, - traderAddr, - req.QuoteAssetAmount, - req.Leverage, - sdk.NewDecFromInt(req.BaseAssetAmountLimit), - ) - if err != nil { - return nil, err - } - - return &types.MsgMarketOrderResponse{ - Position: &positionResp.Position, - ExchangedNotionalValue: positionResp.ExchangedNotionalValue, - ExchangedPositionSize: positionResp.ExchangedPositionSize, - FundingPayment: positionResp.FundingPayment, - RealizedPnl: positionResp.RealizedPnl, - UnrealizedPnlAfter: positionResp.UnrealizedPnlAfter, - MarginToVault: positionResp.MarginToVault, - PositionNotional: positionResp.PositionNotional, - }, nil -} - -func (m msgServer) ClosePosition(goCtx context.Context, req *types.MsgClosePosition) (*types.MsgClosePositionResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - traderAddr := sdk.MustAccAddressFromBech32(req.Sender) - - resp, err := m.k.ClosePosition(ctx, req.Pair, traderAddr) - if err != nil { - return nil, err - } - - return &types.MsgClosePositionResponse{ - ExchangedNotionalValue: resp.ExchangedNotionalValue, - ExchangedPositionSize: resp.ExchangedPositionSize, - FundingPayment: resp.FundingPayment, - RealizedPnl: resp.RealizedPnl, - MarginToTrader: resp.MarginToVault.Neg(), - }, nil -} - -func (m msgServer) PartialClose(goCtx context.Context, req *types.MsgPartialClose) (*types.MsgPartialCloseResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - traderAddr := sdk.MustAccAddressFromBech32(req.Sender) - - resp, err := m.k.PartialClose(ctx, req.Pair, traderAddr, req.Size_) - if err != nil { - return nil, err - } - - return &types.MsgPartialCloseResponse{ - ExchangedNotionalValue: resp.ExchangedNotionalValue, - ExchangedPositionSize: resp.ExchangedPositionSize, - FundingPayment: resp.FundingPayment, - RealizedPnl: resp.RealizedPnl, - MarginToTrader: resp.MarginToVault.Neg(), - }, nil -} - -func (m msgServer) MultiLiquidate(goCtx context.Context, req *types.MsgMultiLiquidate) (*types.MsgMultiLiquidateResponse, error) { - resp, err := m.k.MultiLiquidate(sdk.UnwrapSDKContext(goCtx), sdk.MustAccAddressFromBech32(req.Sender), req.Liquidations) - if err != nil { - return nil, err - } - - return &types.MsgMultiLiquidateResponse{Liquidations: resp}, nil -} - -func (m msgServer) DonateToEcosystemFund(ctx context.Context, msg *types.MsgDonateToEcosystemFund) (*types.MsgDonateToEcosystemFundResponse, error) { - if err := m.k.BankKeeper.SendCoinsFromAccountToModule( - sdk.UnwrapSDKContext(ctx), - sdk.MustAccAddressFromBech32(msg.Sender), - types.PerpEFModuleAccount, - sdk.NewCoins(msg.Donation), - ); err != nil { - return nil, err - } - - return &types.MsgDonateToEcosystemFundResponse{}, nil -} diff --git a/x/perp/v2/keeper/msg_server_test.go b/x/perp/v2/keeper/msg_server_test.go deleted file mode 100644 index 2f04d55fd..000000000 --- a/x/perp/v2/keeper/msg_server_test.go +++ /dev/null @@ -1,338 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestMsgServerMarketOrder(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - alice := testutil.AccAddress() - - tests := TestCases{ - TC("open long position"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - ). - When( - MsgServerMarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroInt()), - ). - Then( - PositionShouldBeEqual(alice, pair, - Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pair, - Size_: sdk.MustNewDecFromStr("0.999999999999"), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - }), - ), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(99)), - ), - - TC("open short position"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - ). - When( - MsgServerMarketOrder(alice, pair, types.Direction_SHORT, sdk.OneInt(), sdk.OneDec(), sdk.ZeroInt()), - ). - Then( - PositionShouldBeEqual(alice, pair, - Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pair, - Size_: sdk.MustNewDecFromStr("-1.000000000001"), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 1, - }), - ), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(99)), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestMsgServerClosePosition(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - alice := testutil.AccAddress() - - tests := TestCases{ - TC("close long position"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - MarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - MsgServerClosePosition(alice, pair), - ). - Then( - PositionShouldNotExist(alice, pair), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(100)), - ), - - TC("close short position"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - MarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - MsgServerClosePosition(alice, pair), - ). - Then( - PositionShouldNotExist(alice, pair), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(100)), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestMsgServerAddMargin(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - alice := testutil.AccAddress() - - tests := TestCases{ - TC("add margin"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - MarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - MsgServerAddMargin(alice, pair, sdk.OneInt()), - ). - Then( - PositionShouldBeEqual(alice, pair, - Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pair, - Size_: sdk.MustNewDecFromStr("0.999999999999"), - Margin: sdk.NewDec(2), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }), - ), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(98)), - ), - TC("partial close"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - MarketOrder(alice, pair, types.Direction_LONG, sdk.OneInt(), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - MsgServerAddMargin(alice, pair, sdk.OneInt()), - ). - Then( - PositionShouldBeEqual(alice, pair, - Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pair, - Size_: sdk.MustNewDecFromStr("0.999999999999"), - Margin: sdk.NewDec(2), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }), - ), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(98)), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestMsgServerRemoveMargin(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - alice := testutil.AccAddress() - - tests := TestCases{ - TC("add margin"). - Given( - CreateCustomMarket(pair), - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - MarketOrder(alice, pair, types.Direction_LONG, sdk.NewInt(2), sdk.OneDec(), sdk.ZeroDec()), - MoveToNextBlock(), - ). - When( - MsgServerRemoveMargin(alice, pair, sdk.OneInt()), - ). - Then( - PositionShouldBeEqual(alice, pair, - Position_PositionShouldBeEqualTo(types.Position{ - TraderAddress: alice.String(), - Pair: pair, - Size_: sdk.MustNewDecFromStr("1.999999999996"), - Margin: sdk.OneDec(), - OpenNotional: sdk.NewDec(2), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }), - ), - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(99)), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestMsgServerDonateToPerpEf(t *testing.T) { - alice := testutil.AccAddress() - - tests := TestCases{ - TC("success"). - Given( - FundAccount(alice, sdk.NewCoins(sdk.NewInt64Coin(denoms.NUSD, 100))), - ). - When( - MsgServerDonateToPerpEf(alice, sdk.NewInt(50)), - ). - Then( - BalanceEqual(alice, denoms.NUSD, sdk.NewInt(50)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.NUSD, sdk.NewInt(50)), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestMsgServerMultiLiquidate(t *testing.T) { - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - alice := testutil.AccAddress() - liquidator := testutil.AccAddress() - startTime := time.Now() - - tests := TestCases{ - TC("partial liquidation"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10400))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MsgServerMultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(750)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(125)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(125)), - PositionShouldBeEqual(alice, pairBtcUsdc, - Position_PositionShouldBeEqualTo( - types.Position{ - Pair: pairBtcUsdc, - TraderAddress: alice.String(), - Size_: sdk.NewDec(5000), - Margin: sdk.MustNewDecFromStr("549.999951250000493750"), - OpenNotional: sdk.MustNewDecFromStr("5199.999975000000375000"), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: 2, - }, - ), - ), - ), - - TC("full liquidation"). - Given( - SetBlockNumber(1), - SetBlockTime(startTime), - CreateCustomMarket(pairBtcUsdc), - InsertPosition(WithTrader(alice), WithPair(pairBtcUsdc), WithSize(sdk.NewDec(10000)), WithMargin(sdk.NewDec(1000)), WithOpenNotional(sdk.NewDec(10600))), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewInt64Coin(denoms.USDC, 1000))), - ). - When( - MoveToNextBlock(), - MsgServerMultiLiquidate(liquidator, false, - PairTraderTuple{Pair: pairBtcUsdc, Trader: alice, Successful: true}, - ), - ). - Then( - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.NewInt(600)), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.NewInt(150)), - BalanceEqual(liquidator, denoms.USDC, sdk.NewInt(250)), - PositionShouldNotExist(alice, pairBtcUsdc), - ), - } - - NewTestSuite(t).WithTestCases(tests...).Run() -} - -func TestFailMsgServer(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - app, ctx := testapp.NewNibiruTestAppAndContext() - - msgServer := keeper.NewMsgServerImpl(app.PerpKeeperV2) - - _, err := msgServer.MarketOrder(ctx, &types.MsgMarketOrder{ - Sender: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Pair: pair, - Side: types.Direction_LONG, - QuoteAssetAmount: sdk.OneInt(), - Leverage: sdk.OneDec(), - BaseAssetAmountLimit: sdk.ZeroInt(), - }) - require.ErrorContains(t, err, "pair ubtc:unusd not found") - - _, err = msgServer.ClosePosition(ctx, &types.MsgClosePosition{ - Sender: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Pair: pair, - }) - require.ErrorContains(t, err, types.ErrPairNotFound.Error()) - - _, err = msgServer.PartialClose(ctx, &types.MsgPartialClose{ - Sender: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Pair: pair, - Size_: sdk.OneDec(), - }) - require.ErrorContains(t, err, types.ErrPairNotFound.Error()) - - _, err = msgServer.MultiLiquidate(ctx, &types.MsgMultiLiquidate{ - Sender: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Liquidations: []*types.MsgMultiLiquidate_Liquidation{ - { - Pair: pair, - Trader: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - }, - }, - }) - require.ErrorContains(t, err, types.ErrPairNotFound.Error()) - - _, err = msgServer.DonateToEcosystemFund(ctx, &types.MsgDonateToEcosystemFund{ - Sender: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Donation: sdk.NewCoin("luna", sdk.OneInt()), - }) - require.ErrorContains(t, err, "spendable balance is smaller than 1luna") -} diff --git a/x/perp/v2/keeper/position.go b/x/perp/v2/keeper/position.go deleted file mode 100644 index da9643fbb..000000000 --- a/x/perp/v2/keeper/position.go +++ /dev/null @@ -1,32 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/collections" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func (k Keeper) GetPosition(ctx sdk.Context, pair asset.Pair, version uint64, account sdk.AccAddress) (types.Position, error) { - position, err := k.Positions.Get(ctx, collections.Join(collections.Join(pair, version), account)) - if err != nil { - return types.Position{}, types.ErrPositionNotFound - } - - return position, nil -} - -func (k Keeper) DeletePosition(ctx sdk.Context, pair asset.Pair, version uint64, account sdk.AccAddress) error { - err := k.Positions.Delete(ctx, collections.Join(collections.Join(pair, version), account)) - if err != nil { - return types.ErrPositionNotFound - } - - return nil -} - -func (k Keeper) SavePosition(ctx sdk.Context, pair asset.Pair, version uint64, account sdk.AccAddress, position types.Position) { - k.Positions.Insert(ctx, collections.Join(collections.Join(position.Pair, version), account), position) -} diff --git a/x/perp/v2/keeper/position_test.go b/x/perp/v2/keeper/position_test.go deleted file mode 100644 index b55569d4a..000000000 --- a/x/perp/v2/keeper/position_test.go +++ /dev/null @@ -1 +0,0 @@ -package keeper diff --git a/x/perp/v2/keeper/settlement.go b/x/perp/v2/keeper/settlement.go deleted file mode 100644 index cc60c73e0..000000000 --- a/x/perp/v2/keeper/settlement.go +++ /dev/null @@ -1,33 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -// CloseMarket closes the market. From now on, no new position can be opened on this market or closed. -// Only the open positions can be settled by calling SettlePosition. -func (k Keeper) CloseMarket(ctx sdk.Context, pair asset.Pair) (err error) { - market, err := k.GetMarket(ctx, pair) - if err != nil { - return err - } - amm, err := k.GetAMM(ctx, pair) - if err != nil { - return err - } - - settlementPrice, _, err := amm.ComputeSettlementPrice() - if err != nil { - return - } - - amm.SettlementPrice = settlementPrice - market.Enabled = false - - k.SaveAMM(ctx, amm) - k.SaveMarket(ctx, market) - - return nil -} diff --git a/x/perp/v2/keeper/settlement_test.go b/x/perp/v2/keeper/settlement_test.go deleted file mode 100644 index b819b1866..000000000 --- a/x/perp/v2/keeper/settlement_test.go +++ /dev/null @@ -1,116 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestDisableMarket(t *testing.T) { - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - startTime := time.Now() - alice := testutil.AccAddress() - - tc := TestCases{ - TC("market can be disabled"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - MarketShouldBeEqual( - pairBtcUsdc, - Market_EnableShouldBeEqualTo(true), - ), - ). - When( - CloseMarket(pairBtcUsdc), - ). - Then( - MarketShouldBeEqual( - pairBtcUsdc, - Market_EnableShouldBeEqualTo(false), - ), - ), - TC("cannot open position on disabled market"). - Given( - CreateCustomMarket( - pairBtcUsdc, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startTime), - - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(1e6)))), - ). - When( - CloseMarket(pairBtcUsdc), - ). - Then( - MarketOrderFails( - alice, - pairBtcUsdc, - types.Direction_LONG, - sdk.NewInt(10_000), - sdk.OneDec(), - sdk.ZeroDec(), - types.ErrMarketNotEnabled, - ), - ), - TC("cannot close position on disabled market").When( - CreateCustomMarket( - pairBtcUsdc, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200)))), - MarketOrder( - alice, - pairBtcUsdc, - types.Direction_LONG, - sdk.NewInt(10_000), - sdk.OneDec(), - sdk.ZeroDec(), - ), - ).When( - CloseMarket(pairBtcUsdc), - ).Then( - ClosePositionFails(alice, pairBtcUsdc, types.ErrMarketNotEnabled), - ), - TC("cannot partial close position on disabled market").When( - CreateCustomMarket( - pairBtcUsdc, - WithPricePeg(sdk.OneDec()), - WithSqrtDepth(sdk.NewDec(100_000)), - ), - SetBlockNumber(1), - SetBlockTime(startTime), - FundAccount(alice, sdk.NewCoins(sdk.NewCoin(denoms.NUSD, sdk.NewInt(10_200)))), - MarketOrder( - alice, - pairBtcUsdc, - types.Direction_LONG, - sdk.NewInt(10_000), - sdk.OneDec(), - sdk.ZeroDec(), - ), - ).When( - CloseMarket(pairBtcUsdc), - AMMShouldBeEqual(pairBtcUsdc, AMM_SettlementPriceShoulBeEqual(sdk.MustNewDecFromStr("1.1"))), - ).Then( - PartialCloseFails(alice, pairBtcUsdc, sdk.NewDec(5_000), types.ErrMarketNotEnabled), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/keeper/swap.go b/x/perp/v2/keeper/swap.go deleted file mode 100644 index 8751e8389..000000000 --- a/x/perp/v2/keeper/swap.go +++ /dev/null @@ -1,113 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// checkUserLimits checks if the limit is violated by the amount. -// returns error if it does -func checkUserLimits(limit, amount sdk.Dec, dir types.Direction) error { - if limit.IsZero() { - return nil - } - - if dir == types.Direction_LONG && amount.LT(limit) { - return types.ErrAssetFailsUserLimit.Wrapf( - "amount (%s) is less than selected limit (%s)", - amount.String(), - limit.String(), - ) - } - - if dir == types.Direction_SHORT && amount.GT(limit) { - return types.ErrAssetFailsUserLimit.Wrapf( - "amount (%s) is greater than selected limit (%s)", - amount.String(), - limit.String(), - ) - } - - return nil -} - -// SwapQuoteAsset trades quoteAssets in exchange for baseAssets. -// Updates the AMM reserves and persists it to state. -// -// args: -// - ctx: cosmos-sdk context -// - market: a market like BTC:NUSD -// - amm: the reserves of the AMM -// - dir: the direction the user takes -// - quoteAssetAmt: the amount of quote assets to swap, must be positive -// - baseAssetLimit: the limit of base assets to swap -// -// returns: -// - updatedAMM: the updated amm -// - baseAssetDelta: the amount of base assets swapped, unsigned -// - err: error if any -// -// NOTE: the baseAssetDelta is always positive -func (k Keeper) SwapQuoteAsset( - ctx sdk.Context, - amm types.AMM, - dir types.Direction, - quoteAssetAmt sdk.Dec, // unsigned - baseAssetLimit sdk.Dec, // unsigned -) (updatedAMM *types.AMM, baseAssetDelta sdk.Dec, err error) { - baseAssetDelta, err = amm.SwapQuoteAsset(quoteAssetAmt, dir) - if err != nil { - return nil, sdk.Dec{}, err - } - - if err := checkUserLimits(baseAssetLimit, baseAssetDelta, dir); err != nil { - return nil, sdk.Dec{}, err - } - - k.SaveAMM(ctx, amm) - - return &amm, baseAssetDelta, nil -} - -// SwapBaseAsset trades baseAssets in exchange for quoteAssets. -// Updates the AMM reserves and persists it to state. -// -// args: -// - ctx: cosmos-sdk context -// - market: a market like BTC:NUSD -// - amm: the reserves of the AMM -// - dir: the direction the user takes -// - baseAssetAmt: the amount of base assets to swap, must be positive -// - quoteAssetLimit: the limit of quote assets to swap -// -// returns: -// - updatedAMM: the updated amm -// - quoteAssetDelta: the amount of quote assets swapped -// - err: error if any -// -// NOTE: the quoteAssetDelta is always positive -func (k Keeper) SwapBaseAsset( - ctx sdk.Context, - amm types.AMM, - dir types.Direction, - baseAssetAmt sdk.Dec, - quoteAssetLimit sdk.Dec, -) (updatedAMM *types.AMM, quoteAssetDelta sdk.Dec, err error) { - if baseAssetAmt.IsZero() { - return &amm, sdk.ZeroDec(), nil - } - - quoteAssetDelta, err = amm.SwapBaseAsset(baseAssetAmt, dir) - if err != nil { - return nil, sdk.Dec{}, err - } - - if err := checkUserLimits(quoteAssetLimit, quoteAssetDelta, dir); err != nil { - return nil, sdk.Dec{}, err - } - - k.SaveAMM(ctx, amm) - - return &amm, quoteAssetDelta, err -} diff --git a/x/perp/v2/keeper/swap_test.go b/x/perp/v2/keeper/swap_test.go deleted file mode 100644 index a2ea6ae0f..000000000 --- a/x/perp/v2/keeper/swap_test.go +++ /dev/null @@ -1,213 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestSwapQuoteAsset(t *testing.T) { - tests := []struct { - name string - direction types.Direction - quoteAssetAmt sdk.Dec - baseAssetLimit sdk.Dec - - expectedBaseAssetDelta sdk.Dec - expectedAMM *types.AMM - expectedErr error - }{ - { - name: "quote amount == 0", - direction: types.Direction_LONG, - quoteAssetAmt: sdk.ZeroDec(), - baseAssetLimit: sdk.ZeroDec(), - - expectedAMM: mock.TestAMMDefault(). - WithPriceMultiplier(sdk.NewDec(2)), - expectedBaseAssetDelta: sdk.ZeroDec(), - }, - { - name: "normal swap add", - direction: types.Direction_LONG, - quoteAssetAmt: sdk.NewDec(100_000), - baseAssetLimit: sdk.NewDec(49999), - - expectedAMM: mock.TestAMMDefault(). - WithQuoteReserve(sdk.NewDec(1_000_000_050_000)). - WithBaseReserve(sdk.MustNewDecFromStr("999999950000.002499999875000006")). - WithPriceMultiplier(sdk.NewDec(2)). - WithTotalLong(sdk.MustNewDecFromStr("49999.997500000124999994")), - expectedBaseAssetDelta: sdk.MustNewDecFromStr("49999.997500000124999994"), - }, - { - name: "normal swap remove", - direction: types.Direction_SHORT, - quoteAssetAmt: sdk.NewDec(100_000), - baseAssetLimit: sdk.NewDec(50_001), - - expectedAMM: mock.TestAMMDefault(). - WithQuoteReserve(sdk.NewDec(999_999_950_000)). - WithBaseReserve(sdk.MustNewDecFromStr("1000000050000.002500000125000006")). - WithPriceMultiplier(sdk.NewDec(2)). - WithTotalShort(sdk.MustNewDecFromStr("50000.002500000125000006")), - expectedBaseAssetDelta: sdk.MustNewDecFromStr("50000.002500000125000006"), - }, - { - name: "base amount less than base limit in Long", - direction: types.Direction_LONG, - quoteAssetAmt: sdk.NewDec(500_000), - baseAssetLimit: sdk.NewDec(454_500), - - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "base amount more than base limit in Short", - direction: types.Direction_SHORT, - quoteAssetAmt: sdk.NewDec(1e6), - baseAssetLimit: sdk.NewDec(454_500), - - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "over reserve amount when removing quote", - direction: types.Direction_SHORT, - quoteAssetAmt: sdk.NewDec(2e12 + 1), - baseAssetLimit: sdk.ZeroDec(), - - expectedErr: types.ErrQuoteReserveAtZero, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - amm := mock.TestAMMDefault().WithPriceMultiplier(sdk.NewDec(2)) - - updatedAMM, baseAmt, err := app.PerpKeeperV2.SwapQuoteAsset( - ctx, - *amm, - tc.direction, - tc.quoteAssetAmt, - tc.baseAssetLimit, - ) - - if tc.expectedErr != nil { - require.ErrorIs(t, err, tc.expectedErr) - } else { - require.NoError(t, err) - assert.EqualValuesf(t, tc.expectedBaseAssetDelta, baseAmt, "base amount mismatch") - - require.NoError(t, err) - assert.Equal(t, *tc.expectedAMM, *updatedAMM) - } - }) - } -} - -func TestSwapBaseAsset(t *testing.T) { - tests := []struct { - name string - direction types.Direction - baseAssetAmt sdk.Dec - quoteAssetLimit sdk.Dec - - expectedAMM *types.AMM - expectedQuoteAssetDelta sdk.Dec - expectedErr error - }{ - { - name: "zero base asset swap", - direction: types.Direction_LONG, - baseAssetAmt: sdk.ZeroDec(), - quoteAssetLimit: sdk.ZeroDec(), - - expectedAMM: mock.TestAMMDefault(). - WithPriceMultiplier(sdk.NewDec(2)), - expectedQuoteAssetDelta: sdk.ZeroDec(), - }, - { - name: "go long", - direction: types.Direction_LONG, - baseAssetAmt: sdk.NewDec(100_000), - quoteAssetLimit: sdk.NewDec(200_000), - - expectedAMM: mock.TestAMMDefault(). - WithBaseReserve(sdk.NewDec(999999900000)). - WithQuoteReserve(sdk.MustNewDecFromStr("1000000100000.010000001000000100")). - WithPriceMultiplier(sdk.NewDec((2))). - WithTotalLong(sdk.NewDec(100_000)), - expectedQuoteAssetDelta: sdk.MustNewDecFromStr("200000.020000002000000200"), - }, - { - name: "go short", - direction: types.Direction_SHORT, - baseAssetAmt: sdk.NewDec(100_000), - quoteAssetLimit: sdk.NewDec(200_000), - - expectedQuoteAssetDelta: sdk.MustNewDecFromStr("199999.980000001999999800"), - expectedAMM: mock.TestAMMDefault(). - WithBaseReserve(sdk.NewDec(1000000100000)). - WithQuoteReserve(sdk.MustNewDecFromStr("999999900000.009999999000000100")). - WithPriceMultiplier(sdk.NewDec((2))). - WithTotalShort(sdk.NewDec(100_000)), - }, - { - name: "quote asset amt less than quote limit in Long", - direction: types.Direction_LONG, - baseAssetAmt: sdk.NewDec(100_000), - quoteAssetLimit: sdk.NewDec(200_001), - - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "quote amount more than quote limit in Short", - direction: types.Direction_SHORT, - baseAssetAmt: sdk.NewDec(100_000), - quoteAssetLimit: sdk.NewDec(199_999), - - expectedErr: types.ErrAssetFailsUserLimit, - }, - { - name: "over reserve amount when removing base", - direction: types.Direction_LONG, - baseAssetAmt: sdk.NewDec(1e12 + 1), - quoteAssetLimit: sdk.ZeroDec(), - - expectedErr: types.ErrBaseReserveAtZero, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - amm := mock.TestAMMDefault().WithPriceMultiplier(sdk.NewDec(2)) - - updatedAMM, quoteAssetAmount, err := app.PerpKeeperV2.SwapBaseAsset( - ctx, - *amm, - tc.direction, - tc.baseAssetAmt, - tc.quoteAssetLimit, - ) - - if tc.expectedErr != nil { - require.ErrorContains(t, err, tc.expectedErr.Error()) - } else { - require.NoError(t, err) - assert.EqualValuesf(t, tc.expectedQuoteAssetDelta, quoteAssetAmount, - "expected %s; got %s", tc.expectedQuoteAssetDelta.String(), quoteAssetAmount.String()) - - assert.Equal(t, *tc.expectedAMM, *updatedAMM) - } - }) - } -} diff --git a/x/perp/v2/keeper/twap.go b/x/perp/v2/keeper/twap.go deleted file mode 100644 index 473fdac9b..000000000 --- a/x/perp/v2/keeper/twap.go +++ /dev/null @@ -1,184 +0,0 @@ -package keeper - -import ( - "time" - - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -/* -CalcTwap Gets the time-weighted average price from [ ctx.BlockTime() - interval, ctx.BlockTime() ) -Note the open-ended right bracket. - -args: - - ctx: cosmos-sdk context - - pair: the token pair - - twapCalcOption: one of SPOT, QUOTE_ASSET_SWAP, or BASE_ASSET_SWAP - - direction: add or remove, only required for QUOTE_ASSET_SWAP or BASE_ASSET_SWAP - - assetAmount: amount of asset to add or remove, only required for QUOTE_ASSET_SWAP or BASE_ASSET_SWAP - - lookbackInterval: how far back to calculate TWAP - -ret: - - price: TWAP as sdk.Dec - - err: error -*/ -func (k Keeper) CalcTwap( - ctx sdk.Context, - pair asset.Pair, - twapCalcOption types.TwapCalcOption, - direction types.Direction, - assetAmt sdk.Dec, - lookbackInterval time.Duration, -) (price sdk.Dec, err error) { - // earliest timestamp we'll look back until - lowerLimitTimestampMs := ctx.BlockTime().Add(-1 * lookbackInterval).UnixMilli() - - // fetch snapshots from state - var snapshots []types.ReserveSnapshot - iter := k.ReserveSnapshots.Iterate( - ctx, - collections.PairRange[asset.Pair, time.Time]{}. - Prefix(pair). - EndInclusive(ctx.BlockTime()). - Descending(), - ) - defer iter.Close() - for ; iter.Valid(); iter.Next() { - s := iter.Value() - snapshots = append(snapshots, s) - if s.TimestampMs <= lowerLimitTimestampMs { - break - } - } - - if len(snapshots) == 0 { - return sdk.OneDec().Neg(), types.ErrNoValidTWAP - } - - // circuit-breaker when there's only one snapshot to process - if len(snapshots) == 1 { - return getPriceWithSnapshot( - snapshots[0], - snapshotPriceOps{ - twapCalcOption: twapCalcOption, - direction: direction, - assetAmt: assetAmt, - }, - ) - } - - // else, iterate over all snapshots and calculate TWAP - prevTimestampMs := ctx.BlockTime().UnixMilli() - cumulativePrice := sdk.ZeroDec() - cumulativePeriodMs := int64(0) - - for _, snapshot := range snapshots { - if snapshot.TimestampMs == prevTimestampMs { - // in some extreme cases, 2 reserves snapshots can have the same timestamp which would cause a divide by zero error - // in this case, we skip the second snapshot - continue - } - - price, err := getPriceWithSnapshot( - snapshot, - snapshotPriceOps{ - twapCalcOption: twapCalcOption, - direction: direction, - assetAmt: assetAmt, - }, - ) - if err != nil { - return sdk.Dec{}, err - } - - var timeElapsedMs int64 - if snapshot.TimestampMs <= lowerLimitTimestampMs { - // if we're at a snapshot below lowerLimitTimestamp, then consider that price as starting from the lower limit timestamp - timeElapsedMs = prevTimestampMs - lowerLimitTimestampMs - } else { - timeElapsedMs = prevTimestampMs - snapshot.TimestampMs - } - - cumulativePrice = cumulativePrice.Add(price.MulInt64(timeElapsedMs)) - cumulativePeriodMs += timeElapsedMs - - if snapshot.TimestampMs <= lowerLimitTimestampMs { - break - } - prevTimestampMs = snapshot.TimestampMs - } - - if cumulativePeriodMs == 0 { - // Should not be reachable - return getPriceWithSnapshot( - snapshots[0], - snapshotPriceOps{ - twapCalcOption: twapCalcOption, - direction: direction, - assetAmt: assetAmt, - }, - ) - } - - return cumulativePrice.QuoInt64(cumulativePeriodMs), nil -} - -/* -An object parameter for getPriceWithSnapshot(). - -Specifies how to read the price from a single snapshot. There are three ways: -SPOT: spot price -QUOTE_ASSET_SWAP: price when swapping y amount of quote assets -BASE_ASSET_SWAP: price when swapping x amount of base assets -*/ -type snapshotPriceOps struct { - twapCalcOption types.TwapCalcOption - direction types.Direction - assetAmt sdk.Dec -} - -/* -Pure function that returns a price from a snapshot. - -Can choose from three types of calc options: SPOT, QUOTE_ASSET_SWAP, and BASE_ASSET_SWAP. -QUOTE_ASSET_SWAP and BASE_ASSET_SWAP require the `direction“ and `assetAmount“ args. -SPOT does not require `direction` and `assetAmount`. - -args: - - pair: the token pair - - snapshot: a reserve snapshot - - twapCalcOption: SPOT, QUOTE_ASSET_SWAP, or BASE_ASSET_SWAP - - direction: add or remove; only required for QUOTE_ASSET_SWAP or BASE_ASSET_SWAP - - assetAmount: the amount of base or quote asset; only required for QUOTE_ASSET_SWAP or BASE_ASSET_SWAP - -ret: - - price: the price as sdk.Dec - - err: error -*/ -func getPriceWithSnapshot( - snapshot types.ReserveSnapshot, - opts snapshotPriceOps, -) (price sdk.Dec, err error) { - priceMult := snapshot.Amm.PriceMultiplier - switch opts.twapCalcOption { - case types.TwapCalcOption_SPOT: - return snapshot.Amm.QuoteReserve.Mul(priceMult).Quo(snapshot.Amm.BaseReserve), nil - - case types.TwapCalcOption_QUOTE_ASSET_SWAP: - quoteReserve := types.QuoteAssetToReserve(opts.assetAmt, priceMult) - return snapshot.Amm.GetBaseReserveAmt(quoteReserve, opts.direction) - - case types.TwapCalcOption_BASE_ASSET_SWAP: - quoteReserve, err := snapshot.Amm.GetQuoteReserveAmt(opts.assetAmt, opts.direction) - if err != nil { - return sdk.Dec{}, err - } - return types.QuoteReserveToAsset(quoteReserve, priceMult), nil - } - - return sdk.ZeroDec(), nil -} diff --git a/x/perp/v2/keeper/twap_test.go b/x/perp/v2/keeper/twap_test.go deleted file mode 100644 index 03129df35..000000000 --- a/x/perp/v2/keeper/twap_test.go +++ /dev/null @@ -1,404 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/collections" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" - - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" -) - -func TestCalcTwap(t *testing.T) { - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - startTime := time.Now() - - tc := TestCases{ - TC("spot twap"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertReserveSnapshot(pairBtcUsdc, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.NewDec(10))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.NewDec(11))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - TwapShouldBe(pairBtcUsdc, types.TwapCalcOption_SPOT, types.Direction_DIRECTION_UNSPECIFIED, sdk.ZeroDec(), 30*time.Second, sdk.NewDec(10)), - ), - - TC("base asset twap, long"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertReserveSnapshot(pairBtcUsdc, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.NewDec(10))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.NewDec(11))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - TwapShouldBe(pairBtcUsdc, types.TwapCalcOption_BASE_ASSET_SWAP, types.Direction_LONG, sdk.NewDec(5), 30*time.Second, sdk.MustNewDecFromStr("50.000000000250000000")), - ), - - TC("base asset twap, short"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertReserveSnapshot(pairBtcUsdc, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.NewDec(10))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.NewDec(11))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - TwapShouldBe(pairBtcUsdc, types.TwapCalcOption_BASE_ASSET_SWAP, types.Direction_SHORT, sdk.NewDec(5), 30*time.Second, sdk.MustNewDecFromStr("49.999999999750000000")), - ), - - TC("quote asset twap, long"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertReserveSnapshot(pairBtcUsdc, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.NewDec(10))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.NewDec(11))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - TwapShouldBe(pairBtcUsdc, types.TwapCalcOption_QUOTE_ASSET_SWAP, types.Direction_LONG, sdk.NewDec(5), 30*time.Second, sdk.MustNewDecFromStr("0.503367003366748282")), - ), - - TC("quote asset twap, short"). - Given( - CreateCustomMarket(pairBtcUsdc), - SetBlockTime(startTime), - InsertReserveSnapshot(pairBtcUsdc, startTime, WithPriceMultiplier(sdk.NewDec(9))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(10*time.Second), WithPriceMultiplier(sdk.NewDec(10))), - InsertReserveSnapshot(pairBtcUsdc, startTime.Add(20*time.Second), WithPriceMultiplier(sdk.NewDec(11))), - ). - When( - MoveToNextBlockWithDuration(30 * time.Second), - ). - Then( - TwapShouldBe(pairBtcUsdc, types.TwapCalcOption_QUOTE_ASSET_SWAP, types.Direction_SHORT, sdk.NewDec(5), 30*time.Second, sdk.MustNewDecFromStr("0.503367003367258451")), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} - -func TestInvalidTwap(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - app, _ := testapp.NewNibiruTestAppAndContext() - ctx := app.NewContext(false, tmproto.Header{ - Height: 1, - }) - startTime := time.UnixMilli(0) - - app.PerpKeeperV2.SaveMarket(ctx, *mock.TestMarket()) - app.PerpKeeperV2.SaveAMM(ctx, *mock.TestAMMDefault()) - app.PerpKeeperV2.ReserveSnapshots.Insert( - ctx, collections.Join(pair, startTime), types.ReserveSnapshot{ - Amm: *mock.TestAMMDefault(), - TimestampMs: 0, - }) - - tc := struct { - twapCalcOption types.TwapCalcOption - direction types.Direction - assetAmount sdk.Dec - lookbackInterval time.Duration - }{ - twapCalcOption: types.TwapCalcOption_SPOT, - direction: types.Direction_DIRECTION_UNSPECIFIED, - assetAmount: sdk.ZeroDec(), - lookbackInterval: 30 * time.Second, - } - _, err := app.PerpKeeperV2.CalcTwap(ctx, - pair, - tc.twapCalcOption, - tc.direction, - tc.assetAmount, - tc.lookbackInterval, - ) - require.ErrorIs(t, err, types.ErrNoValidTWAP) -} - -func TestCalcTwapExtended(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - tests := []struct { - name string - reserveSnapshots []types.ReserveSnapshot - currentBlockTime time.Time - currentBlockHeight int64 - lookbackInterval time.Duration - twapCalcOption types.TwapCalcOption - direction types.Direction - assetAmount sdk.Dec - expectedPrice sdk.Dec - expectedErr error - }{ - // Same price at 9 for 20 milliseconds - { - name: "spot price twap calc, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.NewDec(9)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.NewDec(9)), - TimestampMs: 20, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.NewDec(9)), - TimestampMs: 30, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_SPOT, - expectedPrice: sdk.MustNewDecFromStr("9"), - }, - // expected price: (9.5 * (30 - 30) + 8.5 * (30 - 20) + 9 * (20 - 10)) / (10 + 10) - { - name: "spot price twap calc, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.NewDec(9)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.MustNewDecFromStr("8.5")), - TimestampMs: 20, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.MustNewDecFromStr("9.5")), - TimestampMs: 30, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_SPOT, - expectedPrice: sdk.MustNewDecFromStr("8.75"), - }, - // expected price: (95/10 * (35 - 30) + 85/10 * (30 - 20) + 90/10 * (20 - 11)) / (5 + 10 + 9) - { - name: "spot price twap calc, t=[11,35]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.NewDec(9)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.MustNewDecFromStr("8.5")), - TimestampMs: 20, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(100), sdk.MustNewDecFromStr("9.5")), - TimestampMs: 30, - }, - }, - currentBlockTime: time.UnixMilli(35), - currentBlockHeight: 4, - lookbackInterval: 24 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_SPOT, - expectedPrice: sdk.MustNewDecFromStr("8.895833333333333333"), - }, - - // base asset reserve at t = 0: 100 - // quote asset reserve at t = 0: 100 - // expected price: 1 - { - name: "spot price twap calc, t=[0,0]", - reserveSnapshots: []types.ReserveSnapshot{}, - currentBlockTime: time.UnixMilli(0), - currentBlockHeight: 1, - lookbackInterval: 0 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_SPOT, - expectedPrice: sdk.OneDec(), - }, - - // expected price: (95/10 * (35 - 30) + 85/10 * (30 - 20) + 90/10 * (20 - 11)) / (5 + 10 + 9) - { - name: "quote asset swap twap calc, add to pool, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(3)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(5)), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_QUOTE_ASSET_SWAP, - direction: types.Direction_LONG, - assetAmount: sdk.NewDec(5), - expectedPrice: sdk.MustNewDecFromStr("1.331447254908153411"), // ~ 5 base at a twap price of 4 - }, - - // expected price: (95/10 * (35 - 30) + 85/10 * (30 - 20) + 90/10 * (20 - 11)) / (5 + 10 + 9) - { - name: "quote asset swap twap calc, remove from pool, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(3)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(5)), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_QUOTE_ASSET_SWAP, - direction: types.Direction_SHORT, - assetAmount: sdk.NewDec(5), - expectedPrice: sdk.MustNewDecFromStr("1.335225041402003005"), // ~ 5 base at a twap price of 4 - }, - - { - name: "Error: quote asset reserve = asset amount", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(10), sdk.NewDec(2)), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_QUOTE_ASSET_SWAP, - direction: types.Direction_SHORT, - assetAmount: sdk.NewDec(20), - expectedErr: types.ErrQuoteReserveAtZero, - }, - - // k: 60 * 100 = 600 - // asset amount: 10 - // expected price: ((60 - 600/(10 + 10)) * (20 - 10) + (30 - 600/(20 + 10)) * (30 - 20)) / (10 + 10) - { - name: "base asset swap twap calc, add to pool, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(6)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.MustNewDecFromStr("1.5")), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_BASE_ASSET_SWAP, - direction: types.Direction_SHORT, - assetAmount: sdk.NewDec(10), - expectedPrice: sdk.MustNewDecFromStr("37.128712871287128712"), - }, - - // k: 60 * 100 = 600 - // asset amount: 10 - // expected price: ((60 - 600/(10 - 2)) * (20 - 10) + (75 - 600/(8 - 2)) * (30 - 20)) / (10 + 10) - { - name: "base asset swap twap calc, remove from pool, t=[10,30]", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.NewDec(6)), - TimestampMs: 10, - }, - { - Amm: *mock.TestAMM(sdk.NewDec(1000), sdk.MustNewDecFromStr("9.375")), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_BASE_ASSET_SWAP, - direction: types.Direction_LONG, - assetAmount: sdk.NewDec(2), - expectedPrice: sdk.MustNewDecFromStr("15.405811623246492984"), - }, - { - name: "Error: base asset reserve = asset amount", - reserveSnapshots: []types.ReserveSnapshot{ - { - Amm: *mock.TestAMM(sdk.NewDec(10), sdk.NewDec(9)), - TimestampMs: 20, - }, - }, - currentBlockTime: time.UnixMilli(30), - currentBlockHeight: 3, - lookbackInterval: 20 * time.Millisecond, - twapCalcOption: types.TwapCalcOption_BASE_ASSET_SWAP, - direction: types.Direction_LONG, - assetAmount: sdk.NewDec(10), - expectedErr: types.ErrBaseReserveAtZero, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, _ := testapp.NewNibiruTestAppAndContext() - ctx := app.NewContext(false, tmproto.Header{ - Height: 1, - }) - startTime := time.UnixMilli(0) - - app.PerpKeeperV2.SaveMarket(ctx, *mock.TestMarket()) - app.PerpKeeperV2.SaveAMM(ctx, *mock.TestAMMDefault()) - app.PerpKeeperV2.ReserveSnapshots.Insert( - ctx, collections.Join(pair, startTime), types.ReserveSnapshot{ - Amm: *mock.TestAMMDefault(), - TimestampMs: 0, - }) - - for _, snapshot := range tc.reserveSnapshots { - ctx = ctx.WithBlockTime(time.UnixMilli(snapshot.TimestampMs)) - app.PerpKeeperV2.ReserveSnapshots.Insert(ctx, collections.Join(snapshot.Amm.Pair, time.UnixMilli(snapshot.TimestampMs)), snapshot) - } - ctx = ctx.WithBlockTime(tc.currentBlockTime).WithBlockHeight(tc.currentBlockHeight) - - price, err := app.PerpKeeperV2.CalcTwap(ctx, - pair, - tc.twapCalcOption, - tc.direction, - tc.assetAmount, - tc.lookbackInterval, - ) - require.ErrorIs(t, err, tc.expectedErr) - require.EqualValuesf(t, tc.expectedPrice, price, - "expected %s, got %s", tc.expectedPrice.String(), price.String()) - }) - } -} diff --git a/x/perp/v2/keeper/withdraw.go b/x/perp/v2/keeper/withdraw.go deleted file mode 100644 index 7d12a4465..000000000 --- a/x/perp/v2/keeper/withdraw.go +++ /dev/null @@ -1,130 +0,0 @@ -package keeper - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// WithdrawFromVault coins from the vault to the receiver. -// If the total amount of coins to withdraw is greater than the vault's amount, then -// withdraw the shortage from the PerpEF and mark it as prepaid bad debt. -// -// Prepaid bad debt will count towards realized bad debt from negative PnL positions -// when those are closed/liquidated. -// -// An example of this happening is when a long position has really high PnL and -// closes their position, realizing their profits. -// There is a counter party short position with really negative PnL, but -// their position hasn't been closed/liquidated yet. -// We must pay the long trader first, which results in funds being taken from the EF. -// when the short position is closed, it also realizes some bad debt but because -// we have already withdrawn from the EF, we don't need to withdraw more from the EF. -// -// args: -// - ctx: context -// - market: the perp market -// - receiver: the receiver of the coins -// - amountToWithdraw: amount of coins to withdraw -// -// returns: -// - error: error -func (k Keeper) WithdrawFromVault( - ctx sdk.Context, - market types.Market, - receiver sdk.AccAddress, - amountToWithdraw sdkmath.Int, -) (err error) { - if !amountToWithdraw.IsPositive() { - return nil - } - - vaultQuoteBalance := k.BankKeeper.GetBalance( - ctx, - k.AccountKeeper.GetModuleAddress(types.VaultModuleAccount), - market.Pair.QuoteDenom(), - ) - if vaultQuoteBalance.Amount.LT(amountToWithdraw) { - // if withdraw amount is larger than entire balance of vault - // means this trader's profit comes from other under collateral position's future loss - // and the balance of entire vault is not enough - // need money from PerpEF to pay first, and record this prepaidBadDebt - shortage := amountToWithdraw.Sub(vaultQuoteBalance.Amount) - k.IncrementPrepaidBadDebt(ctx, market, shortage) - - // TODO(k-yang): emit event for prepaid bad debt - - if err := k.BankKeeper.SendCoinsFromModuleToModule( - ctx, - types.PerpEFModuleAccount, - types.VaultModuleAccount, - sdk.NewCoins( - sdk.NewCoin(market.Pair.QuoteDenom(), shortage), - ), - ); err != nil { - return err - } - } - - // Transfer from Vault to receiver - return k.BankKeeper.SendCoinsFromModuleToAccount( - ctx, - /* from */ types.VaultModuleAccount, - /* to */ receiver, - sdk.NewCoins( - sdk.NewCoin(market.Pair.QuoteDenom(), amountToWithdraw), - ), - ) -} - -// IncrementPrepaidBadDebt increases the bad debt for the provided denom. -func (k Keeper) IncrementPrepaidBadDebt(ctx sdk.Context, market types.Market, amount sdkmath.Int) { - market.PrepaidBadDebt.Amount = market.PrepaidBadDebt.Amount.Add(amount) - k.SaveMarket(ctx, market) -} - -// ZeroPrepaidBadDebt out the prepaid bad debt -func (k Keeper) ZeroPrepaidBadDebt(ctx sdk.Context, market types.Market) { - market.PrepaidBadDebt.Amount = sdk.ZeroInt() - k.SaveMarket(ctx, market) -} - -// DecrementPrepaidBadDebt decrements the amount of bad debt prepaid by denom. -func (k Keeper) DecrementPrepaidBadDebt(ctx sdk.Context, market types.Market, amount sdkmath.Int) { - market.PrepaidBadDebt.Amount = market.PrepaidBadDebt.Amount.Sub(amount) - k.SaveMarket(ctx, market) -} - -/* -Realizes the bad debt by first decrementing it from the prepaid bad debt. -Prepaid bad debt accrues when more coins are withdrawn from the vault than the -vault contains, so we "credit" ourselves with prepaid bad debt. - -then, when bad debt is actually realized (by closing underwater positions), we -can consume the credit we have built before withdrawing more from the ecosystem fund. -*/ -func (k Keeper) realizeBadDebt(ctx sdk.Context, market types.Market, badDebtToRealize sdkmath.Int) ( - err error, -) { - if market.PrepaidBadDebt.Amount.GTE(badDebtToRealize) { - // prepaidBadDebtBalance > badDebtToRealize - k.DecrementPrepaidBadDebt(ctx, market, badDebtToRealize) - } else { - // badDebtToRealize > prepaidBadDebtBalance - k.ZeroPrepaidBadDebt(ctx, market) - - return k.BankKeeper.SendCoinsFromModuleToModule(ctx, - /*from=*/ types.PerpEFModuleAccount, - /*to=*/ types.VaultModuleAccount, - sdk.NewCoins( - sdk.NewCoin( - market.Pair.QuoteDenom(), - badDebtToRealize.Sub(market.PrepaidBadDebt.Amount), - ), - ), - ) - } - - return nil -} diff --git a/x/perp/v2/keeper/withdraw_test.go b/x/perp/v2/keeper/withdraw_test.go deleted file mode 100644 index 5f0d60a7f..000000000 --- a/x/perp/v2/keeper/withdraw_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - . "github.com/NibiruChain/nibiru/x/common/testutil/action" - . "github.com/NibiruChain/nibiru/x/common/testutil/assertion" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/action" - . "github.com/NibiruChain/nibiru/x/perp/v2/integration/assertion" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestWithdrawFromVault(t *testing.T) { - alice := testutil.AccAddress() - pairBtcUsdc := asset.Registry.Pair(denoms.BTC, denoms.USDC) - startBlockTime := time.Now() - - tc := TestCases{ - TC("successful withdraw, no bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startBlockTime), - CreateCustomMarket(pairBtcUsdc), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1000)))), - ). - When( - WithdrawFromVault(pairBtcUsdc, alice, sdk.NewInt(1000)), - ). - Then( - BalanceEqual(alice, denoms.USDC, sdk.NewInt(1000)), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.ZeroInt()), - MarketShouldBeEqual(pairBtcUsdc, Market_PrepaidBadDebtShouldBeEqualTo(sdk.ZeroInt())), - ), - - TC("successful withdraw, some bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startBlockTime), - CreateCustomMarket(pairBtcUsdc), - FundModule(types.VaultModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(500)))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(500)))), - ). - When( - WithdrawFromVault(pairBtcUsdc, alice, sdk.NewInt(1000)), - ). - Then( - BalanceEqual(alice, denoms.USDC, sdk.NewInt(1000)), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - MarketShouldBeEqual(pairBtcUsdc, Market_PrepaidBadDebtShouldBeEqualTo(sdk.NewInt(500))), - ), - - TC("successful withdraw, all bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startBlockTime), - CreateCustomMarket(pairBtcUsdc), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1000)))), - ). - When( - WithdrawFromVault(pairBtcUsdc, alice, sdk.NewInt(1000)), - ). - Then( - BalanceEqual(alice, denoms.USDC, sdk.NewInt(1000)), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - MarketShouldBeEqual(pairBtcUsdc, Market_PrepaidBadDebtShouldBeEqualTo(sdk.NewInt(1000))), - ), - - TC("successful withdraw, existing bad debt"). - Given( - SetBlockNumber(1), - SetBlockTime(startBlockTime), - CreateCustomMarket(pairBtcUsdc, WithPrepaidBadDebt(sdk.NewInt(1000))), - FundModule(types.PerpEFModuleAccount, sdk.NewCoins(sdk.NewCoin(denoms.USDC, sdk.NewInt(1000)))), - ). - When( - WithdrawFromVault(pairBtcUsdc, alice, sdk.NewInt(1000)), - ). - Then( - BalanceEqual(alice, denoms.USDC, sdk.NewInt(1000)), - ModuleBalanceEqual(types.VaultModuleAccount, denoms.USDC, sdk.ZeroInt()), - ModuleBalanceEqual(types.PerpEFModuleAccount, denoms.USDC, sdk.ZeroInt()), - MarketShouldBeEqual(pairBtcUsdc, Market_PrepaidBadDebtShouldBeEqualTo(sdk.NewInt(2000))), - ), - } - - NewTestSuite(t).WithTestCases(tc...).Run() -} diff --git a/x/perp/v2/module/abci.go b/x/perp/v2/module/abci.go deleted file mode 100644 index 6326700dc..000000000 --- a/x/perp/v2/module/abci.go +++ /dev/null @@ -1,69 +0,0 @@ -package perp - -import ( - abci "github.com/cometbft/cometbft/abci/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/collections" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// EndBlocker Called every block to store a snapshot of the perpamm. -func EndBlocker(ctx sdk.Context, k keeper.Keeper) []abci.ValidatorUpdate { - for _, amm := range k.AMMs.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() { - market, err := k.GetMarket(ctx, amm.Pair) - if err != nil { - k.Logger(ctx).Error("failed to fetch market", "pair", amm.Pair, "error", err) - continue - } - - // only snapshot enabled markets - if !market.Enabled { - continue - } - - snapshot := types.ReserveSnapshot{ - Amm: amm, - TimestampMs: ctx.BlockTime().UnixMilli(), - } - k.ReserveSnapshots.Insert(ctx, collections.Join(amm.Pair, ctx.BlockTime()), snapshot) - - markTwap, err := k.CalcTwap(ctx, amm.Pair, types.TwapCalcOption_SPOT, types.Direction_DIRECTION_UNSPECIFIED, sdk.ZeroDec(), market.TwapLookbackWindow) - if err != nil { - k.Logger(ctx).Error("failed to fetch twap mark price", "market.Pair", market.Pair, "error", err) - continue - } - - if markTwap.IsNil() || markTwap.IsZero() { - k.Logger(ctx).Error("mark price is zero", "market.Pair", market.Pair) - continue - } - - var indexTwap sdk.Dec - indexTwap, err = k.OracleKeeper.GetExchangeRateTwap(ctx, amm.Pair) - if err != nil { - k.Logger(ctx).Error("failed to fetch twap index price", "market.Pair", market.Pair, "error", err) - indexTwap = sdk.OneDec().Neg() - } - - if indexTwap.IsNil() { - k.Logger(ctx).Error("index price is zero", "market.Pair", market.Pair) - continue - } - - _ = ctx.EventManager().EmitTypedEvent(&types.AmmUpdatedEvent{ - FinalAmm: amm, - MarkPriceTwap: markTwap, - IndexPriceTwap: indexTwap, - }) - - _ = ctx.EventManager().EmitTypedEvent(&types.MarketUpdatedEvent{ - FinalMarket: market, - }) - } - - return []abci.ValidatorUpdate{} -} diff --git a/x/perp/v2/module/abci_test.go b/x/perp/v2/module/abci_test.go deleted file mode 100644 index 4f24f356e..000000000 --- a/x/perp/v2/module/abci_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package perp_test - -import ( - "testing" - "time" - - "github.com/NibiruChain/collections" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - testutilevents "github.com/NibiruChain/nibiru/x/common/testutil" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - perp "github.com/NibiruChain/nibiru/x/perp/v2/module" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestSnapshotUpdates(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - initialMarket := *mock.TestMarket() - initialAmm := *mock.TestAMMDefault() - - runBlock := func(duration time.Duration) { - perp.EndBlocker(ctx, app.PerpKeeperV2) - ctx = ctx. - WithBlockHeight(ctx.BlockHeight() + 1). - WithBlockTime(ctx.BlockTime().Add(duration)) - } - - ctx = ctx.WithBlockTime(time.Date(2015, 10, 21, 0, 0, 0, 0, time.UTC)).WithBlockHeight(1) - - require.NoError(t, app.PerpKeeperV2.Admin().CreateMarket( - /* ctx */ ctx, keeper.ArgsCreateMarket{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - PriceMultiplier: initialAmm.PriceMultiplier, - SqrtDepth: initialAmm.SqrtDepth, - Market: &initialMarket, - }, - )) - - expectedSnapshot := types.ReserveSnapshot{ - Amm: initialAmm, - TimestampMs: ctx.BlockTime().UnixMilli(), - } - - t.Log("run one block of 5 seconds") - runBlock(5 * time.Second) - snapshot, err := app.PerpKeeperV2.ReserveSnapshots.Get(ctx, - collections.Join( - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - time.UnixMilli(expectedSnapshot.TimestampMs), - ), - ) - require.NoError(t, err) - assert.EqualValues(t, expectedSnapshot, snapshot) - - t.Log("affect mark price") - amm, err := app.PerpKeeperV2.GetAMM(ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD)) - require.NoError(t, err) - - _, baseAmtAbs, err := app.PerpKeeperV2.SwapQuoteAsset( - ctx, - amm, - types.Direction_LONG, - sdk.NewDec(250e9), - sdk.ZeroDec(), - ) - require.NoError(t, err) - // dxAmm := (k / (y + dyAmm)) - x = (1e24 / (1e12 + 250e9)) - 1e12 = -200e9 - assert.EqualValues(t, sdk.NewDec(200e9), baseAmtAbs) - - expectedSnapshot = types.ReserveSnapshot{ - Amm: types.AMM{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - Version: 1, - BaseReserve: sdk.NewDec(800e9), - QuoteReserve: sdk.NewDec(1.25e12), - SqrtDepth: sdk.NewDec(1e12), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(200e9), - TotalShort: sdk.ZeroDec(), - SettlementPrice: sdk.ZeroDec(), - }, - TimestampMs: ctx.BlockTime().UnixMilli(), - } - - t.Log("run one block of 5 seconds") - runBlock(5 * time.Second) - - snapshot, err = app.PerpKeeperV2.ReserveSnapshots.Get(ctx, - collections.Join( - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - time.UnixMilli(expectedSnapshot.TimestampMs), - ), - ) - require.NoError(t, err) - assert.EqualValues(t, expectedSnapshot, snapshot) -} - -func TestEndBlocker(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - initialMarket := *mock.TestMarket() - initialAmm := *mock.TestAMMDefault() - - runBlock := func(duration time.Duration) { - perp.EndBlocker(ctx, app.PerpKeeperV2) - ctx = ctx. - WithBlockHeight(ctx.BlockHeight() + 1). - WithBlockTime(ctx.BlockTime().Add(duration)) - } - - ctx = ctx.WithBlockTime(time.Date(2015, 10, 21, 0, 0, 0, 0, time.UTC)).WithBlockHeight(1) - - runBlock(5 * time.Second) - - require.NoError(t, app.PerpKeeperV2.Admin().CreateMarket( - /* ctx */ ctx, keeper.ArgsCreateMarket{ - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), - PriceMultiplier: initialAmm.PriceMultiplier, - SqrtDepth: initialAmm.SqrtDepth, - Market: &initialMarket, - }, - )) - - t.Log("run one block of 5 seconds") - app.OracleKeeper.SetPrice(ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD), sdk.NewDec(100e6)) - - beforeEvents := ctx.EventManager().Events() - runBlock(5 * time.Second) - afterEvents := ctx.EventManager().Events() - - testutilevents.AssertEventsPresent( - t, - testutilevents.FilterNewEvents(beforeEvents, afterEvents), - []string{"nibiru.perp.v2.AmmUpdatedEvent", "nibiru.perp.v2.MarketUpdatedEvent"}, - ) - - // add index price -} diff --git a/x/perp/v2/module/genesis.go b/x/perp/v2/module/genesis.go deleted file mode 100644 index a884058a0..000000000 --- a/x/perp/v2/module/genesis.go +++ /dev/null @@ -1,138 +0,0 @@ -package perp - -import ( - "time" - - "cosmossdk.io/math" - "github.com/NibiruChain/collections" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// InitGenesis initializes the capability module's state from a provided genesis -// state. -func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - if err := genState.Validate(); err != nil { - panic(err) - } - - k.DnREpoch.Set(ctx, genState.DnrEpoch) - - for _, m := range genState.Markets { - k.SaveMarket(ctx, m) - } - - for _, g := range genState.MarketLastVersions { - k.MarketLastVersion.Insert(ctx, g.Pair, types.MarketLastVersion{Version: g.Version}) - } - - for _, amm := range genState.Amms { - pair := amm.Pair - k.SaveAMM(ctx, amm) - timestampMs := ctx.BlockTime().UnixMilli() - k.ReserveSnapshots.Insert( - ctx, - collections.Join(pair, time.UnixMilli(timestampMs)), - types.ReserveSnapshot{ - Amm: amm, - TimestampMs: timestampMs, - }, - ) - } - - for _, p := range genState.Positions { - k.SavePosition(ctx, p.Pair, p.Version, sdk.MustAccAddressFromBech32(p.Position.TraderAddress), p.Position) - } - - for _, vol := range genState.TraderVolumes { - k.TraderVolumes.Insert( - ctx, - collections.Join(sdk.MustAccAddressFromBech32(vol.Trader), vol.Epoch), - vol.Volume, - ) - } - for _, globalDiscount := range genState.GlobalDiscount { - k.GlobalDiscounts.Insert( - ctx, - globalDiscount.Volume, - globalDiscount.Fee, - ) - } - - for _, customDiscount := range genState.CustomDiscounts { - k.TraderDiscounts.Insert( - ctx, - collections.Join(sdk.MustAccAddressFromBech32(customDiscount.Trader), customDiscount.Discount.Volume), - customDiscount.Discount.Fee, - ) - } -} - -// ExportGenesis returns the capability module's exported genesis. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - genesis := new(types.GenesisState) - - genesis.Markets = k.Markets.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() - - kv := k.MarketLastVersion.Iterate(ctx, collections.Range[asset.Pair]{}).KeyValues() - for _, kv := range kv { - genesis.MarketLastVersions = append(genesis.MarketLastVersions, types.GenesisMarketLastVersion{ - Pair: kv.Key, - Version: kv.Value.Version, - }) - } - - genesis.Amms = k.AMMs.Iterate(ctx, collections.Range[collections.Pair[asset.Pair, uint64]]{}).Values() - pkv := k.Positions.Iterate(ctx, collections.PairRange[collections.Pair[asset.Pair, uint64], sdk.AccAddress]{}).KeyValues() - for _, kv := range pkv { - genesis.Positions = append(genesis.Positions, types.GenesisPosition{ - Pair: kv.Key.K1().K1(), - Version: kv.Key.K1().K2(), - Position: kv.Value, - }) - } - genesis.ReserveSnapshots = k.ReserveSnapshots.Iterate(ctx, collections.PairRange[asset.Pair, time.Time]{}).Values() - genesis.DnrEpoch = k.DnREpoch.GetOr(ctx, 0) - - // export volumes - volumes := k.TraderVolumes.Iterate(ctx, collections.PairRange[sdk.AccAddress, uint64]{}) - defer volumes.Close() - for ; volumes.Valid(); volumes.Next() { - key := volumes.Key() - genesis.TraderVolumes = append(genesis.TraderVolumes, types.GenesisState_TraderVolume{ - Trader: key.K1().String(), - Epoch: key.K2(), - Volume: volumes.Value(), - }) - } - - // export global discounts - discounts := k.GlobalDiscounts.Iterate(ctx, collections.Range[math.Int]{}) - defer discounts.Close() - for ; discounts.Valid(); discounts.Next() { - genesis.GlobalDiscount = append(genesis.GlobalDiscount, types.GenesisState_Discount{ - Fee: discounts.Value(), - Volume: discounts.Key(), - }) - } - - // export custom discounts - customDiscounts := k.TraderDiscounts.Iterate(ctx, collections.PairRange[sdk.AccAddress, math.Int]{}) - defer customDiscounts.Close() - - for ; customDiscounts.Valid(); customDiscounts.Next() { - key := customDiscounts.Key() - genesis.CustomDiscounts = append(genesis.CustomDiscounts, types.GenesisState_CustomDiscount{ - Trader: key.K1().String(), - Discount: &types.GenesisState_Discount{ - Fee: sdk.Dec{}, - Volume: key.K2(), - }, - }) - } - return genesis -} diff --git a/x/perp/v2/module/genesis_test.go b/x/perp/v2/module/genesis_test.go deleted file mode 100644 index fd049b096..000000000 --- a/x/perp/v2/module/genesis_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package perp_test - -import ( - "encoding/json" - "testing" - - "cosmossdk.io/math" - "github.com/NibiruChain/collections" - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - perp "github.com/NibiruChain/nibiru/x/perp/v2/module" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -type TestCase struct { - name string - positions []types.Position -} - -func TestGenesis(t *testing.T) { - testCases := []TestCase{ - { - name: "empty positions genesis", - positions: []types.Position{}, - }, - } - - var positions []types.Position - // create some positions - for i := int64(1); i < 100; i++ { - trader := testutil.AccAddress() - position := types.Position{ - TraderAddress: trader.String(), - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - Size_: sdk.NewDec(i + 1), - Margin: sdk.NewDec(i * 2), - OpenNotional: sdk.NewDec(i * 100), - LatestCumulativePremiumFraction: sdk.NewDec(5 * 100), - LastUpdatedBlockNumber: i, - } - require.NoErrorf(t, position.Validate(), "position: %s", position) - positions = append(positions, position) - } - testCases = append(testCases, TestCase{ - name: "many valid positions", - positions: positions, - }) - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - RunTestGenesis(t, tc) - }) - } -} - -func RunTestGenesis(t *testing.T, tc TestCase) { - app, ctxUncached := testapp.NewNibiruTestAppAndContext() - ctx, _ := ctxUncached.CacheContext() - - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - - // create some params - app.PerpKeeperV2.SaveMarket(ctx, *mock.TestMarket()) - app.PerpKeeperV2.MarketLastVersion.Insert(ctx, pair, types.MarketLastVersion{Version: 1}) - app.PerpKeeperV2.SaveAMM(ctx, *mock.TestAMMDefault()) - app.PerpKeeperV2.TraderDiscounts.Insert(ctx, collections.Join(testutil.AccAddress(), math.NewInt(1_000_000)), sdk.MustNewDecFromStr("0.1")) - app.PerpKeeperV2.GlobalDiscounts.Insert(ctx, sdk.NewInt(1_000_000), sdk.MustNewDecFromStr("0.05")) - app.PerpKeeperV2.TraderVolumes.Insert(ctx, collections.Join(testutil.AccAddress(), uint64(0)), math.NewInt(1_000_000)) - - // create some positions - for _, position := range tc.positions { - trader := sdk.MustAccAddressFromBech32(position.TraderAddress) - app.PerpKeeperV2.SavePosition(ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD), 1, trader, position) - } - - // export genesis - genState := perp.ExportGenesis(ctx, app.PerpKeeperV2) - err := genState.Validate() - jsonBz, errMarshalJson := genesis.TEST_ENCODING_CONFIG.Marshaler.MarshalJSON(genState) - require.NoError(t, errMarshalJson) - require.NoErrorf(t, err, "genState: \n%s", jsonBz) - - // create new context and init genesis - ctx, _ = ctxUncached.CacheContext() - perp.InitGenesis(ctx, app.PerpKeeperV2, *genState) - - // export again to ensure they match - genStateAfterInit := perp.ExportGenesis(ctx, app.PerpKeeperV2) - - require.Len(t, genStateAfterInit.Markets, len(genState.Markets)) - for i, pm := range genState.Markets { - require.Equal(t, pm, genStateAfterInit.Markets[i]) - } - - require.Len(t, genStateAfterInit.MarketLastVersions, len(genState.MarketLastVersions)) - for i, mlv := range genState.MarketLastVersions { - require.Equal(t, mlv, genStateAfterInit.MarketLastVersions[i]) - } - - require.Len(t, genStateAfterInit.Amms, len(genState.Amms)) - for i, amm := range genState.Amms { - require.Equal(t, amm, genStateAfterInit.Amms[i]) - } - - require.Equal(t, len(genState.Positions), len(genStateAfterInit.Positions)) - for i, pos := range genState.Positions { - require.Equalf(t, pos, genStateAfterInit.Positions[i], "%s <-> %s", pos, genStateAfterInit.Positions[i]) - } - - require.Equal(t, genState.CustomDiscounts, genStateAfterInit.CustomDiscounts) - require.Equal(t, genState.GlobalDiscount, genStateAfterInit.GlobalDiscount) - require.Equal(t, genState.TraderVolumes, genStateAfterInit.TraderVolumes) -} - -func TestNewAppModuleBasic(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - binaryCodec := codec.NewProtoCodec(nil) // Provide appropriate codec interface registry - appModuleBasic := perp.NewAppModuleBasic(binaryCodec) - - require.Equal(t, types.ModuleName, appModuleBasic.Name()) - cdc := codec.NewProtoCodec(nil) - - appModule := perp.NewAppModule(cdc, app.PerpKeeperV2, nil, nil, nil) - - require.Equal(t, types.ModuleName, appModule.Name()) - require.Equal(t, uint64(3), appModule.ConsensusVersion()) - - exportedGenesis := appModule.ExportGenesis(ctx, cdc) - err := appModule.ValidateGenesis(cdc, nil, exportedGenesis) - require.NoError(t, err) - - // Test genesis functionalities - genesisState := types.DefaultGenesis() - rawGS, err := cdc.MarshalJSON(genesisState) - require.NoError(t, err) - - // Test DefaultGenesis - require.Equal(t, json.RawMessage(rawGS), appModule.DefaultGenesis(cdc)) - - // Test ValidateGenesis - err = appModule.ValidateGenesis(cdc, nil, rawGS) - require.NoError(t, err) - - appModule.BeginBlock(ctx, abci.RequestBeginBlock{}) - appModule.EndBlock(ctx, abci.RequestEndBlock{}) - - cmds := appModule.GetTxCmd() - require.Len(t, cmds.Commands(), 7) - - cmds = appModule.GetQueryCmd() - require.Len(t, cmds.Commands(), 4) -} diff --git a/x/perp/v2/module/module.go b/x/perp/v2/module/module.go deleted file mode 100644 index 12195ccca..000000000 --- a/x/perp/v2/module/module.go +++ /dev/null @@ -1,169 +0,0 @@ -package perp - -import ( - "context" - "encoding/json" - "fmt" - - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/perp/v2/client/cli" - "github.com/NibiruChain/nibiru/x/perp/v2/keeper" - types "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -// type check to ensure the interface is properly implemented -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} -) - -// ---------------------------------------------------------------------------- -// AppModuleBasic -// ---------------------------------------------------------------------------- - -type AppModuleBasic struct { - binaryCodec codec.BinaryCodec -} - -func NewAppModuleBasic(binaryCodec codec.BinaryCodec) AppModuleBasic { - return AppModuleBasic{binaryCodec: binaryCodec} -} - -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -// RegisterInterfaces registers interfaces and implementations of the perp module. -func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { - types.RegisterInterfaces(interfaceRegistry) -} - -func (AppModuleBasic) RegisterLegacyAminoCodec(aminoCodec *codec.LegacyAmino) { - types.RegisterLegacyAminoCodec(aminoCodec) -} - -// DefaultGenesis returns default genesis state as raw bytes for the erc20 -// module. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesis()) -} - -// ValidateGenesis performs genesis state validation for the capability module. -func (AppModuleBasic) ValidateGenesis( - cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage, -) error { - var genState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - return genState.Validate() -} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. -func (AppModuleBasic) RegisterGRPCGatewayRoutes( - clientCtx client.Context, mux *runtime.ServeMux, -) { - if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the capability module's root tx command. -func (a AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.GetTxCmd() -} - -// GetQueryCmd returns the capability module's root query command. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() -} - -// ---------------------------------------------------------------------------- -// AppModule -// ---------------------------------------------------------------------------- - -// AppModule implements the AppModule interface for the module. -type AppModule struct { - AppModuleBasic - - keeper keeper.Keeper - ak types.AccountKeeper - bk types.BankKeeper - ok types.OracleKeeper -} - -func NewAppModule( - cdc codec.Codec, - keeper keeper.Keeper, - ak types.AccountKeeper, - bk types.BankKeeper, - ok types.OracleKeeper, -) AppModule { - return AppModule{ - AppModuleBasic: NewAppModuleBasic(cdc), - keeper: keeper, - ak: ak, - bk: bk, - ok: ok, - } -} - -// Name returns the capability module's name. -func (am AppModule) Name() string { - return am.AppModuleBasic.Name() -} - -// RegisterServices registers a GRPC query service to respond to the -// module-specific GRPC queries. -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterQueryServer(cfg.QueryServer(), keeper.NewQuerier(am.keeper)) - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) -} - -// RegisterInvariants registers the capability module's invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - -// InitGenesis performs the capability module's genesis initialization It returns -// no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage, -) []abci.ValidatorUpdate { - var genState types.GenesisState - // Initialize global index to index in genesis state - cdc.MustUnmarshalJSON(gs, &genState) - - InitGenesis(ctx, am.keeper, genState) - - // See https://github.com/cosmos/cosmos-sdk/issues/5569 on why we do this. - am.ak.GetModuleAccount(ctx, types.PerpEFModuleAccount) - am.ak.GetModuleAccount(ctx, types.VaultModuleAccount) - am.ak.GetModuleAccount(ctx, types.FeePoolModuleAccount) - - return []abci.ValidatorUpdate{} -} - -// ExportGenesis returns the capability module's exported genesis state as raw JSON bytes. -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - genState := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(genState) -} - -// ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 3 } - -// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} - -// EndBlock executes all ABCI EndBlock logic respective to the capability module. It -// returns no validator updates. -func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - EndBlocker(ctx, am.keeper) - return []abci.ValidatorUpdate{} -} diff --git a/x/perp/v2/types/amm.go b/x/perp/v2/types/amm.go deleted file mode 100644 index fcb7feab0..000000000 --- a/x/perp/v2/types/amm.go +++ /dev/null @@ -1,428 +0,0 @@ -package types - -import ( - fmt "fmt" - "math/big" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func (amm AMM) Validate() error { - if amm.BaseReserve.LTE(sdk.ZeroDec()) { - return fmt.Errorf("init pool token supply must be > 0") - } - - if amm.QuoteReserve.LTE(sdk.ZeroDec()) { - return fmt.Errorf("init pool token supply must be > 0") - } - - if amm.PriceMultiplier.LTE(sdk.ZeroDec()) { - return fmt.Errorf("init price multiplier must be > 0") - } - - if amm.SqrtDepth.LTE(sdk.ZeroDec()) { - return fmt.Errorf("init sqrt depth must be > 0") - } - - computedSqrtDepth, err := amm.ComputeSqrtDepth() - if err != nil { - return err - } - - if !amm.SqrtDepth.Sub(computedSqrtDepth).Abs().LTE(sdk.OneDec()) { - return ErrLiquidityDepth.Wrap( - "computed sqrt and current sqrt are mismatched. pool: " + amm.String()) - } - - return nil -} - -// ComputeSettlementPrice computes the uniform settlement price for the current AMM. -// -// Returns: -// - price: uniform settlement price from several batched trades. In this case, -// "price" is the result of closing all positions together and giving -// all traders the same price. -// - newAmm: The AMM that results from closing all positions together. Note that -// this should have a bias, or skew, of 0. -// - err: Errors if it's impossible to swap away the open interest bias. -func (amm AMM) ComputeSettlementPrice() (sdk.Dec, AMM, error) { - // bias: open interest (base) skew in the AMM. - bias := amm.Bias() - if bias.IsZero() { - return amm.InstMarkPrice(), amm, nil - } - - var dir Direction - if bias.IsPositive() { - dir = Direction_SHORT - } else { - dir = Direction_LONG - } - - quoteAssetDelta, err := amm.SwapBaseAsset(bias.Abs(), dir) - if err != nil { - return sdk.Dec{}, AMM{}, err - } - price := quoteAssetDelta.Abs().Quo(bias.Abs()) - - return price, amm, err -} - -// QuoteReserveToAsset converts quote reserves to assets -func (amm AMM) QuoteReserveToAsset(quoteReserve sdk.Dec) sdk.Dec { - return QuoteReserveToAsset(quoteReserve, amm.PriceMultiplier) -} - -// QuoteAssetToReserve converts quote assets to reserves -func (amm AMM) QuoteAssetToReserve(quoteAssets sdk.Dec) sdk.Dec { - return QuoteAssetToReserve(quoteAssets, amm.PriceMultiplier) -} - -// QuoteAssetToReserve converts "quote assets" to "quote reserves". In this -// convention, "assets" are liquid funds that change hands, whereas reserves -// are simply a number field on the DAMM. The reason for this distinction is to -// account for the AMM.PriceMultiplier. -func QuoteAssetToReserve(quoteAsset, priceMult sdk.Dec) sdk.Dec { - return quoteAsset.Quo(priceMult) -} - -// QuoteReserveToAsset converts "quote reserves" to "quote assets". In this -// convention, "assets" are liquid funds that change hands, whereas reserves -// are simply a number field on the DAMM. The reason for this distinction is to -// account for the AMM.PriceMultiplier. -func QuoteReserveToAsset(quoteReserve, priceMult sdk.Dec) sdk.Dec { - return quoteReserve.Mul(priceMult) -} - -// GetBaseReserveAmt Returns the amount of base reserve equivalent to the amount of quote reserve given -// -// args: -// - quoteReserveAmt: the amount of quote reserve before the trade, must be positive -// - dir: the direction of the trade -// -// returns: -// - baseReserveDelta: the amount of base reserve after the trade, unsigned -// - err: error -// -// NOTE: baseReserveDelta is always positive -// Throws an error if input quoteReserveAmt is negative, or if the final quote reserve is not positive -func (amm AMM) GetBaseReserveAmt( - quoteReserveAmt sdk.Dec, // unsigned - dir Direction, -) (baseReserveDelta sdk.Dec, err error) { - if quoteReserveAmt.IsNegative() { - return sdk.Dec{}, ErrInputQuoteAmtNegative - } - - invariant := amm.QuoteReserve.Mul(amm.BaseReserve) // x * y = k - - var quoteReservesAfter sdk.Dec - if dir == Direction_LONG { - quoteReservesAfter = amm.QuoteReserve.Add(quoteReserveAmt) - } else { - quoteReservesAfter = amm.QuoteReserve.Sub(quoteReserveAmt) - } - - if !quoteReservesAfter.IsPositive() { - return sdk.Dec{}, ErrQuoteReserveAtZero - } - - baseReservesAfter := invariant.Quo(quoteReservesAfter) - baseReserveDelta = baseReservesAfter.Sub(amm.BaseReserve).Abs() - - return baseReserveDelta, nil -} - -// GetQuoteReserveAmt returns the amount of quote reserve equivalent to the amount of base asset given -// -// args: -// - baseReserveAmt: the amount of base reserves to trade, must be positive -// - dir: the direction of the trade -// -// returns: -// - quoteReserveDelta: the amount of quote reserve after the trade -// - err: error -// -// NOTE: quoteReserveDelta is always positive -func (amm AMM) GetQuoteReserveAmt( - baseReserveAmt sdk.Dec, - dir Direction, -) (quoteReserveDelta sdk.Dec, err error) { - if baseReserveAmt.IsNegative() { - return sdk.Dec{}, ErrInputBaseAmtNegative - } - if baseReserveAmt.IsZero() { - return sdk.ZeroDec(), nil - } - - invariant := amm.QuoteReserve.Mul(amm.BaseReserve) // x * y = k - - var baseReservesAfter sdk.Dec - if dir == Direction_LONG { - baseReservesAfter = amm.BaseReserve.Sub(baseReserveAmt) - } else { - baseReservesAfter = amm.BaseReserve.Add(baseReserveAmt) - } - - if !baseReservesAfter.IsPositive() { - return sdk.Dec{}, ErrBaseReserveAtZero.Wrapf( - "base assets below zero (%s) after trying to swap %s base assets", - baseReservesAfter.String(), - baseReserveAmt.String(), - ) - } - - quoteReservesAfter := invariant.Quo(baseReservesAfter) - quoteReserveDelta = quoteReservesAfter.Sub(amm.QuoteReserve).Abs() - - return quoteReserveDelta, nil -} - -// InstMarkPrice returns the instantaneous mark price of the trading pair. -// This is the price if the AMM has zero slippage, or equivalently, if there's -// infinite liquidity depth with the same ratio of reserves. -func (amm AMM) InstMarkPrice() sdk.Dec { - if amm.BaseReserve.IsNil() || amm.BaseReserve.IsZero() || - amm.QuoteReserve.IsNil() || amm.QuoteReserve.IsZero() { - return sdk.ZeroDec() - } - - return amm.QuoteReserve.Quo(amm.BaseReserve).Mul(amm.PriceMultiplier) -} - -// ComputeSqrtDepth returns the sqrt of the product of the reserves -func (amm AMM) ComputeSqrtDepth() (sqrtDepth sdk.Dec, err error) { - liqDepthBigInt := new(big.Int).Mul(amm.QuoteReserve.BigInt(), amm.BaseReserve.BigInt()) - - chopped := common.ChopPrecisionAndRound(liqDepthBigInt) - if chopped.BitLen() > common.MaxDecBitLen { - return sdk.Dec{}, ErrLiquidityDepthOverflow - } - // Since common.ChopPrecisionAndRound mutates the input, there's no guarantee that - // sdk.NewDecFromBigInt(liqDepthBigInt) is equal to amm.QuoteReserve.Mul(amm.BaseReserve) - liqDepth := amm.QuoteReserve.Mul(amm.BaseReserve) - return common.SqrtDec(liqDepth) -} - -func (amm *AMM) WithPair(pair asset.Pair) *AMM { - amm.Pair = pair - return amm -} - -func (amm *AMM) WithBaseReserve(baseReserve sdk.Dec) *AMM { - amm.BaseReserve = baseReserve - return amm -} - -func (amm *AMM) WithQuoteReserve(quoteReserve sdk.Dec) *AMM { - amm.QuoteReserve = quoteReserve - return amm -} - -func (amm *AMM) WithPriceMultiplier(priceMultiplier sdk.Dec) *AMM { - amm.PriceMultiplier = priceMultiplier - return amm -} - -func (amm *AMM) WithTotalLong(totalLong sdk.Dec) *AMM { - amm.TotalLong = totalLong - return amm -} - -func (amm *AMM) WithTotalShort(totalShort sdk.Dec) *AMM { - amm.TotalShort = totalShort - return amm -} - -func (amm *AMM) WithSqrtDepth(sqrtDepth sdk.Dec) *AMM { - amm.SqrtDepth = sqrtDepth - return amm -} - -// SwapQuoteAsset swaps base asset for quote asset -// -// args: -// - quoteAssetAmt: amount of base asset to swap, must be positive -// - dir: direction the user takes -// -// returns: -// - baseAssetDelta: amount of base asset received -// - err: error -// -// NOTE: baseAssetDelta is always positive -func (amm *AMM) SwapQuoteAsset( - quoteAssetAmt sdk.Dec, // unsigned - dir Direction, -) (baseAssetDelta sdk.Dec, err error) { - quoteReserveAmt := QuoteAssetToReserve(quoteAssetAmt, amm.PriceMultiplier) - baseReserveDelta, err := amm.GetBaseReserveAmt(quoteReserveAmt, dir) - if err != nil { - return sdk.Dec{}, err - } - - if dir == Direction_LONG { - amm.QuoteReserve = amm.QuoteReserve.Add(quoteReserveAmt) - amm.BaseReserve = amm.BaseReserve.Sub(baseReserveDelta) - amm.TotalLong = amm.TotalLong.Add(baseReserveDelta) - } else if dir == Direction_SHORT { - amm.QuoteReserve = amm.QuoteReserve.Sub(quoteReserveAmt) - amm.BaseReserve = amm.BaseReserve.Add(baseReserveDelta) - amm.TotalShort = amm.TotalShort.Add(baseReserveDelta) - } - - return baseReserveDelta, nil -} - -// SwapBaseAsset swaps base asset for quote asset -// -// args: -// - baseAssetAmt: amount of base asset to swap, must be positive -// - dir: direction of swap -// -// returns: -// - quoteAssetDelta: amount of quote asset received. Always positive -// - err: error if any -func (amm *AMM) SwapBaseAsset(baseAssetAmt sdk.Dec, dir Direction) (quoteAssetDelta sdk.Dec, err error) { - quoteReserveDelta, err := amm.GetQuoteReserveAmt(baseAssetAmt, dir) - if err != nil { - return sdk.Dec{}, err - } - - if dir == Direction_LONG { - amm.QuoteReserve = amm.QuoteReserve.Add(quoteReserveDelta) - amm.BaseReserve = amm.BaseReserve.Sub(baseAssetAmt) - amm.TotalLong = amm.TotalLong.Add(baseAssetAmt) - } else if dir == Direction_SHORT { - amm.QuoteReserve = amm.QuoteReserve.Sub(quoteReserveDelta) - amm.BaseReserve = amm.BaseReserve.Add(baseAssetAmt) - amm.TotalShort = amm.TotalShort.Add(baseAssetAmt) - } - - return amm.QuoteReserveToAsset(quoteReserveDelta), nil -} - -// Bias: returns the bias, or open interest skew, of the market in the base -// units. Bias is the net amount of long perpetual contracts minus the net -// amount of shorts. -func (amm *AMM) Bias() (bias sdk.Dec) { - return amm.TotalLong.Sub(amm.TotalShort) -} - -/* -CalcRepegCost provides the cost of re-pegging the pool to a new candidate peg multiplier. -*/ -func (amm AMM) CalcRepegCost(newPriceMultiplier sdk.Dec) (cost sdkmath.Int, err error) { - if !newPriceMultiplier.IsPositive() { - return sdkmath.Int{}, ErrNonPositivePegMultiplier - } - - bias := amm.Bias() - - if bias.IsZero() { - return sdk.ZeroInt(), nil - } - - var dir Direction - if bias.IsPositive() { - dir = Direction_SHORT - } else { - dir = Direction_LONG - } - - biasInQuoteReserve, err := amm.GetQuoteReserveAmt(bias.Abs(), dir) - if err != nil { - return sdkmath.Int{}, err - } - - costDec := biasInQuoteReserve.Mul(newPriceMultiplier.Sub(amm.PriceMultiplier)) - - if bias.IsNegative() { - costDec = costDec.Neg() - } - - return costDec.Ceil().TruncateInt(), nil -} - -// returns the amount of quote assets the amm has to pay out if all longs and shorts close out their positions -// positive value means the amm has to pay out quote assets -// negative value means the amm has to receive quote assets -func (amm AMM) GetMarketValue() (sdk.Dec, error) { - bias := amm.Bias() - - if bias.IsZero() { - return sdk.ZeroDec(), nil - } - - var dir Direction - if bias.IsPositive() { - dir = Direction_SHORT - } else { - dir = Direction_LONG - } - - marketValueInReserves, err := amm.GetQuoteReserveAmt(bias.Abs(), dir) - if err != nil { - return sdk.Dec{}, err - } - - if bias.IsNegative() { - marketValueInReserves = marketValueInReserves.Neg() - } - - return amm.QuoteReserveToAsset(marketValueInReserves), nil -} - -/* -CalcUpdateSwapInvariantCost returns the cost of updating the invariant of the pool -*/ -func (amm AMM) CalcUpdateSwapInvariantCost(newSwapInvariant sdk.Dec) (sdkmath.Int, error) { - if newSwapInvariant.IsNil() { - return sdkmath.Int{}, ErrNilSwapInvariant - } - - if !newSwapInvariant.IsPositive() { - return sdkmath.Int{}, ErrNegativeSwapInvariant - } - - marketValueBefore, err := amm.GetMarketValue() - if err != nil { - return sdkmath.Int{}, err - } - - err = amm.UpdateSwapInvariant(newSwapInvariant) - if err != nil { - return sdkmath.Int{}, err - } - - marketValueAfter, err := amm.GetMarketValue() - if err != nil { - return sdkmath.Int{}, err - } - - cost := marketValueAfter.Sub(marketValueBefore) - - return cost.Ceil().TruncateInt(), nil -} - -// UpdateSwapInvariant updates the swap invariant of the amm -func (amm *AMM) UpdateSwapInvariant(newSwapInvariant sdk.Dec) (err error) { - // k = x * y - // newK = (cx) * (cy) = c^2 xy = c^2 k - // newPrice = (c y) / (c x) = y / x = price | unchanged price - newSqrtDepth := common.MustSqrtDec(newSwapInvariant) - multiplier := newSqrtDepth.Quo(amm.SqrtDepth) - - // Change the swap invariant while holding price constant. - // Multiplying by the same factor to both of the reserves won't affect price. - amm.SqrtDepth = newSqrtDepth - amm.BaseReserve = amm.BaseReserve.Mul(multiplier) - amm.QuoteReserve = amm.QuoteReserve.Mul(multiplier) - - return amm.Validate() // might be useless -} diff --git a/x/perp/v2/types/amm_test.go b/x/perp/v2/types/amm_test.go deleted file mode 100644 index ab4e13a5f..000000000 --- a/x/perp/v2/types/amm_test.go +++ /dev/null @@ -1,803 +0,0 @@ -package types_test - -import ( - fmt "fmt" - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestSwapBaseAsset(t *testing.T) { - tests := []struct { - name string - baseAssetAmt sdk.Dec - dir types.Direction - expectedQuoteAssetDelta sdk.Dec - expectedBaseReserve sdk.Dec - expectedQuoteReserve sdk.Dec - expectedTotalLong sdk.Dec - expectedTotalShort sdk.Dec - expectedMarkPrice sdk.Dec - expectedErr error - }{ - { - name: "long base asset", - baseAssetAmt: sdk.NewDec(1e11), - dir: types.Direction_LONG, - expectedQuoteAssetDelta: sdk.MustNewDecFromStr("111111111111.111111111111111111"), - expectedBaseReserve: sdk.NewDec(900000000000), - expectedQuoteReserve: sdk.MustNewDecFromStr("1111111111111.111111111111111111"), - expectedTotalLong: sdk.NewDec(100000000000), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.MustNewDecFromStr("1.234567901234567901"), - }, - { - name: "short base asset", - baseAssetAmt: sdk.NewDec(1e11), - dir: types.Direction_SHORT, - expectedQuoteAssetDelta: sdk.MustNewDecFromStr("90909090909.090909090909090909"), - expectedBaseReserve: sdk.NewDec(1100000000000), - expectedQuoteReserve: sdk.MustNewDecFromStr("909090909090.909090909090909091"), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.NewDec(100000000000), - expectedMarkPrice: sdk.MustNewDecFromStr("0.826446280991735537"), - }, - { - name: "long zero base asset", - baseAssetAmt: sdk.ZeroDec(), - dir: types.Direction_LONG, - expectedQuoteAssetDelta: sdk.ZeroDec(), - expectedBaseReserve: sdk.NewDec(1e12), - expectedQuoteReserve: sdk.NewDec(1e12), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.OneDec(), - }, - { - name: "short zero base asset", - baseAssetAmt: sdk.ZeroDec(), - dir: types.Direction_SHORT, - expectedQuoteAssetDelta: sdk.ZeroDec(), - expectedBaseReserve: sdk.NewDec(1e12), - expectedQuoteReserve: sdk.NewDec(1e12), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.OneDec(), - }, - { - name: "not enough base in reserves", - baseAssetAmt: sdk.NewDec(1e13), - dir: types.Direction_LONG, - expectedErr: types.ErrBaseReserveAtZero, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - amm := mock.TestAMM(sdk.NewDec(1e12), sdk.OneDec()) - - quoteAssetDelta, err := amm.SwapBaseAsset(tc.baseAssetAmt, tc.dir) - - if tc.expectedErr != nil { - require.ErrorIs(t, err, tc.expectedErr) - } else { - require.NoError(t, err) - assert.Equal(t, tc.expectedQuoteAssetDelta, quoteAssetDelta) - assert.Equal(t, types.AMM{ - Pair: amm.Pair, - BaseReserve: tc.expectedBaseReserve, - QuoteReserve: tc.expectedQuoteReserve, - SqrtDepth: amm.SqrtDepth, - PriceMultiplier: amm.PriceMultiplier, - TotalLong: tc.expectedTotalLong, - TotalShort: tc.expectedTotalShort, - }, *amm) - assert.Equal(t, tc.expectedMarkPrice, amm.InstMarkPrice()) - } - }) - } -} - -func TestSwapQuoteAsset(t *testing.T) { - tests := []struct { - name string - quoteAssetAmt sdk.Dec - dir types.Direction - expectedBaseAssetDelta sdk.Dec - expectedBaseReserve sdk.Dec - expectedQuoteReserve sdk.Dec - expectedTotalLong sdk.Dec - expectedTotalShort sdk.Dec - expectedMarkPrice sdk.Dec - expectedErr error - }{ - { - name: "long quote asset", - quoteAssetAmt: sdk.NewDec(1e11), - dir: types.Direction_LONG, - expectedBaseAssetDelta: sdk.MustNewDecFromStr("47619047619.047619047619047619"), - expectedBaseReserve: sdk.MustNewDecFromStr("952380952380.952380952380952381"), - expectedQuoteReserve: sdk.NewDec(1050000000000), - expectedTotalLong: sdk.MustNewDecFromStr("47619047619.047619047619047619"), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.MustNewDecFromStr("2.205"), - }, - { - name: "short base asset", - quoteAssetAmt: sdk.NewDec(1e11), - dir: types.Direction_SHORT, - expectedBaseAssetDelta: sdk.MustNewDecFromStr("52631578947.368421052631578947"), - expectedBaseReserve: sdk.MustNewDecFromStr("1052631578947.368421052631578947"), - expectedQuoteReserve: sdk.NewDec(950000000000), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.MustNewDecFromStr("52631578947.368421052631578947"), - expectedMarkPrice: sdk.MustNewDecFromStr("1.805"), - }, - { - name: "long zero base asset", - quoteAssetAmt: sdk.ZeroDec(), - dir: types.Direction_LONG, - expectedBaseAssetDelta: sdk.ZeroDec(), - expectedBaseReserve: sdk.NewDec(1e12), - expectedQuoteReserve: sdk.NewDec(1e12), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.NewDec(2), - }, - { - name: "short zero base asset", - quoteAssetAmt: sdk.ZeroDec(), - dir: types.Direction_SHORT, - expectedBaseAssetDelta: sdk.ZeroDec(), - expectedBaseReserve: sdk.NewDec(1e12), - expectedQuoteReserve: sdk.NewDec(1e12), - expectedTotalLong: sdk.ZeroDec(), - expectedTotalShort: sdk.ZeroDec(), - expectedMarkPrice: sdk.NewDec(2), - }, - { - name: "not enough base in reserves", - quoteAssetAmt: sdk.NewDec(1e13), - dir: types.Direction_SHORT, - expectedErr: types.ErrQuoteReserveAtZero, - }, - { - name: "negative quote asset amt", - quoteAssetAmt: sdk.NewDec(-1), - dir: types.Direction_SHORT, - expectedErr: types.ErrInputQuoteAmtNegative, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - amm := mock.TestAMM(sdk.NewDec(1e12), sdk.NewDec(2)) - - quoteAssetDelta, err := amm.SwapQuoteAsset(tc.quoteAssetAmt, tc.dir) - - if tc.expectedErr != nil { - require.ErrorIs(t, err, tc.expectedErr) - } else { - require.NoError(t, err) - assert.Equal(t, tc.expectedBaseAssetDelta, quoteAssetDelta) - assert.Equal(t, types.AMM{ - Pair: amm.Pair, - BaseReserve: tc.expectedBaseReserve, - QuoteReserve: tc.expectedQuoteReserve, - SqrtDepth: amm.SqrtDepth, - PriceMultiplier: amm.PriceMultiplier, - TotalLong: tc.expectedTotalLong, - TotalShort: tc.expectedTotalShort, - }, *amm) - assert.Equal(t, tc.expectedMarkPrice, amm.InstMarkPrice()) - } - }) - } -} - -// baseReserves := base reserves if no one is trading -// bias := totalLong (bias) + totalShort (bias) := the net size of all positions together -// In the test cases you see, -// one is repegging bias of +25 with cost of 20, -// and the other has bias -20 with cost of -25 -// The reason for this is that swapping in different directions actually results in different amounts. -// Here's the case named "new peg -> simple math": -// Given: -// y = 100, x = 100, bias = 25, peg = 1 -// Do Repeg(peg=2) -// To get rid of the bias, we swap it away and see what that is in quote units: -// dy = k / (x + dx) - y, where dx = bias -// dy = 100^2 / (100 + 25) - 100 = -20 -// Here's the case named "new peg -> simple math but negative bias": -// Given: -// y = 100, x =100, bias = -20, peg=1 -// Do Repeg(peg=2) -// To get rid of the bias, we swap it away and see what that is in quote units: -// dy = k / (x + dx) - y, where dx = bias -// dy = 100^2 / (100 - 20) - 100 = +25 -func TestRepegCost(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - tests := []struct { - name string - - amm types.AMM - newPriceMultiplier sdk.Dec - - expectedCost sdkmath.Int - shouldErr bool - }{ - { - name: "zero bias -> zero cost", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - newPriceMultiplier: sdk.NewDec(3), - expectedCost: sdk.ZeroInt(), - shouldErr: false, - }, - { - name: "same peg -> zero cost", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - newPriceMultiplier: sdk.OneDec(), - expectedCost: sdk.ZeroInt(), - shouldErr: false, - }, - { - name: "new peg -> net long and increase price multiplier", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(25), - TotalShort: sdk.ZeroDec(), - }, - newPriceMultiplier: sdk.NewDec(2), - expectedCost: sdk.NewInt(20), - shouldErr: false, - }, - { - name: "new peg -> net short and increase price multiplier", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.NewDec(20), - }, - newPriceMultiplier: sdk.NewDec(2), - expectedCost: sdk.NewInt(-25), - shouldErr: false, - }, - { - name: "new peg -> net long and decrease price multiplier", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(25), - TotalShort: sdk.ZeroDec(), - }, - newPriceMultiplier: sdk.MustNewDecFromStr("0.5"), - expectedCost: sdk.NewInt(-10), - shouldErr: false, - }, - { - name: "new peg -> net short and decrease price multiplier", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(100), - QuoteReserve: sdk.NewDec(100), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.NewDec(20), - }, - newPriceMultiplier: sdk.MustNewDecFromStr("0.5"), - expectedCost: sdk.NewInt(13), - shouldErr: false, - }, - { - name: "new peg -> negative bias big numbers", - amm: types.AMM{ - Pair: pair, - BaseReserve: sdk.NewDec(1e12), - QuoteReserve: sdk.NewDec(1e12), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(500), - TotalShort: sdk.NewDec(1000), - }, - newPriceMultiplier: sdk.NewDec(10), - expectedCost: sdk.NewInt(-4500), - shouldErr: false, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - cost, err := tc.amm.CalcRepegCost(tc.newPriceMultiplier) - if tc.shouldErr { - require.Error(t, err) - } else { - require.NoError(t, err) - assert.EqualValues(t, tc.expectedCost, cost) - } - }) - } -} - -func TestUpdateSwapInvariant(t *testing.T) { - tests := []struct { - name string - amm types.AMM - newSwapInvariant sdk.Dec - - expectedBaseReserve sdk.Dec - expectedQuoteReserve sdk.Dec - expectedSqrtDepth sdk.Dec - }{ - { - name: "same invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - }, - newSwapInvariant: sdk.NewDec(1e12), - expectedBaseReserve: sdk.NewDec(1e6), - expectedQuoteReserve: sdk.NewDec(1e6), - expectedSqrtDepth: sdk.NewDec(1e6), - }, - { - name: "higher invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - }, - newSwapInvariant: sdk.NewDec(1e14), - expectedBaseReserve: sdk.NewDec(1e7), - expectedQuoteReserve: sdk.NewDec(1e7), - expectedSqrtDepth: sdk.NewDec(1e7), - }, - { - name: "smaller invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - }, - newSwapInvariant: sdk.NewDec(1e10), - expectedBaseReserve: sdk.NewDec(1e5), - expectedQuoteReserve: sdk.NewDec(1e5), - expectedSqrtDepth: sdk.NewDec(1e5), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.amm.UpdateSwapInvariant(tc.newSwapInvariant) - require.NoError(t, err) - assert.Equal(t, tc.expectedBaseReserve, tc.amm.BaseReserve) - assert.Equal(t, tc.expectedQuoteReserve, tc.amm.QuoteReserve) - assert.Equal(t, tc.expectedSqrtDepth, tc.amm.SqrtDepth) - }) - } -} - -// test cases shown at https://docs.google.com/spreadsheets/d/1kH7i0OGM4K2kwnovHc05E3f-VCdF7xDjSdYnnxRZxsM/edit?usp=sharing -func TestCalcUpdateSwapInvariantCost(t *testing.T) { - tests := []struct { - name string - amm types.AMM - newSwapInvariant sdk.Dec - - expectedCost sdkmath.Int - expectedErr error - }{ - { - name: "zero cost - same swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(50), - TotalShort: sdk.NewDec(50), - }, - newSwapInvariant: sdk.NewDec(1e12), - expectedCost: sdk.ZeroInt(), - }, - - { - name: "zero cost - zero bias", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - newSwapInvariant: sdk.NewDec(1e18), - expectedCost: sdk.ZeroInt(), - }, - - { - name: "long bias, increase swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e5), - TotalShort: sdk.ZeroDec(), - }, - newSwapInvariant: sdk.NewDec(1e14), - expectedCost: sdk.NewInt(8101), - }, - - { - name: "long bias, decrease swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e2), - TotalShort: sdk.ZeroDec(), - }, - newSwapInvariant: sdk.NewDec(1e6), - expectedCost: sdk.NewInt(-9), - }, - - { - name: "short bias, increase swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.NewDec(1e5), - }, - newSwapInvariant: sdk.NewDec(1e14), - expectedCost: sdk.NewInt(10102), - }, - - { - name: "short bias, decrease swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.NewDec(1e2), - }, - newSwapInvariant: sdk.NewDec(1e6), - expectedCost: sdk.NewInt(-11), - }, - - { - name: "net long bias, increase swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(2e5), - TotalShort: sdk.NewDec(1e5), - }, - newSwapInvariant: sdk.NewDec(1e14), - expectedCost: sdk.NewInt(8101), - }, - - { - name: "net long bias, decrease swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(2e2), - TotalShort: sdk.NewDec(1e2), - }, - newSwapInvariant: sdk.NewDec(1e6), - expectedCost: sdk.NewInt(-9), - }, - - { - name: "net short bias, increase swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e5), - TotalShort: sdk.NewDec(2e5), - }, - newSwapInvariant: sdk.NewDec(1e14), - expectedCost: sdk.NewInt(10102), - }, - - { - name: "net short bias, decrease swap invariant", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e2), - TotalShort: sdk.NewDec(2e2), - }, - newSwapInvariant: sdk.NewDec(1e6), - expectedCost: sdk.NewInt(-11), - }, - - { - name: "new swap invariant is nil", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - newSwapInvariant: sdk.Dec{}, - expectedErr: types.ErrNilSwapInvariant, - }, - - { - name: "new swap invariant is negative", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - newSwapInvariant: sdk.NewDec(-1), - expectedErr: types.ErrNegativeSwapInvariant, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - cost, err := tc.amm.CalcUpdateSwapInvariantCost(tc.newSwapInvariant) - if tc.expectedErr != nil { - require.ErrorIs(t, err, tc.expectedErr) - } else { - require.NoError(t, err) - assert.Equal(t, tc.expectedCost, cost) - } - }) - } -} - -func TestGetMarketValue(t *testing.T) { - tests := []struct { - name string - amm types.AMM - expectedMarketValue sdk.Dec - }{ - { - name: "zero market value", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.ZeroDec(), - }, - expectedMarketValue: sdk.ZeroDec(), - }, - { - name: "long only", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e5), - TotalShort: sdk.ZeroDec(), - }, - expectedMarketValue: sdk.MustNewDecFromStr("90909.090909090909090909"), - }, - { - name: "short only", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.ZeroDec(), - TotalShort: sdk.NewDec(1e5), - }, - expectedMarketValue: sdk.MustNewDecFromStr("-111111.111111111111111111"), - }, - { - name: "long and short cancel each other out", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e5), - TotalShort: sdk.NewDec(1e5), - }, - expectedMarketValue: sdk.ZeroDec(), - }, - { - name: "net long", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(2e5), - TotalShort: sdk.NewDec(1e5), - }, - expectedMarketValue: sdk.MustNewDecFromStr("90909.090909090909090909"), - }, - { - name: "net short", - amm: types.AMM{ - BaseReserve: sdk.NewDec(1e6), - QuoteReserve: sdk.NewDec(1e6), - SqrtDepth: sdk.NewDec(1e6), - PriceMultiplier: sdk.OneDec(), - TotalLong: sdk.NewDec(1e5), - TotalShort: sdk.NewDec(2e5), - }, - expectedMarketValue: sdk.MustNewDecFromStr("-111111.111111111111111111"), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - marketValue, err := tc.amm.GetMarketValue() - require.NoError(t, err) - - assert.Equal(t, tc.expectedMarketValue, marketValue) - }) - } -} - -func TestValidateAMM(t *testing.T) { - tests := []struct { - name string - amm types.AMM - expectedErr error - }{ - { - name: "Invalid base reserve", - amm: types.AMM{ - BaseReserve: sdk.ZeroDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.OneDec(), - }, - expectedErr: fmt.Errorf("init pool token supply must be > 0"), - }, - { - name: "Invalid quote reserve", - amm: types.AMM{ - BaseReserve: sdk.OneDec(), - QuoteReserve: sdk.ZeroDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.OneDec(), - }, - expectedErr: fmt.Errorf("init pool token supply must be > 0"), - }, - { - name: "Invalid price multiplier", - amm: types.AMM{ - BaseReserve: sdk.OneDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.ZeroDec(), - SqrtDepth: sdk.OneDec(), - }, - expectedErr: fmt.Errorf("init price multiplier must be > 0"), - }, - { - name: "Invalid sqrt depth", - amm: types.AMM{ - BaseReserve: sdk.OneDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.ZeroDec(), - }, - expectedErr: fmt.Errorf("init sqrt depth must be > 0"), - }, - { - name: "Invalid sqrt depth value", - amm: types.AMM{ - BaseReserve: sdk.OneDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.NewDec(3), - }, - expectedErr: types.ErrLiquidityDepth, - }, - } - - for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - err := tc.amm.Validate() - if tc.expectedErr == nil { - require.NoError(t, err) - } else { - require.Error(t, err) - assert.Contains(t, err.Error(), tc.expectedErr.Error()) - } - }) - } -} - -func TestPositionNotionalFail(t *testing.T) { - amm := mock.TestAMM(sdk.NewDec(-1), sdk.NewDec(2)) - _, err := amm.GetQuoteReserveAmt(sdk.NewDec(-1), types.Direction_LONG) - require.ErrorIs(t, err, types.ErrInputBaseAmtNegative) -} - -func TestAMM_WithMethods(t *testing.T) { - pair := asset.MustNewPair("ubtc:unusd") - baseReserve := sdk.NewDec(100) - quoteReserve := sdk.NewDec(200) - priceMultiplier := sdk.NewDec(1) - totalLong := sdk.NewDec(50) - totalShort := sdk.NewDec(50) - sqrtDepth := sdk.NewDec(10) - - amm := new(types.AMM). - WithPair(pair). - WithBaseReserve(baseReserve). - WithQuoteReserve(quoteReserve). - WithPriceMultiplier(priceMultiplier). - WithTotalLong(totalLong). - WithTotalShort(totalShort). - WithSqrtDepth(sqrtDepth) - - require.Equal(t, pair, amm.Pair) - require.Equal(t, baseReserve, amm.BaseReserve) - require.Equal(t, quoteReserve, amm.QuoteReserve) - require.Equal(t, priceMultiplier, amm.PriceMultiplier) - require.Equal(t, totalLong, amm.TotalLong) - require.Equal(t, totalShort, amm.TotalShort) - require.Equal(t, sqrtDepth, amm.SqrtDepth) -} diff --git a/x/perp/v2/types/change_reason.go b/x/perp/v2/types/change_reason.go deleted file mode 100644 index a984900d0..000000000 --- a/x/perp/v2/types/change_reason.go +++ /dev/null @@ -1,61 +0,0 @@ -package types - -import "encoding/json" - -type customProtobufType interface { - Marshal() ([]byte, error) - MarshalTo(data []byte) (n int, err error) - Unmarshal(data []byte) error - Size() int - - MarshalJSON() ([]byte, error) - UnmarshalJSON(data []byte) error -} - -var _ customProtobufType = (*ChangeReason)(nil) - -type ChangeReason string - -const ( - ChangeReason_MarketOrder ChangeReason = "market_order" - ChangeReason_ClosePosition ChangeReason = "close_position" - ChangeReason_PartialClose ChangeReason = "partial_close" - ChangeReason_AddMargin ChangeReason = "add_margin" - ChangeReason_RemoveMargin ChangeReason = "remove_margin" - ChangeReason_PartialLiquidation ChangeReason = "partial_liquidation" - ChangeReason_FullLiquidation ChangeReason = "full_liquidation" - ChangeReason_Settlement ChangeReason = "settlement" -) - -func (c *ChangeReason) Size() int { - return len(*c) -} - -func (c *ChangeReason) Marshal() ([]byte, error) { - return []byte(*c), nil -} - -func (c *ChangeReason) MarshalTo(data []byte) (n int, err error) { - return copy(data, *c), nil -} - -func (c *ChangeReason) Unmarshal(data []byte) error { - *c = ChangeReason(data) - return nil -} - -func (c *ChangeReason) MarshalJSON() ([]byte, error) { - return json.Marshal(*c) -} - -func (c *ChangeReason) UnmarshalJSON(data []byte) error { - var s string - - err := json.Unmarshal(data, &s) - if err != nil { - return err - } - - *c = ChangeReason(s) - return nil -} diff --git a/x/perp/v2/types/change_reason_test.go b/x/perp/v2/types/change_reason_test.go deleted file mode 100644 index 62fa3a95f..000000000 --- a/x/perp/v2/types/change_reason_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package types - -import ( - "bytes" - "testing" -) - -func TestChangeReason(t *testing.T) { - testCases := []struct { - name string - reason ChangeReason - data []byte - }{ - {"MarketOrder", ChangeReason_MarketOrder, []byte("market_order")}, - {"ClosePosition", ChangeReason_ClosePosition, []byte("close_position")}, - // add other cases here... - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - // Test Marshal - result, err := tc.reason.Marshal() - if err != nil { - t.Errorf("unexpected error on Marshal: %v", err) - } - - if !bytes.Equal(result, tc.data) { - t.Errorf("expected %s, got %s on Marshal", tc.data, result) - } - - // Test Unmarshal - var reason ChangeReason - err = reason.Unmarshal(tc.data) - if err != nil { - t.Errorf("unexpected error on Unmarshal: %v", err) - } - - if reason != tc.reason { - t.Errorf("expected %s, got %s on Unmarshal", tc.reason, reason) - } - - // Test MarshalJSON and UnmarshalJSON - jsonData, err := tc.reason.MarshalJSON() - if err != nil { - t.Errorf("unexpected error on MarshalJSON: %v", err) - } - - var jsonResult ChangeReason - err = jsonResult.UnmarshalJSON(jsonData) - if err != nil { - t.Errorf("unexpected error on UnmarshalJSON: %v", err) - } - - if jsonResult != tc.reason { - t.Errorf("expected %s, got %s on UnmarshalJSON", tc.reason, jsonResult) - } - }) - } -} diff --git a/x/perp/v2/types/codec.go b/x/perp/v2/types/codec.go deleted file mode 100644 index 4a77025b1..000000000 --- a/x/perp/v2/types/codec.go +++ /dev/null @@ -1,35 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/msgservice" -) - -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgAddMargin{}, "perpv2/add_margin", nil) - cdc.RegisterConcrete(&MsgRemoveMargin{}, "perpv2/remove_margin", nil) - cdc.RegisterConcrete(&MsgMarketOrder{}, "perpv2/market_order", nil) - cdc.RegisterConcrete(&MsgClosePosition{}, "perpv2/close_position", nil) - cdc.RegisterConcrete(&MsgPartialClose{}, "perpv2/partial_close", nil) - cdc.RegisterConcrete(&MsgDonateToEcosystemFund{}, "perpv2/donate_to_ef", nil) - cdc.RegisterConcrete(&MsgMultiLiquidate{}, "perpv2/multi_liquidate", nil) -} - -func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { - registry.RegisterImplementations( - /* interface */ (*sdk.Msg)(nil), - /* implementations */ - &MsgRemoveMargin{}, - &MsgAddMargin{}, - &MsgMarketOrder{}, - &MsgClosePosition{}, - &MsgPartialClose{}, - &MsgMultiLiquidate{}, - ) - - msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) -} - -var ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) diff --git a/x/perp/v2/types/codec_test.go b/x/perp/v2/types/codec_test.go deleted file mode 100644 index e17a2d56c..000000000 --- a/x/perp/v2/types/codec_test.go +++ /dev/null @@ -1,42 +0,0 @@ -package types - -import ( - "testing" - - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - proto "github.com/cosmos/gogoproto/proto" - "github.com/stretchr/testify/require" -) - -func TestCodec(t *testing.T) { - cdc := codec.NewLegacyAmino() - RegisterLegacyAminoCodec(cdc) - - interfaceRegistry := cdctypes.NewInterfaceRegistry() - RegisterInterfaces(interfaceRegistry) - - msgs := []sdk.Msg{ - &MsgAddMargin{}, - &MsgRemoveMargin{}, - &MsgMarketOrder{}, - &MsgClosePosition{}, - &MsgPartialClose{}, - &MsgDonateToEcosystemFund{}, - &MsgMultiLiquidate{}, - } - - for _, msg := range msgs { - bz, err := cdc.Amino.MarshalBinaryBare(msg) - require.NoError(t, err) - - decodedMsg, ok := msg.(proto.Message) - require.True(t, ok) - - err = cdc.Amino.UnmarshalBinaryBare(bz, decodedMsg) - require.NoError(t, err) - - require.Equal(t, msg, decodedMsg) - } -} diff --git a/x/perp/v2/types/errors.go b/x/perp/v2/types/errors.go deleted file mode 100644 index 48dfe0bda..000000000 --- a/x/perp/v2/types/errors.go +++ /dev/null @@ -1,50 +0,0 @@ -package types - -import sdkerrors "cosmossdk.io/errors" - -// highestErrorCode = 33 -// NOTE: Please increment this when you add an error to make it easier for -// other developers to know which "code" value should be used next. - -var ( - ErrPairNotSupported = sdkerrors.Register(ModuleName, 1, "pair not supported") - ErrQuoteReserveAtZero = sdkerrors.Register(ModuleName, 2, "quote reserve after at zero") - ErrBaseReserveAtZero = sdkerrors.Register(ModuleName, 3, "base reserve after at zero") - ErrNoLastSnapshotSaved = sdkerrors.Register(ModuleName, 4, "There was no last snapshot, could be that you did not do snapshot on pool creation") - ErrAssetFailsUserLimit = sdkerrors.Register(ModuleName, 5, "amount of assets traded does not meet user-defined limit") - - // Price-related errors - ErrNoValidPrice = sdkerrors.Register(ModuleName, 8, "no valid prices available") - ErrNoValidTWAP = sdkerrors.Register(ModuleName, 9, "TWAP price not found") - - // Could replace ErrBaseReserveAtZero and ErrQUoteReserveAtZero if wrapped - ErrInvalidAmmReserves = sdkerrors.Register(ModuleName, 10, - "base and quote reserves must always be positive") - ErrLiquidityDepth = sdkerrors.Register(ModuleName, 11, - "liquidity depth must be positive and equal to the square of the reserves") - ErrMarginRatioTooHigh = sdkerrors.Register(ModuleName, 13, "margin ratio is too healthy to liquidate") - ErrPairNotFound = sdkerrors.Register(ModuleName, 14, "pair doesn't have live market") - ErrMarketWithVersionNotFound = sdkerrors.Register(ModuleName, 33, "market with version not found") - ErrAMMWithVersionNotFound = sdkerrors.Register(ModuleName, 34, "amm with version not found") - ErrPositionNotFound = sdkerrors.Register(ModuleName, 35, "position not found") - ErrPositionZero = sdkerrors.Register(ModuleName, 15, "position is zero") - ErrBadDebt = sdkerrors.Register(ModuleName, 16, "position is underwater") - ErrInputQuoteAmtNegative = sdkerrors.Register(ModuleName, 17, "quote amount cannot be zero") - ErrInputBaseAmtNegative = sdkerrors.Register(ModuleName, 30, "base amount cannot be zero") - - ErrUserLeverageNegative = sdkerrors.Register(ModuleName, 18, "leverage cannot be zero") - ErrMarginRatioTooLow = sdkerrors.Register(ModuleName, 19, "margin ratio did not meet maintenance margin ratio") - ErrLeverageIsTooHigh = sdkerrors.Register(ModuleName, 20, "leverage cannot be higher than market parameter") - ErrUnauthorized = sdkerrors.Register(ModuleName, 21, "operation not authorized") - ErrAllLiquidationsFailed = sdkerrors.Register(ModuleName, 22, "all liquidations failed") - ErrParseLiquidateResponse = sdkerrors.Register(ModuleName, 31, "failed to JSON parse liquidate responses") - ErrPositionHealthy = sdkerrors.Register(ModuleName, 23, "position is healthy") - ErrLiquidityDepthOverflow = sdkerrors.Register(ModuleName, 24, "liquidty depth overflow") - ErrMarketNotEnabled = sdkerrors.Register(ModuleName, 25, "market is not enabled, you can only fully close your position") - ErrNonPositivePegMultiplier = sdkerrors.Register(ModuleName, 26, "peg multiplier must be > 0") - ErrNegativeSwapInvariant = sdkerrors.Register(ModuleName, 27, "swap multiplier must be > 0") - ErrNilSwapInvariant = sdkerrors.Register(ModuleName, 28, "swap multiplier must be not nil") - ErrNotEnoughFundToPayAction = sdkerrors.Register(ModuleName, 29, "not enough fund in perp EF to pay for action") - - ErrSettlementPositionMarketEnabled = sdkerrors.Register(ModuleName, 32, "market is enabled, you can only settle position on disabled market") -) diff --git a/x/perp/v2/types/event.pb.go b/x/perp/v2/types/event.pb.go deleted file mode 100644 index 598fae243..000000000 --- a/x/perp/v2/types/event.pb.go +++ /dev/null @@ -1,2663 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/perp/v2/event.proto - -package types - -import ( - fmt "fmt" - github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - _ "google.golang.org/protobuf/types/known/timestamppb" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type LiquidationFailedEvent_LiquidationFailedReason int32 - -const ( - LiquidationFailedEvent_UNSPECIFIED LiquidationFailedEvent_LiquidationFailedReason = 0 - // the position is healthy and does not need to be liquidated. - LiquidationFailedEvent_POSITION_HEALTHY LiquidationFailedEvent_LiquidationFailedReason = 1 - // the pair does not exist. - LiquidationFailedEvent_NONEXISTENT_PAIR LiquidationFailedEvent_LiquidationFailedReason = 2 - // the position does not exist. - LiquidationFailedEvent_NONEXISTENT_POSITION LiquidationFailedEvent_LiquidationFailedReason = 3 -) - -var LiquidationFailedEvent_LiquidationFailedReason_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "POSITION_HEALTHY", - 2: "NONEXISTENT_PAIR", - 3: "NONEXISTENT_POSITION", -} - -var LiquidationFailedEvent_LiquidationFailedReason_value = map[string]int32{ - "UNSPECIFIED": 0, - "POSITION_HEALTHY": 1, - "NONEXISTENT_PAIR": 2, - "NONEXISTENT_POSITION": 3, -} - -func (x LiquidationFailedEvent_LiquidationFailedReason) String() string { - return proto.EnumName(LiquidationFailedEvent_LiquidationFailedReason_name, int32(x)) -} - -func (LiquidationFailedEvent_LiquidationFailedReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{4, 0} -} - -// Emitted when a position changes. -type PositionChangedEvent struct { - FinalPosition Position `protobuf:"bytes,1,opt,name=final_position,json=finalPosition,proto3" json:"final_position"` - // Position notional (in quote units) after the change. In general, - // 'notional = baseAmount * priceQuotePerBase', where size is the baseAmount. - PositionNotional github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=position_notional,json=positionNotional,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"position_notional"` - // Transaction fee paid. A "taker" fee. - TransactionFee types.Coin `protobuf:"bytes,3,opt,name=transaction_fee,json=transactionFee,proto3" json:"transaction_fee" yaml:"transaction_fee"` - // realize profits and losses after the change - RealizedPnl github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=realized_pnl,json=realizedPnl,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"realized_pnl"` - // Amount of bad debt cleared by the PerpEF during the change. - // Bad debt is negative net margin past the liquidation point of a position. - BadDebt types.Coin `protobuf:"bytes,5,opt,name=bad_debt,json=badDebt,proto3" json:"bad_debt"` - // A funding payment made or received by the trader on the current position. - //'fundingPayment' is positive if 'owner' is the sender and negative if 'owner' - //is the receiver of the payment. Its magnitude is abs(size * fundingRate). - //Funding payments act to converge the mark price and index price - //(average price on major exchanges). - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - // The block number at which this position was changed. - BlockHeight int64 `protobuf:"varint,7,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` - // margin_to_user is the amount of collateral received by the trader during - // the position change. A positve value indicates that the trader received - // funds, while a negative value indicates that the trader spent funds. - MarginToUser github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,8,opt,name=margin_to_user,json=marginToUser,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"margin_to_user"` - // change_reason describes the reason for why the position resulted in a - // change. Change type can take the following values: - // - // - CHANGE_REASON_UNSPECIFIED: Unspecified change reason. - // - CHANGE_REASON_ADD_MARGIN: Margin was added to the position. - // - CHANGE_REASON_REMOVE_MARGIN: Margin was removed from the position. - // - CHANGE_REASON_OPEN_POSITION: A new position was opened. - // - CHANGE_REASON_CLOSE_POSITION: An existing position was closed. - ChangeReason ChangeReason `protobuf:"bytes,9,opt,name=change_reason,json=changeReason,proto3,customtype=ChangeReason" json:"change_reason"` - // exchanged_size represent the change in size for an existing position - // after the change. A positive value indicates that the position size - // increased, while a negative value indicates that the position size - // decreased. - ExchangedSize github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=exchanged_size,json=exchangedSize,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_size"` - // exchanged_notional represent the change in notional for an existing - // position after the change. A positive value indicates that the position - // notional increased, while a negative value indicates that the position - // notional decreased. - ExchangedNotional github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,11,opt,name=exchanged_notional,json=exchangedNotional,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_notional"` -} - -func (m *PositionChangedEvent) Reset() { *m = PositionChangedEvent{} } -func (m *PositionChangedEvent) String() string { return proto.CompactTextString(m) } -func (*PositionChangedEvent) ProtoMessage() {} -func (*PositionChangedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{0} -} -func (m *PositionChangedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PositionChangedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PositionChangedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PositionChangedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PositionChangedEvent.Merge(m, src) -} -func (m *PositionChangedEvent) XXX_Size() int { - return m.Size() -} -func (m *PositionChangedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_PositionChangedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_PositionChangedEvent proto.InternalMessageInfo - -func (m *PositionChangedEvent) GetFinalPosition() Position { - if m != nil { - return m.FinalPosition - } - return Position{} -} - -func (m *PositionChangedEvent) GetTransactionFee() types.Coin { - if m != nil { - return m.TransactionFee - } - return types.Coin{} -} - -func (m *PositionChangedEvent) GetBadDebt() types.Coin { - if m != nil { - return m.BadDebt - } - return types.Coin{} -} - -func (m *PositionChangedEvent) GetBlockHeight() int64 { - if m != nil { - return m.BlockHeight - } - return 0 -} - -// Emitted when a position is liquidated. Wraps a PositionChanged event since a -// liquidation causes position changes. -type PositionLiquidatedEvent struct { - PositionChangedEvent PositionChangedEvent `protobuf:"bytes,1,opt,name=position_changed_event,json=positionChangedEvent,proto3" json:"position_changed_event"` - // Address of the account that executed the tx. - LiquidatorAddress string `protobuf:"bytes,2,opt,name=liquidator_address,json=liquidatorAddress,proto3" json:"liquidator_address,omitempty"` - // Commission (in margin units) received by 'liquidator'. - FeeToLiquidator types.Coin `protobuf:"bytes,3,opt,name=fee_to_liquidator,json=feeToLiquidator,proto3" json:"fee_to_liquidator" yaml:"fee_to_liquidator"` - // Commission (in margin units) given to the ecosystem fund. - FeeToEcosystemFund types.Coin `protobuf:"bytes,4,opt,name=fee_to_ecosystem_fund,json=feeToEcosystemFund,proto3" json:"fee_to_ecosystem_fund" yaml:"fee_to_ecosystem_fund"` -} - -func (m *PositionLiquidatedEvent) Reset() { *m = PositionLiquidatedEvent{} } -func (m *PositionLiquidatedEvent) String() string { return proto.CompactTextString(m) } -func (*PositionLiquidatedEvent) ProtoMessage() {} -func (*PositionLiquidatedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{1} -} -func (m *PositionLiquidatedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PositionLiquidatedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PositionLiquidatedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PositionLiquidatedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PositionLiquidatedEvent.Merge(m, src) -} -func (m *PositionLiquidatedEvent) XXX_Size() int { - return m.Size() -} -func (m *PositionLiquidatedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_PositionLiquidatedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_PositionLiquidatedEvent proto.InternalMessageInfo - -func (m *PositionLiquidatedEvent) GetPositionChangedEvent() PositionChangedEvent { - if m != nil { - return m.PositionChangedEvent - } - return PositionChangedEvent{} -} - -func (m *PositionLiquidatedEvent) GetLiquidatorAddress() string { - if m != nil { - return m.LiquidatorAddress - } - return "" -} - -func (m *PositionLiquidatedEvent) GetFeeToLiquidator() types.Coin { - if m != nil { - return m.FeeToLiquidator - } - return types.Coin{} -} - -func (m *PositionLiquidatedEvent) GetFeeToEcosystemFund() types.Coin { - if m != nil { - return m.FeeToEcosystemFund - } - return types.Coin{} -} - -// Emitted when a position is settled. -type PositionSettledEvent struct { - // Identifier for the virtual pool of the position. - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // Owner of the position. - TraderAddress string `protobuf:"bytes,2,opt,name=trader_address,json=traderAddress,proto3" json:"trader_address,omitempty"` - // Settled coin as dictated by the settlement price of the perp.amm. - SettledCoins github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=settled_coins,json=settledCoins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"settled_coins" yaml:"settled_coins"` -} - -func (m *PositionSettledEvent) Reset() { *m = PositionSettledEvent{} } -func (m *PositionSettledEvent) String() string { return proto.CompactTextString(m) } -func (*PositionSettledEvent) ProtoMessage() {} -func (*PositionSettledEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{2} -} -func (m *PositionSettledEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PositionSettledEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PositionSettledEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PositionSettledEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_PositionSettledEvent.Merge(m, src) -} -func (m *PositionSettledEvent) XXX_Size() int { - return m.Size() -} -func (m *PositionSettledEvent) XXX_DiscardUnknown() { - xxx_messageInfo_PositionSettledEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_PositionSettledEvent proto.InternalMessageInfo - -func (m *PositionSettledEvent) GetTraderAddress() string { - if m != nil { - return m.TraderAddress - } - return "" -} - -func (m *PositionSettledEvent) GetSettledCoins() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.SettledCoins - } - return nil -} - -// Emitted when the funding rate changes for a market. -type FundingRateChangedEvent struct { - // The pair for which the funding rate was calculated. - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // The mark price of the pair. - MarkPriceTwap github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=mark_price_twap,json=markPriceTwap,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"mark_price_twap"` - // The oracle index price of the pair. - IndexPriceTwap github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=index_price_twap,json=indexPriceTwap,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"index_price_twap"` - // The latest premium fraction just calculated. - PremiumFraction github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=premium_fraction,json=premiumFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"premium_fraction"` - // The market's latest cumulative premium fraction. - // The funding payment a position will pay is the difference between this - // value and the latest cumulative premium fraction on the position, - // multiplied by the position size. - CumulativePremiumFraction github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=cumulative_premium_fraction,json=cumulativePremiumFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"cumulative_premium_fraction"` -} - -func (m *FundingRateChangedEvent) Reset() { *m = FundingRateChangedEvent{} } -func (m *FundingRateChangedEvent) String() string { return proto.CompactTextString(m) } -func (*FundingRateChangedEvent) ProtoMessage() {} -func (*FundingRateChangedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{3} -} -func (m *FundingRateChangedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *FundingRateChangedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_FundingRateChangedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *FundingRateChangedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_FundingRateChangedEvent.Merge(m, src) -} -func (m *FundingRateChangedEvent) XXX_Size() int { - return m.Size() -} -func (m *FundingRateChangedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_FundingRateChangedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_FundingRateChangedEvent proto.InternalMessageInfo - -// Emitted when liquidation fails. -type LiquidationFailedEvent struct { - // The pair for which we are trying to liquidate. - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // owner of the position. - Trader string `protobuf:"bytes,2,opt,name=trader,proto3" json:"trader,omitempty"` - // Address of the account that executed the tx. - Liquidator string `protobuf:"bytes,3,opt,name=liquidator,proto3" json:"liquidator,omitempty"` - // Reason for the liquidation failure. - Reason LiquidationFailedEvent_LiquidationFailedReason `protobuf:"varint,4,opt,name=reason,proto3,enum=nibiru.perp.v2.LiquidationFailedEvent_LiquidationFailedReason" json:"reason,omitempty"` -} - -func (m *LiquidationFailedEvent) Reset() { *m = LiquidationFailedEvent{} } -func (m *LiquidationFailedEvent) String() string { return proto.CompactTextString(m) } -func (*LiquidationFailedEvent) ProtoMessage() {} -func (*LiquidationFailedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{4} -} -func (m *LiquidationFailedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LiquidationFailedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LiquidationFailedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *LiquidationFailedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_LiquidationFailedEvent.Merge(m, src) -} -func (m *LiquidationFailedEvent) XXX_Size() int { - return m.Size() -} -func (m *LiquidationFailedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_LiquidationFailedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_LiquidationFailedEvent proto.InternalMessageInfo - -func (m *LiquidationFailedEvent) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -func (m *LiquidationFailedEvent) GetLiquidator() string { - if m != nil { - return m.Liquidator - } - return "" -} - -func (m *LiquidationFailedEvent) GetReason() LiquidationFailedEvent_LiquidationFailedReason { - if m != nil { - return m.Reason - } - return LiquidationFailedEvent_UNSPECIFIED -} - -// This event is emitted when the amm is updated, which can be triggered by -// the following events: -// -// - swap -// - edit price multiplier -// - edit depth -type AmmUpdatedEvent struct { - // the final state of the AMM - FinalAmm AMM `protobuf:"bytes,1,opt,name=final_amm,json=finalAmm,proto3" json:"final_amm"` - // The mark price of the pair. - MarkPriceTwap github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=mark_price_twap,json=markPriceTwap,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"mark_price_twap"` - // The oracle index price of the pair. - IndexPriceTwap github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=index_price_twap,json=indexPriceTwap,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"index_price_twap"` -} - -func (m *AmmUpdatedEvent) Reset() { *m = AmmUpdatedEvent{} } -func (m *AmmUpdatedEvent) String() string { return proto.CompactTextString(m) } -func (*AmmUpdatedEvent) ProtoMessage() {} -func (*AmmUpdatedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{5} -} -func (m *AmmUpdatedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AmmUpdatedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AmmUpdatedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AmmUpdatedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_AmmUpdatedEvent.Merge(m, src) -} -func (m *AmmUpdatedEvent) XXX_Size() int { - return m.Size() -} -func (m *AmmUpdatedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_AmmUpdatedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_AmmUpdatedEvent proto.InternalMessageInfo - -func (m *AmmUpdatedEvent) GetFinalAmm() AMM { - if m != nil { - return m.FinalAmm - } - return AMM{} -} - -// This event is emitted at the end of every block for persisting market changes -// off-chain -// -// Market changes are triggered by the following actions: -// -// - disabling market -// - changing market fees -// - bad debt is prepaid by the ecosystem fund -type MarketUpdatedEvent struct { - // the final state of the market - FinalMarket Market `protobuf:"bytes,1,opt,name=final_market,json=finalMarket,proto3" json:"final_market"` -} - -func (m *MarketUpdatedEvent) Reset() { *m = MarketUpdatedEvent{} } -func (m *MarketUpdatedEvent) String() string { return proto.CompactTextString(m) } -func (*MarketUpdatedEvent) ProtoMessage() {} -func (*MarketUpdatedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_a5313bbc89fa31dd, []int{6} -} -func (m *MarketUpdatedEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MarketUpdatedEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MarketUpdatedEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MarketUpdatedEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_MarketUpdatedEvent.Merge(m, src) -} -func (m *MarketUpdatedEvent) XXX_Size() int { - return m.Size() -} -func (m *MarketUpdatedEvent) XXX_DiscardUnknown() { - xxx_messageInfo_MarketUpdatedEvent.DiscardUnknown(m) -} - -var xxx_messageInfo_MarketUpdatedEvent proto.InternalMessageInfo - -func (m *MarketUpdatedEvent) GetFinalMarket() Market { - if m != nil { - return m.FinalMarket - } - return Market{} -} - -func init() { - proto.RegisterEnum("nibiru.perp.v2.LiquidationFailedEvent_LiquidationFailedReason", LiquidationFailedEvent_LiquidationFailedReason_name, LiquidationFailedEvent_LiquidationFailedReason_value) - proto.RegisterType((*PositionChangedEvent)(nil), "nibiru.perp.v2.PositionChangedEvent") - proto.RegisterType((*PositionLiquidatedEvent)(nil), "nibiru.perp.v2.PositionLiquidatedEvent") - proto.RegisterType((*PositionSettledEvent)(nil), "nibiru.perp.v2.PositionSettledEvent") - proto.RegisterType((*FundingRateChangedEvent)(nil), "nibiru.perp.v2.FundingRateChangedEvent") - proto.RegisterType((*LiquidationFailedEvent)(nil), "nibiru.perp.v2.LiquidationFailedEvent") - proto.RegisterType((*AmmUpdatedEvent)(nil), "nibiru.perp.v2.AmmUpdatedEvent") - proto.RegisterType((*MarketUpdatedEvent)(nil), "nibiru.perp.v2.MarketUpdatedEvent") -} - -func init() { proto.RegisterFile("nibiru/perp/v2/event.proto", fileDescriptor_a5313bbc89fa31dd) } - -var fileDescriptor_a5313bbc89fa31dd = []byte{ - // 1109 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x96, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xc0, 0xe3, 0xb8, 0xa4, 0xcd, 0xf8, 0x6f, 0x06, 0x93, 0x6e, 0x43, 0xe5, 0x84, 0x55, 0x41, - 0xb9, 0x64, 0x57, 0x09, 0x12, 0x52, 0x7b, 0x00, 0x39, 0x89, 0x43, 0x2c, 0x25, 0x8e, 0xd9, 0x38, - 0xa5, 0x05, 0xa1, 0x65, 0x76, 0x77, 0xec, 0x8c, 0xe2, 0x9d, 0x59, 0x76, 0xc6, 0x69, 0x92, 0x2f, - 0x00, 0x47, 0x6e, 0x7c, 0x07, 0x3e, 0x49, 0x8f, 0x3d, 0x22, 0x0e, 0x01, 0x25, 0xe2, 0xc0, 0x0d, - 0x71, 0xe5, 0x82, 0x76, 0x66, 0x36, 0xfe, 0x93, 0xb6, 0xa1, 0x16, 0x1c, 0x38, 0xd9, 0xfb, 0xde, - 0xbc, 0xdf, 0xfb, 0xb3, 0xef, 0xbd, 0x59, 0xb0, 0x40, 0x89, 0x47, 0xe2, 0xbe, 0x1d, 0xe1, 0x38, - 0xb2, 0x8f, 0xd7, 0x6c, 0x7c, 0x8c, 0xa9, 0xb0, 0xa2, 0x98, 0x09, 0x06, 0x8b, 0x4a, 0x67, 0x25, - 0x3a, 0xeb, 0x78, 0x6d, 0xa1, 0xd2, 0x65, 0x5d, 0x26, 0x55, 0x76, 0xf2, 0x4f, 0x9d, 0x5a, 0xb8, - 0xdf, 0x65, 0xac, 0xdb, 0xc3, 0x36, 0x8a, 0x88, 0x8d, 0x28, 0x65, 0x02, 0x09, 0xc2, 0x28, 0xd7, - 0xda, 0xaa, 0xcf, 0x78, 0xc8, 0xb8, 0xed, 0x21, 0x8e, 0xed, 0xe3, 0x55, 0x0f, 0x0b, 0xb4, 0x6a, - 0xfb, 0x8c, 0x50, 0xad, 0x1f, 0xf7, 0xcf, 0x05, 0x12, 0x58, 0xeb, 0x16, 0x35, 0x59, 0x3e, 0x79, - 0xfd, 0x8e, 0x2d, 0x48, 0x88, 0xb9, 0x40, 0x61, 0xa4, 0x0e, 0x98, 0x7f, 0xcc, 0x80, 0x4a, 0x8b, - 0x71, 0x92, 0x38, 0xdc, 0x38, 0x44, 0xb4, 0x8b, 0x83, 0x7a, 0x12, 0x3f, 0xac, 0x83, 0x62, 0x87, - 0x50, 0xd4, 0x73, 0x23, 0xad, 0x35, 0x32, 0x4b, 0x99, 0xe5, 0xdc, 0x9a, 0x61, 0x8d, 0xa6, 0x64, - 0xa5, 0xd6, 0xeb, 0xb7, 0x9e, 0x9f, 0x2f, 0x4e, 0x39, 0x05, 0x69, 0x95, 0x0a, 0xe1, 0x97, 0x60, - 0x2e, 0x05, 0xb8, 0x94, 0x25, 0x3f, 0xa8, 0x67, 0x4c, 0x2f, 0x65, 0x96, 0x67, 0xd7, 0xad, 0xe4, - 0xfc, 0xcf, 0xe7, 0x8b, 0x1f, 0x74, 0x89, 0x38, 0xec, 0x7b, 0x96, 0xcf, 0x42, 0x5b, 0xa7, 0xaa, - 0x7e, 0x56, 0x78, 0x70, 0x64, 0x8b, 0xd3, 0x08, 0x73, 0x6b, 0x13, 0xfb, 0x4e, 0x39, 0x05, 0x35, - 0x35, 0x07, 0x7a, 0xa0, 0x24, 0x62, 0x44, 0x39, 0xf2, 0x25, 0xbf, 0x83, 0xb1, 0x91, 0x95, 0x41, - 0xde, 0xb3, 0x14, 0xc1, 0x4a, 0x6a, 0x66, 0xe9, 0x9a, 0x59, 0x1b, 0x8c, 0xd0, 0xf5, 0x6a, 0xe2, - 0xf5, 0xcf, 0xf3, 0xc5, 0xf9, 0x53, 0x14, 0xf6, 0x1e, 0x99, 0x63, 0xf6, 0xa6, 0x53, 0x1c, 0x92, - 0x6c, 0x61, 0x0c, 0x3f, 0x03, 0xf9, 0x18, 0xa3, 0x1e, 0x39, 0xc3, 0x81, 0x1b, 0xd1, 0x9e, 0x71, - 0x6b, 0xa2, 0xd8, 0x73, 0x29, 0xa3, 0x45, 0x7b, 0xf0, 0x11, 0xb8, 0xe3, 0xa1, 0xc0, 0x0d, 0xb0, - 0x27, 0x8c, 0xb7, 0x6e, 0x8a, 0x57, 0x55, 0xf5, 0xb6, 0x87, 0x82, 0x4d, 0xec, 0x09, 0xf8, 0x39, - 0x28, 0x75, 0xfa, 0x34, 0x20, 0xb4, 0xeb, 0x46, 0xe8, 0x34, 0xc4, 0x54, 0x18, 0x33, 0x13, 0x45, - 0x54, 0xd4, 0x98, 0x96, 0xa2, 0xc0, 0xf7, 0x40, 0xde, 0xeb, 0x31, 0xff, 0xc8, 0x3d, 0xc4, 0xa4, - 0x7b, 0x28, 0x8c, 0xdb, 0x4b, 0x99, 0xe5, 0xac, 0x93, 0x93, 0xb2, 0x6d, 0x29, 0x82, 0x6d, 0x50, - 0x0c, 0x51, 0xdc, 0x25, 0xd4, 0x15, 0xcc, 0xed, 0x73, 0x1c, 0x1b, 0x77, 0xde, 0xd8, 0x75, 0x83, - 0x0a, 0x27, 0xaf, 0x28, 0x6d, 0x76, 0xc0, 0x71, 0x0c, 0x1f, 0x82, 0x82, 0x2f, 0x1b, 0xcf, 0x8d, - 0x31, 0xe2, 0x8c, 0x1a, 0xb3, 0x12, 0x5a, 0xd1, 0xd0, 0xbc, 0xea, 0x4a, 0x47, 0xea, 0x9c, 0xbc, - 0x3f, 0xf4, 0x04, 0x0f, 0x40, 0x11, 0x9f, 0x28, 0x49, 0xe0, 0x72, 0x72, 0x86, 0x0d, 0x30, 0x51, - 0x2d, 0x0a, 0x57, 0x94, 0x7d, 0x72, 0x86, 0xe1, 0x57, 0x00, 0x0e, 0xb0, 0x57, 0x4d, 0x9b, 0x9b, - 0x08, 0x3d, 0x77, 0x45, 0x4a, 0xbb, 0xd6, 0xfc, 0x36, 0x0b, 0xee, 0xa6, 0xf3, 0xb1, 0x43, 0xbe, - 0xe9, 0x93, 0x00, 0x89, 0x74, 0xea, 0xbe, 0x06, 0xf3, 0x57, 0xe3, 0x92, 0x46, 0x20, 0xf7, 0x89, - 0x9e, 0xbe, 0x07, 0xaf, 0x9a, 0xbe, 0xe1, 0xd9, 0xd5, 0x3d, 0x53, 0x89, 0x5e, 0x36, 0xd7, 0x2b, - 0x00, 0xf6, 0xb4, 0x53, 0x16, 0xbb, 0x28, 0x08, 0x62, 0xcc, 0xb9, 0x9a, 0x48, 0x67, 0x6e, 0xa0, - 0xa9, 0x29, 0x05, 0xec, 0x82, 0xb9, 0x0e, 0xc6, 0xc9, 0x0b, 0x1f, 0xe8, 0x6e, 0x1e, 0xb2, 0x25, - 0x3d, 0x64, 0x86, 0x1a, 0xb2, 0x6b, 0x04, 0xd3, 0x29, 0x75, 0x30, 0x6e, 0xb3, 0x9d, 0x2b, 0x09, - 0x8c, 0xc1, 0x3b, 0xfa, 0x18, 0xf6, 0x19, 0x3f, 0xe5, 0x02, 0x87, 0x6e, 0xd2, 0xa2, 0x72, 0xe0, - 0x5e, 0xeb, 0xec, 0x81, 0x76, 0x76, 0x7f, 0xc4, 0xd9, 0x28, 0xc5, 0x74, 0xa0, 0x74, 0x58, 0x4f, - 0xa5, 0x5b, 0x89, 0xf0, 0x87, 0xe9, 0xc1, 0xf2, 0xdb, 0xc7, 0x42, 0xf4, 0xd2, 0x22, 0xed, 0x82, - 0x5b, 0x11, 0x22, 0xb1, 0x2c, 0xfa, 0xec, 0xfa, 0x43, 0xfd, 0xce, 0x57, 0x87, 0xde, 0x79, 0x53, - 0xbe, 0x86, 0x8d, 0x43, 0x44, 0xa8, 0xad, 0xf7, 0xef, 0x89, 0xed, 0xb3, 0x30, 0x64, 0xd4, 0x46, - 0x9c, 0x63, 0x61, 0xb5, 0x10, 0x89, 0x1d, 0x89, 0x81, 0xef, 0x83, 0x64, 0xab, 0x04, 0x78, 0xbc, - 0xde, 0x05, 0x25, 0x4d, 0x6b, 0xfd, 0x5d, 0x06, 0x14, 0xb8, 0x0a, 0xc3, 0x4d, 0xf6, 0x3b, 0x37, - 0xb2, 0x4b, 0xd9, 0xd7, 0xe7, 0xbe, 0xad, 0x73, 0xaf, 0xa8, 0xdc, 0x47, 0xac, 0xcd, 0x1f, 0x7f, - 0x59, 0x5c, 0xfe, 0x07, 0x6d, 0x9a, 0x80, 0xb8, 0x93, 0xd7, 0xb6, 0xf2, 0xc9, 0xfc, 0x2d, 0x0b, - 0xee, 0x6e, 0xa9, 0x05, 0xe1, 0x20, 0x81, 0x47, 0x3a, 0xe8, 0x5f, 0x2e, 0xce, 0x63, 0x50, 0x0a, - 0x51, 0x7c, 0xe4, 0x46, 0x31, 0xf1, 0xb1, 0x2b, 0x9e, 0xa1, 0x68, 0xc2, 0xfb, 0xa1, 0x90, 0x60, - 0x5a, 0x09, 0xa5, 0xfd, 0x0c, 0x45, 0xf0, 0x09, 0x28, 0x13, 0x1a, 0xe0, 0x93, 0x61, 0x70, 0x76, - 0xb2, 0x55, 0x29, 0x39, 0x03, 0xf2, 0x53, 0x50, 0x8e, 0x62, 0x1c, 0x92, 0x7e, 0xe8, 0x76, 0x62, - 0x75, 0x53, 0xc8, 0x3d, 0xfe, 0xe6, 0xe4, 0x92, 0xe6, 0x6c, 0x69, 0x0c, 0xa4, 0xe0, 0x5d, 0xbf, - 0x1f, 0xf6, 0x7b, 0x48, 0x90, 0x63, 0xec, 0x5e, 0xf3, 0x32, 0xd9, 0xaa, 0xbf, 0x37, 0x40, 0xb6, - 0x46, 0xfd, 0x99, 0xbf, 0x4f, 0x83, 0xf9, 0x74, 0x08, 0x93, 0x0b, 0x0f, 0x91, 0xff, 0x6a, 0x06, - 0xe6, 0xc1, 0x8c, 0xea, 0x76, 0xdd, 0xfb, 0xfa, 0x09, 0x56, 0x01, 0x18, 0xdb, 0x2c, 0xb3, 0xce, - 0x90, 0x04, 0x3e, 0x06, 0x33, 0xfa, 0x5e, 0x48, 0x16, 0x41, 0x71, 0xed, 0xe3, 0xf1, 0x0d, 0xf8, - 0xf2, 0xf0, 0xaf, 0x8b, 0xf5, 0x0d, 0xa2, 0x69, 0x66, 0x04, 0xee, 0xbe, 0xe2, 0x08, 0x2c, 0x81, - 0xdc, 0x41, 0x73, 0xbf, 0x55, 0xdf, 0x68, 0x6c, 0x35, 0xea, 0x9b, 0xe5, 0x29, 0x58, 0x01, 0xe5, - 0xd6, 0xde, 0x7e, 0xa3, 0xdd, 0xd8, 0x6b, 0xba, 0xdb, 0xf5, 0xda, 0x4e, 0x7b, 0xfb, 0x69, 0x39, - 0x93, 0x48, 0x9b, 0x7b, 0xcd, 0xfa, 0x93, 0xc6, 0x7e, 0xbb, 0xde, 0x6c, 0xbb, 0xad, 0x5a, 0xc3, - 0x29, 0x4f, 0x43, 0x03, 0x54, 0x46, 0xa4, 0xda, 0xae, 0x9c, 0x35, 0xff, 0xca, 0x80, 0x52, 0x2d, - 0x0c, 0x0f, 0xa2, 0xa1, 0x7d, 0xff, 0x11, 0x98, 0x55, 0x5f, 0x59, 0x28, 0x0c, 0xf5, 0x8a, 0x7f, - 0x7b, 0x3c, 0xc1, 0xda, 0xee, 0xae, 0xde, 0xe8, 0x77, 0xe4, 0xd9, 0x5a, 0x18, 0xfe, 0xff, 0x86, - 0xc6, 0x3c, 0x00, 0x70, 0x17, 0xc5, 0x47, 0x58, 0x8c, 0xe4, 0xff, 0x09, 0xc8, 0xab, 0xfc, 0x43, - 0xa9, 0xd3, 0x25, 0x98, 0x1f, 0x2f, 0x81, 0xb2, 0xd4, 0x55, 0xc8, 0x49, 0x0b, 0x2d, 0xfa, 0xf4, - 0xf9, 0x45, 0x35, 0xf3, 0xe2, 0xa2, 0x9a, 0xf9, 0xf5, 0xa2, 0x9a, 0xf9, 0xfe, 0xb2, 0x3a, 0xf5, - 0xe2, 0xb2, 0x3a, 0xf5, 0xd3, 0x65, 0x75, 0xea, 0x8b, 0x95, 0x9b, 0x3a, 0x35, 0xfd, 0x5e, 0x96, - 0x31, 0x7b, 0x33, 0xf2, 0x7b, 0xf8, 0xc3, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xc9, 0xe7, 0x3a, - 0x1d, 0xce, 0x0b, 0x00, 0x00, -} - -func (m *PositionChangedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PositionChangedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PositionChangedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.ExchangedNotional.Size() - i -= size - if _, err := m.ExchangedNotional.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x5a - { - size := m.ExchangedSize.Size() - i -= size - if _, err := m.ExchangedSize.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - { - size := m.ChangeReason.Size() - i -= size - if _, err := m.ChangeReason.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - { - size := m.MarginToUser.Size() - i -= size - if _, err := m.MarginToUser.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - if m.BlockHeight != 0 { - i = encodeVarintEvent(dAtA, i, uint64(m.BlockHeight)) - i-- - dAtA[i] = 0x38 - } - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size, err := m.BadDebt.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.RealizedPnl.Size() - i -= size - if _, err := m.RealizedPnl.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.TransactionFee.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.PositionNotional.Size() - i -= size - if _, err := m.PositionNotional.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.FinalPosition.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *PositionLiquidatedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PositionLiquidatedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PositionLiquidatedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FeeToEcosystemFund.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.FeeToLiquidator.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.LiquidatorAddress) > 0 { - i -= len(m.LiquidatorAddress) - copy(dAtA[i:], m.LiquidatorAddress) - i = encodeVarintEvent(dAtA, i, uint64(len(m.LiquidatorAddress))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.PositionChangedEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *PositionSettledEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PositionSettledEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PositionSettledEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SettledCoins) > 0 { - for iNdEx := len(m.SettledCoins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.SettledCoins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.TraderAddress) > 0 { - i -= len(m.TraderAddress) - copy(dAtA[i:], m.TraderAddress) - i = encodeVarintEvent(dAtA, i, uint64(len(m.TraderAddress))) - i-- - dAtA[i] = 0x12 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *FundingRateChangedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *FundingRateChangedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *FundingRateChangedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.CumulativePremiumFraction.Size() - i -= size - if _, err := m.CumulativePremiumFraction.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.PremiumFraction.Size() - i -= size - if _, err := m.PremiumFraction.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.IndexPriceTwap.Size() - i -= size - if _, err := m.IndexPriceTwap.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.MarkPriceTwap.Size() - i -= size - if _, err := m.MarkPriceTwap.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *LiquidationFailedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *LiquidationFailedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LiquidationFailedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Reason != 0 { - i = encodeVarintEvent(dAtA, i, uint64(m.Reason)) - i-- - dAtA[i] = 0x20 - } - if len(m.Liquidator) > 0 { - i -= len(m.Liquidator) - copy(dAtA[i:], m.Liquidator) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Liquidator))) - i-- - dAtA[i] = 0x1a - } - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0x12 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *AmmUpdatedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AmmUpdatedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AmmUpdatedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.IndexPriceTwap.Size() - i -= size - if _, err := m.IndexPriceTwap.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.MarkPriceTwap.Size() - i -= size - if _, err := m.MarkPriceTwap.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.FinalAmm.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MarketUpdatedEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MarketUpdatedEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MarketUpdatedEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FinalMarket.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintEvent(dAtA []byte, offset int, v uint64) int { - offset -= sovEvent(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *PositionChangedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.FinalPosition.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.PositionNotional.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.TransactionFee.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.RealizedPnl.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.BadDebt.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FundingPayment.Size() - n += 1 + l + sovEvent(uint64(l)) - if m.BlockHeight != 0 { - n += 1 + sovEvent(uint64(m.BlockHeight)) - } - l = m.MarginToUser.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.ChangeReason.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.ExchangedSize.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.ExchangedNotional.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *PositionLiquidatedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.PositionChangedEvent.Size() - n += 1 + l + sovEvent(uint64(l)) - l = len(m.LiquidatorAddress) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - l = m.FeeToLiquidator.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FeeToEcosystemFund.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *PositionSettledEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovEvent(uint64(l)) - l = len(m.TraderAddress) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - if len(m.SettledCoins) > 0 { - for _, e := range m.SettledCoins { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - return n -} - -func (m *FundingRateChangedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.MarkPriceTwap.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.IndexPriceTwap.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.PremiumFraction.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.CumulativePremiumFraction.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *LiquidationFailedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovEvent(uint64(l)) - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - l = len(m.Liquidator) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - if m.Reason != 0 { - n += 1 + sovEvent(uint64(m.Reason)) - } - return n -} - -func (m *AmmUpdatedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.FinalAmm.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.MarkPriceTwap.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.IndexPriceTwap.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *MarketUpdatedEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.FinalMarket.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func sovEvent(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvent(x uint64) (n int) { - return sovEvent(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *PositionChangedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PositionChangedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PositionChangedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalPosition", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalPosition.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PositionNotional", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PositionNotional.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TransactionFee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TransactionFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RealizedPnl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RealizedPnl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BadDebt", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BadDebt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BlockHeight", wireType) - } - m.BlockHeight = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BlockHeight |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginToUser", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginToUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangeReason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ChangeReason.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedSize", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedNotional", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedNotional.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PositionLiquidatedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PositionLiquidatedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PositionLiquidatedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PositionChangedEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PositionChangedEvent.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LiquidatorAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LiquidatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeeToLiquidator", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FeeToLiquidator.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeeToEcosystemFund", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FeeToEcosystemFund.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PositionSettledEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PositionSettledEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PositionSettledEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TraderAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TraderAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SettledCoins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SettledCoins = append(m.SettledCoins, types.Coin{}) - if err := m.SettledCoins[len(m.SettledCoins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *FundingRateChangedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: FundingRateChangedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FundingRateChangedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarkPriceTwap", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarkPriceTwap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IndexPriceTwap", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.IndexPriceTwap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PremiumFraction", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PremiumFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CumulativePremiumFraction", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CumulativePremiumFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LiquidationFailedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LiquidationFailedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LiquidationFailedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Liquidator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Liquidator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - m.Reason = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Reason |= LiquidationFailedEvent_LiquidationFailedReason(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AmmUpdatedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AmmUpdatedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AmmUpdatedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalAmm", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalAmm.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarkPriceTwap", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarkPriceTwap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IndexPriceTwap", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.IndexPriceTwap.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MarketUpdatedEvent) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MarketUpdatedEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MarketUpdatedEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalMarket", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalMarket.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvent(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvent - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvent - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvent - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvent = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvent = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvent = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/perp/v2/types/expected_keepers.go b/x/perp/v2/types/expected_keepers.go deleted file mode 100644 index 19aa6b590..000000000 --- a/x/perp/v2/types/expected_keepers.go +++ /dev/null @@ -1,50 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/epochs/types" - - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -// ---------------------------------------------------------- -// Keeper Interfaces -// ---------------------------------------------------------- - -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI - GetModuleAddress(name string) sdk.AccAddress - GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error - SendCoinsFromAccountToModule( - ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, - amt sdk.Coins, - ) error - SendCoinsFromModuleToModule( - ctx sdk.Context, senderModule string, recipientModule string, amt sdk.Coins) error - SendCoinsFromModuleToAccount( - ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, - amt sdk.Coins, - ) error - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins -} - -type OracleKeeper interface { - GetExchangeRate(ctx sdk.Context, pair asset.Pair) (sdk.Dec, error) - GetExchangeRateTwap(ctx sdk.Context, pair asset.Pair) (sdk.Dec, error) - SetPrice(ctx sdk.Context, pair asset.Pair, price sdk.Dec) -} - -type EpochKeeper interface { - // GetEpochInfo returns epoch info by identifier. - GetEpochInfo(ctx sdk.Context, identifier string) (types.EpochInfo, error) -} diff --git a/x/perp/v2/types/genesis.go b/x/perp/v2/types/genesis.go deleted file mode 100644 index 07d5f9484..000000000 --- a/x/perp/v2/types/genesis.go +++ /dev/null @@ -1,78 +0,0 @@ -package types - -import ( - "encoding/json" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - - "github.com/cosmos/cosmos-sdk/codec" -) - -// DefaultGenesis returns the default Capability genesis state -func DefaultGenesis() *GenesisState { - return &GenesisState{ - Markets: []Market{}, - Amms: []AMM{}, - Positions: []GenesisPosition{}, - ReserveSnapshots: []ReserveSnapshot{}, - } -} - -// Validate performs basic genesis state validation returning an error upon any -// failure. -func (gs GenesisState) Validate() error { - for _, m := range gs.Markets { - if err := m.Validate(); err != nil { - return err - } - } - - for _, m := range gs.Amms { - if err := m.Validate(); err != nil { - return err - } - } - - // TODO: validate positions - //for _, pos := range gs.Positions { - // if err := pos.Validate(); err != nil { - // return err - // } - //} - - return nil -} - -func DefaultMarket(pair asset.Pair) Market { - return Market{ - Pair: pair, - Enabled: true, - Version: 1, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5000"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.NewDec(10), - } -} - -func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *GenesisState { - var genesisState GenesisState - - if appState[ModuleName] != nil { - cdc.MustUnmarshalJSON(appState[ModuleName], &genesisState) - } - - return &genesisState -} diff --git a/x/perp/v2/types/genesis.pb.go b/x/perp/v2/types/genesis.pb.go deleted file mode 100644 index aacf854cc..000000000 --- a/x/perp/v2/types/genesis.pb.go +++ /dev/null @@ -1,1987 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/perp/v2/genesis.proto - -package types - -import ( - fmt "fmt" - github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" - _ "github.com/cosmos/cosmos-sdk/types" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the perp module's genesis state. -// Thge genesis state is used not only to start the network but also useful for -// exporting and importing state during network upgrades. -type GenesisState struct { - Markets []Market `protobuf:"bytes,2,rep,name=markets,proto3" json:"markets"` - Amms []AMM `protobuf:"bytes,3,rep,name=amms,proto3" json:"amms"` - Positions []GenesisPosition `protobuf:"bytes,4,rep,name=positions,proto3" json:"positions"` - ReserveSnapshots []ReserveSnapshot `protobuf:"bytes,5,rep,name=reserve_snapshots,json=reserveSnapshots,proto3" json:"reserve_snapshots"` - DnrEpoch uint64 `protobuf:"varint,6,opt,name=dnr_epoch,json=dnrEpoch,proto3" json:"dnr_epoch,omitempty"` - TraderVolumes []GenesisState_TraderVolume `protobuf:"bytes,7,rep,name=trader_volumes,json=traderVolumes,proto3" json:"trader_volumes"` - GlobalDiscount []GenesisState_Discount `protobuf:"bytes,8,rep,name=global_discount,json=globalDiscount,proto3" json:"global_discount"` - CustomDiscounts []GenesisState_CustomDiscount `protobuf:"bytes,9,rep,name=custom_discounts,json=customDiscounts,proto3" json:"custom_discounts"` - MarketLastVersions []GenesisMarketLastVersion `protobuf:"bytes,10,rep,name=market_last_versions,json=marketLastVersions,proto3" json:"market_last_versions"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetMarkets() []Market { - if m != nil { - return m.Markets - } - return nil -} - -func (m *GenesisState) GetAmms() []AMM { - if m != nil { - return m.Amms - } - return nil -} - -func (m *GenesisState) GetPositions() []GenesisPosition { - if m != nil { - return m.Positions - } - return nil -} - -func (m *GenesisState) GetReserveSnapshots() []ReserveSnapshot { - if m != nil { - return m.ReserveSnapshots - } - return nil -} - -func (m *GenesisState) GetDnrEpoch() uint64 { - if m != nil { - return m.DnrEpoch - } - return 0 -} - -func (m *GenesisState) GetTraderVolumes() []GenesisState_TraderVolume { - if m != nil { - return m.TraderVolumes - } - return nil -} - -func (m *GenesisState) GetGlobalDiscount() []GenesisState_Discount { - if m != nil { - return m.GlobalDiscount - } - return nil -} - -func (m *GenesisState) GetCustomDiscounts() []GenesisState_CustomDiscount { - if m != nil { - return m.CustomDiscounts - } - return nil -} - -func (m *GenesisState) GetMarketLastVersions() []GenesisMarketLastVersion { - if m != nil { - return m.MarketLastVersions - } - return nil -} - -type GenesisState_TraderVolume struct { - Trader string `protobuf:"bytes,1,opt,name=trader,proto3" json:"trader,omitempty"` - Epoch uint64 `protobuf:"varint,2,opt,name=epoch,proto3" json:"epoch,omitempty"` - Volume github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=volume,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"volume"` -} - -func (m *GenesisState_TraderVolume) Reset() { *m = GenesisState_TraderVolume{} } -func (m *GenesisState_TraderVolume) String() string { return proto.CompactTextString(m) } -func (*GenesisState_TraderVolume) ProtoMessage() {} -func (*GenesisState_TraderVolume) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{0, 0} -} -func (m *GenesisState_TraderVolume) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState_TraderVolume) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState_TraderVolume.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState_TraderVolume) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState_TraderVolume.Merge(m, src) -} -func (m *GenesisState_TraderVolume) XXX_Size() int { - return m.Size() -} -func (m *GenesisState_TraderVolume) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState_TraderVolume.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState_TraderVolume proto.InternalMessageInfo - -func (m *GenesisState_TraderVolume) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -func (m *GenesisState_TraderVolume) GetEpoch() uint64 { - if m != nil { - return m.Epoch - } - return 0 -} - -type GenesisState_Discount struct { - Fee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=fee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"fee"` - Volume github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=volume,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"volume"` -} - -func (m *GenesisState_Discount) Reset() { *m = GenesisState_Discount{} } -func (m *GenesisState_Discount) String() string { return proto.CompactTextString(m) } -func (*GenesisState_Discount) ProtoMessage() {} -func (*GenesisState_Discount) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{0, 1} -} -func (m *GenesisState_Discount) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState_Discount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState_Discount.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState_Discount) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState_Discount.Merge(m, src) -} -func (m *GenesisState_Discount) XXX_Size() int { - return m.Size() -} -func (m *GenesisState_Discount) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState_Discount.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState_Discount proto.InternalMessageInfo - -type GenesisState_CustomDiscount struct { - Trader string `protobuf:"bytes,1,opt,name=trader,proto3" json:"trader,omitempty"` - Discount *GenesisState_Discount `protobuf:"bytes,2,opt,name=discount,proto3" json:"discount,omitempty"` -} - -func (m *GenesisState_CustomDiscount) Reset() { *m = GenesisState_CustomDiscount{} } -func (m *GenesisState_CustomDiscount) String() string { return proto.CompactTextString(m) } -func (*GenesisState_CustomDiscount) ProtoMessage() {} -func (*GenesisState_CustomDiscount) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{0, 2} -} -func (m *GenesisState_CustomDiscount) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState_CustomDiscount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState_CustomDiscount.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState_CustomDiscount) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState_CustomDiscount.Merge(m, src) -} -func (m *GenesisState_CustomDiscount) XXX_Size() int { - return m.Size() -} -func (m *GenesisState_CustomDiscount) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState_CustomDiscount.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState_CustomDiscount proto.InternalMessageInfo - -func (m *GenesisState_CustomDiscount) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -func (m *GenesisState_CustomDiscount) GetDiscount() *GenesisState_Discount { - if m != nil { - return m.Discount - } - return nil -} - -// GenesisMarketLastVersion is the last version including pair only used for -// genesis -type GenesisMarketLastVersion struct { - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Version uint64 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` -} - -func (m *GenesisMarketLastVersion) Reset() { *m = GenesisMarketLastVersion{} } -func (m *GenesisMarketLastVersion) String() string { return proto.CompactTextString(m) } -func (*GenesisMarketLastVersion) ProtoMessage() {} -func (*GenesisMarketLastVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{1} -} -func (m *GenesisMarketLastVersion) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisMarketLastVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisMarketLastVersion.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisMarketLastVersion) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisMarketLastVersion.Merge(m, src) -} -func (m *GenesisMarketLastVersion) XXX_Size() int { - return m.Size() -} -func (m *GenesisMarketLastVersion) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisMarketLastVersion.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisMarketLastVersion proto.InternalMessageInfo - -func (m *GenesisMarketLastVersion) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -type GenesisPosition struct { - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Version uint64 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` - Position Position `protobuf:"bytes,3,opt,name=position,proto3" json:"position"` -} - -func (m *GenesisPosition) Reset() { *m = GenesisPosition{} } -func (m *GenesisPosition) String() string { return proto.CompactTextString(m) } -func (*GenesisPosition) ProtoMessage() {} -func (*GenesisPosition) Descriptor() ([]byte, []int) { - return fileDescriptor_c2c7acfef3993fde, []int{2} -} -func (m *GenesisPosition) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisPosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisPosition.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisPosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisPosition.Merge(m, src) -} -func (m *GenesisPosition) XXX_Size() int { - return m.Size() -} -func (m *GenesisPosition) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisPosition.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisPosition proto.InternalMessageInfo - -func (m *GenesisPosition) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -func (m *GenesisPosition) GetPosition() Position { - if m != nil { - return m.Position - } - return Position{} -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "nibiru.perp.v2.GenesisState") - proto.RegisterType((*GenesisState_TraderVolume)(nil), "nibiru.perp.v2.GenesisState.TraderVolume") - proto.RegisterType((*GenesisState_Discount)(nil), "nibiru.perp.v2.GenesisState.Discount") - proto.RegisterType((*GenesisState_CustomDiscount)(nil), "nibiru.perp.v2.GenesisState.CustomDiscount") - proto.RegisterType((*GenesisMarketLastVersion)(nil), "nibiru.perp.v2.GenesisMarketLastVersion") - proto.RegisterType((*GenesisPosition)(nil), "nibiru.perp.v2.GenesisPosition") -} - -func init() { proto.RegisterFile("nibiru/perp/v2/genesis.proto", fileDescriptor_c2c7acfef3993fde) } - -var fileDescriptor_c2c7acfef3993fde = []byte{ - // 678 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x54, 0xdf, 0x6a, 0x13, 0x4d, - 0x14, 0xcf, 0x36, 0x69, 0x9a, 0x4c, 0xfb, 0xa5, 0xfd, 0xc6, 0x52, 0x96, 0x58, 0xd2, 0x52, 0x50, - 0x22, 0xd2, 0x1d, 0x1a, 0x41, 0xd0, 0x2b, 0x9b, 0x56, 0x8b, 0x60, 0xa4, 0x6c, 0x4b, 0x2f, 0x44, - 0x88, 0x93, 0xcd, 0xb8, 0x59, 0x9a, 0x9d, 0x59, 0xe6, 0x4c, 0x82, 0x5e, 0xeb, 0x03, 0x78, 0xe1, - 0x23, 0xf8, 0x0c, 0x3e, 0x43, 0x2f, 0x7b, 0x29, 0x5e, 0x14, 0x69, 0x5f, 0x44, 0x76, 0x66, 0x12, - 0x93, 0xc5, 0x54, 0x45, 0xf0, 0x2a, 0x99, 0x39, 0xbf, 0x3f, 0x67, 0xce, 0x39, 0x7b, 0xd0, 0x3a, - 0x8f, 0x3a, 0x91, 0x1c, 0x90, 0x84, 0xc9, 0x84, 0x0c, 0x1b, 0x24, 0x64, 0x9c, 0x41, 0x04, 0x5e, - 0x22, 0x85, 0x12, 0xb8, 0x62, 0xa2, 0x5e, 0x1a, 0xf5, 0x86, 0x8d, 0xea, 0x6a, 0x28, 0x42, 0xa1, - 0x43, 0x24, 0xfd, 0x67, 0x50, 0xd5, 0xf5, 0x50, 0x88, 0xb0, 0xcf, 0x08, 0x4d, 0x22, 0x42, 0x39, - 0x17, 0x8a, 0xaa, 0x48, 0x70, 0xab, 0x51, 0xad, 0x05, 0x02, 0x62, 0x01, 0xa4, 0x43, 0x81, 0x91, - 0xe1, 0x4e, 0x87, 0x29, 0xba, 0x43, 0x02, 0x11, 0x71, 0x1b, 0xaf, 0x66, 0x32, 0x00, 0x45, 0x15, - 0x33, 0xb1, 0xad, 0x4f, 0x25, 0xb4, 0x74, 0x60, 0x32, 0x3a, 0x4a, 0xaf, 0xf1, 0x7d, 0xb4, 0x10, - 0x53, 0x79, 0xca, 0x14, 0xb8, 0x73, 0x9b, 0xf9, 0xfa, 0x62, 0x63, 0xcd, 0x9b, 0x4e, 0xd1, 0x6b, - 0xe9, 0x70, 0xb3, 0x70, 0x76, 0xb1, 0x91, 0xf3, 0x47, 0x60, 0xbc, 0x8d, 0x0a, 0x34, 0x8e, 0xc1, - 0xcd, 0x6b, 0xd2, 0x8d, 0x2c, 0x69, 0xb7, 0xd5, 0xb2, 0x0c, 0x0d, 0xc3, 0x7b, 0xa8, 0x9c, 0x08, - 0x88, 0xf4, 0x33, 0xdc, 0x82, 0xe6, 0x6c, 0x64, 0x39, 0x36, 0xaf, 0x43, 0x8b, 0xb3, 0xfc, 0x1f, - 0x3c, 0xec, 0xa3, 0xff, 0x25, 0x03, 0x26, 0x87, 0xac, 0x0d, 0x9c, 0x26, 0xd0, 0x13, 0x0a, 0xdc, - 0xf9, 0x9f, 0x8b, 0xf9, 0x06, 0x78, 0x64, 0x71, 0x56, 0x6c, 0x45, 0x4e, 0x5f, 0x03, 0xbe, 0x89, - 0xca, 0x5d, 0x2e, 0xdb, 0x2c, 0x11, 0x41, 0xcf, 0x2d, 0x6e, 0x3a, 0xf5, 0x82, 0x5f, 0xea, 0x72, - 0xf9, 0x38, 0x3d, 0xe3, 0x13, 0x54, 0x51, 0x92, 0x76, 0x99, 0x6c, 0x0f, 0x45, 0x7f, 0x10, 0x33, - 0x70, 0x17, 0xb4, 0xdb, 0x9d, 0x19, 0xa9, 0xeb, 0x92, 0x7a, 0xc7, 0x9a, 0x72, 0xa2, 0x19, 0xd6, - 0xf7, 0x3f, 0x35, 0x71, 0x07, 0xf8, 0x18, 0x2d, 0x87, 0x7d, 0xd1, 0xa1, 0xfd, 0x76, 0x37, 0x82, - 0x40, 0x0c, 0xb8, 0x72, 0x4b, 0x5a, 0xf8, 0xd6, 0xb5, 0xc2, 0xfb, 0x16, 0x6c, 0x45, 0x2b, 0x46, - 0x63, 0x74, 0x8b, 0x5f, 0xa2, 0x95, 0x60, 0x00, 0x4a, 0xc4, 0x63, 0x55, 0x70, 0xcb, 0x5a, 0xf6, - 0xee, 0xb5, 0xb2, 0x7b, 0x9a, 0x94, 0x11, 0x5f, 0x0e, 0xa6, 0x6e, 0x01, 0xbf, 0x42, 0xab, 0xa6, - 0xf7, 0xed, 0x3e, 0x05, 0xd5, 0x1e, 0x32, 0x09, 0xba, 0x99, 0x48, 0x3b, 0xd4, 0x67, 0x38, 0x98, - 0xe1, 0x79, 0x46, 0x41, 0x9d, 0x18, 0x82, 0x95, 0xc7, 0x71, 0x36, 0x00, 0xd5, 0xf7, 0x0e, 0x5a, - 0x9a, 0xac, 0x1d, 0x5e, 0x43, 0x45, 0x53, 0x37, 0xd7, 0xd9, 0x74, 0xea, 0x65, 0xdf, 0x9e, 0xf0, - 0x2a, 0x9a, 0x37, 0xfd, 0x9a, 0xd3, 0xfd, 0x32, 0x07, 0xfc, 0x04, 0x15, 0x4d, 0x97, 0xdc, 0x7c, - 0x8a, 0x6e, 0x7a, 0xa9, 0xd1, 0xd7, 0x8b, 0x8d, 0xdb, 0x61, 0xa4, 0x7a, 0x83, 0x8e, 0x17, 0x88, - 0x98, 0xd8, 0x2f, 0xc7, 0xfc, 0x6c, 0x43, 0xf7, 0x94, 0xa8, 0xb7, 0x09, 0x03, 0xef, 0x29, 0x57, - 0xbe, 0x65, 0x57, 0x3f, 0x3a, 0xa8, 0x34, 0xae, 0xe9, 0x23, 0x94, 0x7f, 0xcd, 0x98, 0xf1, 0xff, - 0x23, 0xc5, 0x7d, 0x16, 0xf8, 0x29, 0x75, 0x22, 0xad, 0xb9, 0xbf, 0x4a, 0xeb, 0x14, 0x55, 0xa6, - 0x1b, 0x35, 0xb3, 0x3c, 0xbb, 0xa8, 0x34, 0x1e, 0xab, 0xd4, 0xf3, 0x77, 0xc7, 0xca, 0x1f, 0xd3, - 0xb6, 0xde, 0x39, 0xc8, 0x9d, 0xd5, 0x41, 0xdc, 0x42, 0x85, 0x84, 0x46, 0xd6, 0xb5, 0xf9, 0xc0, - 0xbe, 0x67, 0x67, 0xe2, 0x3d, 0xcf, 0xb5, 0xdb, 0x5e, 0x8f, 0x46, 0x9c, 0xd8, 0x65, 0xf4, 0x86, - 0x04, 0x22, 0x8e, 0x05, 0x27, 0x14, 0x80, 0x29, 0xef, 0x90, 0x46, 0xd2, 0xd7, 0x32, 0xd8, 0x45, - 0x0b, 0x76, 0x98, 0x6c, 0x3f, 0x47, 0xc7, 0xad, 0xcf, 0x0e, 0x5a, 0xce, 0x2c, 0x85, 0x7f, 0x66, - 0x8e, 0x1f, 0xa2, 0xd2, 0x68, 0xf3, 0xe8, 0x81, 0x5a, 0x6c, 0xb8, 0xd9, 0x2a, 0x66, 0x36, 0xd5, - 0x18, 0xdf, 0x3c, 0x38, 0xbb, 0xac, 0x39, 0xe7, 0x97, 0x35, 0xe7, 0xdb, 0x65, 0xcd, 0xf9, 0x70, - 0x55, 0xcb, 0x9d, 0x5f, 0xd5, 0x72, 0x5f, 0xae, 0x6a, 0xb9, 0x17, 0xdb, 0xbf, 0x4a, 0x74, 0xb4, - 0xb4, 0xf5, 0x00, 0x74, 0x8a, 0x7a, 0x6b, 0xdf, 0xfb, 0x1e, 0x00, 0x00, 0xff, 0xff, 0x86, 0x40, - 0x11, 0x89, 0x55, 0x06, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.MarketLastVersions) > 0 { - for iNdEx := len(m.MarketLastVersions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.MarketLastVersions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - } - if len(m.CustomDiscounts) > 0 { - for iNdEx := len(m.CustomDiscounts) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.CustomDiscounts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } - } - if len(m.GlobalDiscount) > 0 { - for iNdEx := len(m.GlobalDiscount) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.GlobalDiscount[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - } - if len(m.TraderVolumes) > 0 { - for iNdEx := len(m.TraderVolumes) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TraderVolumes[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - } - if m.DnrEpoch != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.DnrEpoch)) - i-- - dAtA[i] = 0x30 - } - if len(m.ReserveSnapshots) > 0 { - for iNdEx := len(m.ReserveSnapshots) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ReserveSnapshots[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if len(m.Positions) > 0 { - for iNdEx := len(m.Positions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Positions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.Amms) > 0 { - for iNdEx := len(m.Amms) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Amms[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Markets) > 0 { - for iNdEx := len(m.Markets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Markets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - return len(dAtA) - i, nil -} - -func (m *GenesisState_TraderVolume) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState_TraderVolume) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState_TraderVolume) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Volume.Size() - i -= size - if _, err := m.Volume.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Epoch != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Epoch)) - i-- - dAtA[i] = 0x10 - } - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GenesisState_Discount) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState_Discount) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState_Discount) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Volume.Size() - i -= size - if _, err := m.Volume.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.Fee.Size() - i -= size - if _, err := m.Fee.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *GenesisState_CustomDiscount) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState_CustomDiscount) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState_CustomDiscount) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Discount != nil { - { - size, err := m.Discount.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintGenesis(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GenesisMarketLastVersion) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisMarketLastVersion) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisMarketLastVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Version != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x10 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *GenesisPosition) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisPosition) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisPosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Position.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Version != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x10 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Markets) > 0 { - for _, e := range m.Markets { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Amms) > 0 { - for _, e := range m.Amms { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.Positions) > 0 { - for _, e := range m.Positions { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.ReserveSnapshots) > 0 { - for _, e := range m.ReserveSnapshots { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if m.DnrEpoch != 0 { - n += 1 + sovGenesis(uint64(m.DnrEpoch)) - } - if len(m.TraderVolumes) > 0 { - for _, e := range m.TraderVolumes { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.GlobalDiscount) > 0 { - for _, e := range m.GlobalDiscount { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.CustomDiscounts) > 0 { - for _, e := range m.CustomDiscounts { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - if len(m.MarketLastVersions) > 0 { - for _, e := range m.MarketLastVersions { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - return n -} - -func (m *GenesisState_TraderVolume) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - if m.Epoch != 0 { - n += 1 + sovGenesis(uint64(m.Epoch)) - } - l = m.Volume.Size() - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func (m *GenesisState_Discount) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Fee.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.Volume.Size() - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func (m *GenesisState_CustomDiscount) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovGenesis(uint64(l)) - } - if m.Discount != nil { - l = m.Discount.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - return n -} - -func (m *GenesisMarketLastVersion) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.Version != 0 { - n += 1 + sovGenesis(uint64(m.Version)) - } - return n -} - -func (m *GenesisPosition) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.Version != 0 { - n += 1 + sovGenesis(uint64(m.Version)) - } - l = m.Position.Size() - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Markets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Markets = append(m.Markets, Market{}) - if err := m.Markets[len(m.Markets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amms", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Amms = append(m.Amms, AMM{}) - if err := m.Amms[len(m.Amms)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Positions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Positions = append(m.Positions, GenesisPosition{}) - if err := m.Positions[len(m.Positions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ReserveSnapshots", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ReserveSnapshots = append(m.ReserveSnapshots, ReserveSnapshot{}) - if err := m.ReserveSnapshots[len(m.ReserveSnapshots)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DnrEpoch", wireType) - } - m.DnrEpoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.DnrEpoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TraderVolumes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TraderVolumes = append(m.TraderVolumes, GenesisState_TraderVolume{}) - if err := m.TraderVolumes[len(m.TraderVolumes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalDiscount", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GlobalDiscount = append(m.GlobalDiscount, GenesisState_Discount{}) - if err := m.GlobalDiscount[len(m.GlobalDiscount)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CustomDiscounts", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CustomDiscounts = append(m.CustomDiscounts, GenesisState_CustomDiscount{}) - if err := m.CustomDiscounts[len(m.CustomDiscounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarketLastVersions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.MarketLastVersions = append(m.MarketLastVersions, GenesisMarketLastVersion{}) - if err := m.MarketLastVersions[len(m.MarketLastVersions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GenesisState_TraderVolume) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TraderVolume: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TraderVolume: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Epoch", wireType) - } - m.Epoch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Epoch |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Volume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GenesisState_Discount) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Discount: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Discount: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Volume", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Volume.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GenesisState_CustomDiscount) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: CustomDiscount: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CustomDiscount: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Discount", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Discount == nil { - m.Discount = &GenesisState_Discount{} - } - if err := m.Discount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GenesisMarketLastVersion) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisMarketLastVersion: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisMarketLastVersion: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GenesisPosition) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisPosition: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisPosition: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Position", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Position.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/perp/v2/types/genesis_test.go b/x/perp/v2/types/genesis_test.go deleted file mode 100644 index eac7b2810..000000000 --- a/x/perp/v2/types/genesis_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package types_test - -import ( - "encoding/json" - "testing" - "time" - - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/perp/v2/types" -) - -func TestDefaultGenesis(t *testing.T) { - // Initialization - genesis := types.DefaultGenesis() - - // Test the conditions - require.NotNil(t, genesis) - require.Empty(t, genesis.Markets) - require.Empty(t, genesis.Amms) - require.Empty(t, genesis.Positions) - require.Empty(t, genesis.ReserveSnapshots) -} - -func TestGenesisValidate(t *testing.T) { - pair := asset.MustNewPair("ubtc:unusd") - validMarket := types.DefaultMarket(pair) - validAmms := types.AMM{ - BaseReserve: sdk.OneDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.OneDec(), - } - validPositions := types.GenesisPosition{ - Pair: pair, - Version: 1, - Position: types.Position{ - TraderAddress: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Pair: pair, - Size_: sdk.OneDec(), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.OneDec(), - LastUpdatedBlockNumber: 0, - }, - } - invalidMarket := &types.Market{ - Pair: pair, - Enabled: true, - LatestCumulativePremiumFraction: sdk.ZeroDec(), - ExchangeFeeRatio: sdk.MustNewDecFromStr("-0.0010"), - EcosystemFundFeeRatio: sdk.MustNewDecFromStr("0.0010"), - LiquidationFeeRatio: sdk.MustNewDecFromStr("0.0500"), - PartialLiquidationRatio: sdk.MustNewDecFromStr("0.5000"), - FundingRateEpochId: epochstypes.ThirtyMinuteEpochID, - MaxFundingRate: sdk.NewDec(1), - TwapLookbackWindow: time.Minute * 30, - PrepaidBadDebt: sdk.NewCoin(denoms.USDC, sdk.ZeroInt()), - MaintenanceMarginRatio: sdk.MustNewDecFromStr("0.0625"), - MaxLeverage: sdk.NewDec(10), - } - invalidAmms := types.AMM{ - BaseReserve: sdk.ZeroDec(), - QuoteReserve: sdk.OneDec(), - PriceMultiplier: sdk.OneDec(), - SqrtDepth: sdk.OneDec(), - } - invalidPositions := types.GenesisPosition{ - Pair: pair, - Version: 1, - Position: types.Position{ - TraderAddress: "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v", - Pair: pair, - Size_: sdk.ZeroDec(), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.OneDec(), - LastUpdatedBlockNumber: 0, - }, - } - - tests := []struct { - name string - setupGenesis func() *types.GenesisState - shouldFail bool - }{ - { - name: "valid genesis", - setupGenesis: func() *types.GenesisState { - genesis := types.GenesisState{ - Markets: []types.Market{validMarket}, - Amms: []types.AMM{validAmms}, - Positions: []types.GenesisPosition{validPositions}, - ReserveSnapshots: []types.ReserveSnapshot{}, - } - - return &genesis - }, - shouldFail: false, - }, - { - name: "invalid market", - setupGenesis: func() *types.GenesisState { - genesis := types.GenesisState{ - Markets: []types.Market{*invalidMarket}, - Amms: []types.AMM{validAmms}, - Positions: []types.GenesisPosition{validPositions}, - ReserveSnapshots: []types.ReserveSnapshot{}, - } - - return &genesis - }, - shouldFail: true, - }, - { - name: "invalid amm", - setupGenesis: func() *types.GenesisState { - genesis := types.GenesisState{ - Markets: []types.Market{*invalidMarket}, - Amms: []types.AMM{invalidAmms}, - Positions: []types.GenesisPosition{validPositions}, - ReserveSnapshots: []types.ReserveSnapshot{}, - } - - return &genesis - }, - shouldFail: true, - }, - { - name: "invalid position", - setupGenesis: func() *types.GenesisState { - genesis := types.GenesisState{ - Markets: []types.Market{*invalidMarket}, - Amms: []types.AMM{validAmms}, - Positions: []types.GenesisPosition{invalidPositions}, - ReserveSnapshots: []types.ReserveSnapshot{}, - } - - return &genesis - }, - shouldFail: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.setupGenesis().Validate() - if tt.shouldFail { - require.Error(t, err) - } else { - require.NoError(t, err) - } - }) - } -} - -func TestDefaultMarket(t *testing.T) { - // Initialize asset pair - pair := asset.NewPair("ubtc", "unusd") - - // Initialize the market with default values - market := types.DefaultMarket(pair) - - // Test the conditions - require.NotNil(t, market) - // Continue testing individual attributes of market as required -} - -func TestGetGenesisStateFromAppState(t *testing.T) { - // Initialize codec and AppState - var cdc codec.JSONCodec - appState := make(map[string]json.RawMessage) - - // Insert valid ModuleName data into AppState - // insert valid ModuleName data - - // Get the GenesisState - genesis := types.GetGenesisStateFromAppState(cdc, appState) - - // Test the conditions - require.NotNil(t, genesis) -} diff --git a/x/perp/v2/types/keys.go b/x/perp/v2/types/keys.go deleted file mode 100644 index c7658450f..000000000 --- a/x/perp/v2/types/keys.go +++ /dev/null @@ -1,31 +0,0 @@ -package types - -import "github.com/NibiruChain/nibiru/x/common" - -const ( - ModuleName = "perp" - VaultModuleAccount = "vault" - PerpEFModuleAccount = "perp_ef" - FeePoolModuleAccount = "fee_pool" -) - -var ( - // StoreKey defines the primary module store key. - StoreKey = ModuleName - - MemStoreKey = "mem_" + ModuleName - - // RouterKey is the message route for perp. - RouterKey = ModuleName - - // QuerierRoute defines the module's query routing key. - QuerierRoute = ModuleName -) - -var ModuleAccounts = []string{ - ModuleName, - PerpEFModuleAccount, - VaultModuleAccount, - FeePoolModuleAccount, - common.TreasuryPoolModuleAccount, -} diff --git a/x/perp/v2/types/market.go b/x/perp/v2/types/market.go deleted file mode 100644 index d0996892f..000000000 --- a/x/perp/v2/types/market.go +++ /dev/null @@ -1,190 +0,0 @@ -package types - -import ( - fmt "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func isPercent(v sdk.Dec) bool { - return v.GTE(sdk.ZeroDec()) && v.LTE(sdk.OneDec()) -} - -func (market Market) Validate() error { - if !isPercent(market.MaintenanceMarginRatio) { - return fmt.Errorf("maintenance margin ratio ratio must be 0 <= ratio <= 1") - } - - if !isPercent(market.EcosystemFundFeeRatio) { - return fmt.Errorf("ecosystem fund fee ratio must be 0 <= ratio <= 1") - } - - if !isPercent(market.ExchangeFeeRatio) { - return fmt.Errorf("exchange fee ratio must be 0 <= ratio <= 1") - } - - if !isPercent(market.LiquidationFeeRatio) { - return fmt.Errorf("liquidation fee ratio must be 0 <= ratio <= 1") - } - - if !isPercent(market.PartialLiquidationRatio) { - return fmt.Errorf("partial liquidation ratio must be 0 <= ratio <= 1") - } - - if market.MaxLeverage.LTE(sdk.ZeroDec()) { - return fmt.Errorf("max leverage must be > 0") - } - - if market.MaxFundingRate.LT(sdk.ZeroDec()) { - return fmt.Errorf("max funding rate must be >= 0") - } - - if sdk.OneDec().Quo(market.MaxLeverage).LT(market.MaintenanceMarginRatio) { - return fmt.Errorf("margin ratio opened with max leverage position will be lower than Maintenance margin ratio") - } - - return nil -} - -func (market Market) WithMaintenanceMarginRatio(value sdk.Dec) Market { - market.MaintenanceMarginRatio = value - return market -} - -func (market Market) WithMaxLeverage(value sdk.Dec) Market { - market.MaxLeverage = value - return market -} - -func (market Market) WithEcosystemFee(value sdk.Dec) Market { - market.EcosystemFundFeeRatio = value - return market -} - -func (market Market) WithExchangeFee(value sdk.Dec) Market { - market.ExchangeFeeRatio = value - return market -} - -func (market Market) WithLiquidationFee(value sdk.Dec) Market { - market.LiquidationFeeRatio = value - return market -} - -func (market Market) WithPartialLiquidationRatio(value sdk.Dec) Market { - market.PartialLiquidationRatio = value - return market -} - -func (market Market) WithFundingRateEpochId(value string) Market { - market.FundingRateEpochId = value - return market -} - -func (market Market) WithMaxFundingRate(value sdk.Dec) Market { - market.MaxFundingRate = value - return market -} - -func (market Market) WithPair(value asset.Pair) Market { - market.Pair = value - return market -} - -func (market Market) WithLatestCumulativePremiumFraction(value sdk.Dec) Market { - market.LatestCumulativePremiumFraction = value - return market -} - -func (market Market) WithEcosystemFundFeeRatio(value sdk.Dec) Market { - market.EcosystemFundFeeRatio = value - return market -} - -func (market Market) WithExchangeFeeRatio(value sdk.Dec) Market { - market.ExchangeFeeRatio = value - return market -} - -func (market Market) WithLiquidationFeeRatio(value sdk.Dec) Market { - market.LiquidationFeeRatio = value - return market -} - -func (market Market) WithPrepaidBadDebt(value sdk.Coin) Market { - market.PrepaidBadDebt = value - return market -} - -func (market Market) WithEnabled(value bool) Market { - market.Enabled = value - return market -} - -func (market Market) WithTwapLookbackWindow(value time.Duration) Market { - market.TwapLookbackWindow = value - return market -} - -func MarketsAreEqual(expected, actual Market) error { - if expected.Pair != actual.Pair { - return fmt.Errorf("expected market pair %s, got %s", expected.Pair, actual.Pair) - } - - if !expected.MaintenanceMarginRatio.Equal(actual.MaintenanceMarginRatio) { - return fmt.Errorf("expected market maintenance margin ratio %s, got %s", expected.MaintenanceMarginRatio, actual.MaintenanceMarginRatio) - } - - if !expected.MaxLeverage.Equal(actual.MaxLeverage) { - return fmt.Errorf("expected market max leverage %s, got %s", expected.MaxLeverage, actual.MaxLeverage) - } - - if !expected.EcosystemFundFeeRatio.Equal(actual.EcosystemFundFeeRatio) { - return fmt.Errorf("expected market ecosystem fund fee ratio %s, got %s", expected.EcosystemFundFeeRatio, actual.EcosystemFundFeeRatio) - } - - if !expected.ExchangeFeeRatio.Equal(actual.ExchangeFeeRatio) { - return fmt.Errorf("expected market exchange fee ratio %s, got %s", expected.ExchangeFeeRatio, actual.ExchangeFeeRatio) - } - - if !expected.LiquidationFeeRatio.Equal(actual.LiquidationFeeRatio) { - return fmt.Errorf("expected market liquidation fee ratio %s, got %s", expected.LiquidationFeeRatio, actual.LiquidationFeeRatio) - } - - if !expected.PartialLiquidationRatio.Equal(actual.PartialLiquidationRatio) { - return fmt.Errorf("expected market partial liquidation ratio %s, got %s", expected.PartialLiquidationRatio, actual.PartialLiquidationRatio) - } - - if expected.FundingRateEpochId != actual.FundingRateEpochId { - return fmt.Errorf("expected market funding rate epoch id %s, got %s", expected.FundingRateEpochId, actual.FundingRateEpochId) - } - - if !expected.MaxFundingRate.Equal(actual.MaxFundingRate) { - return fmt.Errorf("expected market max funding rate %s, got %s", expected.MaxFundingRate, actual.MaxFundingRate) - } - - if !expected.PrepaidBadDebt.Equal(actual.PrepaidBadDebt) { - return fmt.Errorf("expected market prepaid bad debt %s, got %s", expected.PrepaidBadDebt, actual.PrepaidBadDebt) - } - - if expected.Enabled != actual.Enabled { - return fmt.Errorf("expected market enabled %t, got %t", expected.Enabled, actual.Enabled) - } - - if expected.TwapLookbackWindow != actual.TwapLookbackWindow { - return fmt.Errorf("expected market twap lookback window %s, got %s", expected.TwapLookbackWindow, actual.TwapLookbackWindow) - } - - if !expected.LatestCumulativePremiumFraction.Equal(actual.LatestCumulativePremiumFraction) { - return fmt.Errorf( - "expected market latest cumulative premium fraction %s, got %s", - expected.LatestCumulativePremiumFraction, - actual.LatestCumulativePremiumFraction, - ) - } - - return nil -} diff --git a/x/perp/v2/types/market_test.go b/x/perp/v2/types/market_test.go deleted file mode 100644 index 506d0299d..000000000 --- a/x/perp/v2/types/market_test.go +++ /dev/null @@ -1,177 +0,0 @@ -package types - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestIsPercent(t *testing.T) { - require.True(t, isPercent(sdk.ZeroDec())) - require.True(t, isPercent(sdk.NewDec(1))) - require.True(t, isPercent(sdk.NewDecWithPrec(5, 1))) // 0.5 - require.False(t, isPercent(sdk.NewDec(-1))) - require.False(t, isPercent(sdk.NewDec(2))) -} - -func TestValidate(t *testing.T) { - // Test when all values are within expected ranges - market := Market{}. - WithMaintenanceMarginRatio(sdk.NewDecWithPrec(1, 1)). - WithEcosystemFee(sdk.NewDecWithPrec(3, 1)). - WithExchangeFee(sdk.NewDecWithPrec(4, 1)). - WithLiquidationFee(sdk.NewDecWithPrec(2, 1)). - WithPartialLiquidationRatio(sdk.NewDecWithPrec(1, 1)). - WithMaxLeverage(sdk.NewDec(10)). - WithMaxFundingRate(sdk.NewDec(1)) - require.NoError(t, market.Validate()) - - testCases := []struct { - modifier func(Market) Market - requiredError string - }{ - { - modifier: func(m Market) Market { return m.WithMaintenanceMarginRatio(sdk.NewDec(-1)) }, - requiredError: "maintenance margin ratio ratio must be 0 <= ratio <= 1", - }, - { - modifier: func(m Market) Market { return m.WithEcosystemFee(sdk.NewDec(2)) }, - requiredError: "ecosystem fund fee ratio must be 0 <= ratio <= 1", - }, - { - modifier: func(m Market) Market { return m.WithExchangeFee(sdk.NewDec(-1)) }, - requiredError: "exchange fee ratio must be 0 <= ratio <= 1", - }, - { - modifier: func(m Market) Market { return m.WithLiquidationFee(sdk.NewDec(2)) }, - requiredError: "liquidation fee ratio must be 0 <= ratio <= 1", - }, - { - modifier: func(m Market) Market { return m.WithPartialLiquidationRatio(sdk.NewDec(-1)) }, - requiredError: "partial liquidation ratio must be 0 <= ratio <= 1", - }, - { - modifier: func(m Market) Market { return m.WithMaxLeverage(sdk.ZeroDec()) }, - requiredError: "max leverage must be > 0", - }, - { - modifier: func(m Market) Market { return m.WithMaxFundingRate(sdk.NewDec(-1)) }, - requiredError: "max funding rate must be >= 0", - }, - { - modifier: func(m Market) Market { - return m.WithMaxLeverage(sdk.NewDec(20)).WithMaintenanceMarginRatio(sdk.NewDec(1)) - }, - requiredError: "margin ratio opened with max leverage position will be lower than Maintenance margin ratio", - }, - } - for _, tc := range testCases { - tc := tc - t.Run(tc.requiredError, func(t *testing.T) { - newMarket := tc.modifier(market) - - err := newMarket.Validate() - require.Error(t, err) - require.Contains(t, err.Error(), tc.requiredError) - }) - } -} - -func TestMarketEqual(t *testing.T) { - market := Market{}. - WithMaintenanceMarginRatio(sdk.NewDecWithPrec(1, 1)). - WithEcosystemFee(sdk.NewDecWithPrec(3, 1)). - WithExchangeFee(sdk.NewDecWithPrec(4, 1)). - WithLiquidationFee(sdk.NewDecWithPrec(2, 1)). - WithPartialLiquidationRatio(sdk.NewDecWithPrec(1, 1)). - WithMaxLeverage(sdk.NewDec(10)). - WithLatestCumulativePremiumFraction(sdk.OneDec()). - WithMaxFundingRate(sdk.OneDec()) - - // Test when all values are within expected ranges - require.NoError(t, market.Validate()) - - testCases := []struct { - modifier func(Market) Market - requiredError string - }{ - { - modifier: func(m Market) Market { return m.WithPair("ueth:unusd") }, - requiredError: "expected market pair", - }, - { - modifier: func(m Market) Market { return m.WithMaintenanceMarginRatio(sdk.NewDec(42)) }, - requiredError: "expected market maintenance margin ratio", - }, - { - modifier: func(m Market) Market { return m.WithMaxLeverage(sdk.NewDec(42)) }, - requiredError: "expected market max leverage", - }, - { - modifier: func(m Market) Market { return m.WithPartialLiquidationRatio(sdk.NewDec(42)) }, - requiredError: "expected market partial liquidation ratio", - }, - { - modifier: func(m Market) Market { return m.WithFundingRateEpochId("hi") }, - requiredError: "expected market funding rate epoch id", - }, - { - modifier: func(m Market) Market { return m.WithMaxFundingRate(sdk.NewDec(42)) }, - requiredError: "expected market max funding rate", - }, - { - modifier: func(m Market) Market { return m.WithLatestCumulativePremiumFraction(sdk.NewDec(42)) }, - requiredError: "expected market latest cumulative premium fraction", - }, - { - modifier: func(m Market) Market { return m.WithEcosystemFundFeeRatio(sdk.NewDec(42)) }, - requiredError: "expected market ecosystem fund fee ratio", - }, - { - modifier: func(m Market) Market { return m.WithExchangeFeeRatio(sdk.NewDec(42)) }, - requiredError: "expected market exchange fee ratio", - }, - { - modifier: func(m Market) Market { return m.WithLiquidationFeeRatio(sdk.NewDec(42)) }, - requiredError: "expected market liquidation fee ratio", - }, - { - modifier: func(m Market) Market { return m.WithPrepaidBadDebt(sdk.NewCoin("ubtc", sdk.OneInt())) }, - requiredError: "expected market prepaid bad debt", - }, - { - modifier: func(m Market) Market { return m.WithEnabled(true) }, - requiredError: "expected market enabled", - }, - { - modifier: func(m Market) Market { return m.WithTwapLookbackWindow(time.Minute) }, - requiredError: "expected market twap lookback window", - }, - } - for _, tc := range testCases { - tc := tc - t.Run(tc.requiredError, func(t *testing.T) { - newMarket := tc.modifier(market) - - err := MarketsAreEqual(market, newMarket) - require.Error(t, err) - require.Contains(t, err.Error(), tc.requiredError) - }) - } -} - -func TestMarketsAreEqual(t *testing.T) { - market1 := new(Market).WithMaintenanceMarginRatio(sdk.NewDecWithPrec(5, 1)) - market2 := new(Market).WithMaintenanceMarginRatio(sdk.NewDecWithPrec(5, 1)) - - // Test when markets are equal - require.NoError(t, MarketsAreEqual(market1, market2)) - - // Test when markets are not equal - market2 = market2.WithMaintenanceMarginRatio(sdk.NewDecWithPrec(3, 1)) - require.Error(t, MarketsAreEqual(market1, market2)) - - require.NoError(t, MarketsAreEqual(market1, market1)) -} diff --git a/x/perp/v2/types/msgs.go b/x/perp/v2/types/msgs.go deleted file mode 100644 index 8eda3d24c..000000000 --- a/x/perp/v2/types/msgs.go +++ /dev/null @@ -1,256 +0,0 @@ -package types - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/types/errors" - - sdkerrors "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -var ( - _ sdk.Msg = &MsgRemoveMargin{} - _ sdk.Msg = &MsgAddMargin{} - _ sdk.Msg = &MsgMarketOrder{} - _ sdk.Msg = &MsgMultiLiquidate{} - _ sdk.Msg = &MsgClosePosition{} - _ sdk.Msg = &MsgDonateToEcosystemFund{} - _ sdk.Msg = &MsgPartialClose{} -) - -// MsgRemoveMargin - -func (m MsgRemoveMargin) Route() string { return "perp" } -func (m MsgRemoveMargin) Type() string { return "remove_margin_msg" } - -func (m MsgRemoveMargin) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return err - } - - err := m.Pair.Validate() - if err != nil { - return err - } - - if !m.Margin.Amount.IsPositive() { - return fmt.Errorf("margin must be positive, not: %v", m.Margin.Amount.String()) - } - - if m.Margin.Denom != m.Pair.QuoteDenom() { - return fmt.Errorf("invalid margin denom, expected %s, got %s", m.Pair.QuoteDenom(), m.Margin.Denom) - } - - return nil -} - -func (m MsgRemoveMargin) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m MsgRemoveMargin) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} - -// MsgAddMargin - -func (m MsgAddMargin) Route() string { return "perp" } -func (m MsgAddMargin) Type() string { return "add_margin_msg" } - -func (m MsgAddMargin) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return err - } - - err := m.Pair.Validate() - if err != nil { - return err - } - - if !m.Margin.Amount.IsPositive() { - return fmt.Errorf("margin must be positive, not: %v", m.Margin.Amount.String()) - } - - if m.Margin.Denom != m.Pair.QuoteDenom() { - return fmt.Errorf("invalid margin denom, expected %s, got %s", m.Pair.QuoteDenom(), m.Margin.Denom) - } - - return nil -} - -func (m MsgAddMargin) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m MsgAddMargin) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} - -// MsgMarketOrder - -func (m MsgMarketOrder) Route() string { return "perp" } -func (m MsgMarketOrder) Type() string { return "market_order_msg" } - -func (m *MsgMarketOrder) ValidateBasic() error { - if m.Side != Direction_SHORT && m.Side != Direction_LONG { - return fmt.Errorf("invalid side") - } - if err := m.Pair.Validate(); err != nil { - return err - } - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return err - } - if !m.Leverage.IsPositive() { - return fmt.Errorf("leverage must always be greater than zero") - } - if m.BaseAssetAmountLimit.IsNegative() { - return fmt.Errorf("base asset amount limit must not be negative") - } - if !m.QuoteAssetAmount.IsPositive() { - return fmt.Errorf("quote asset amount must be always greater than zero") - } - - return nil -} - -func (m MsgMarketOrder) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m *MsgMarketOrder) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} - -// MsgMultiLiquidate - -func (m MsgMultiLiquidate) Route() string { return "perp" } -func (m MsgMultiLiquidate) Type() string { return "multi_liquidate_msg" } - -func (m *MsgMultiLiquidate) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return err - } - - for i, liquidation := range m.Liquidations { - if _, err := sdk.AccAddressFromBech32(liquidation.Trader); err != nil { - return fmt.Errorf("invalid liquidation at index %d: %w", i, err) - } - - if err := liquidation.Pair.Validate(); err != nil { - return fmt.Errorf("invalid liquidation at index %d: %w", i, err) - } - } - - return nil -} - -func (m MsgMultiLiquidate) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m *MsgMultiLiquidate) GetSigners() []sdk.AccAddress { - addr, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - - return []sdk.AccAddress{addr} -} - -// MsgClosePosition - -func (m MsgClosePosition) Route() string { return "perp" } -func (m MsgClosePosition) Type() string { return "close_position_msg" } - -func (m MsgClosePosition) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid sender address (%s)", err) - } - if err := m.Pair.Validate(); err != nil { - return err - } - return nil -} - -func (m MsgClosePosition) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m MsgClosePosition) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} - -// MsgDonateToEcosystemFund - -func (m MsgDonateToEcosystemFund) Route() string { return "perp" } -func (m MsgDonateToEcosystemFund) Type() string { return "donate_to_ef_msg" } - -func (m MsgDonateToEcosystemFund) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid sender address (%s)", err) - } - if m.Donation.IsNil() || m.Donation.IsNegative() { - return fmt.Errorf("invalid donation amount: %s", m.Donation.String()) - } - return nil -} - -func (m MsgDonateToEcosystemFund) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m MsgDonateToEcosystemFund) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} - -// MsgPartialClose - -func (m MsgPartialClose) Route() string { return "perp" } -func (m MsgPartialClose) Type() string { return "partial_close_msg" } - -func (m MsgPartialClose) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid sender address (%s)", err) - } - if err := m.Pair.Validate(); err != nil { - return err - } - if !m.Size_.IsPositive() { - return fmt.Errorf("invalid size amount: %s", m.Size_.String()) - } - return nil -} - -func (m MsgPartialClose) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) -} - -func (m MsgPartialClose) GetSigners() []sdk.AccAddress { - signer, err := sdk.AccAddressFromBech32(m.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{signer} -} diff --git a/x/perp/v2/types/msgs_test.go b/x/perp/v2/types/msgs_test.go deleted file mode 100644 index d06c612cf..000000000 --- a/x/perp/v2/types/msgs_test.go +++ /dev/null @@ -1,538 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func TestMsgValidateBasic(t *testing.T) { - validSender := "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v" - validPair := asset.MustNewPair("ubtc:unusd") - invalidPair := asset.NewPair("//ubtc", "unusd") - - testCases := []struct { - name string - msg sdk.Msg - expectErr bool - expectedError string - }{ - // MsgRemoveMargin test cases - { - "Test MsgRemoveMargin: Valid input", - &MsgRemoveMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("unusd", sdk.NewInt(10)), - }, - false, - "", - }, - { - "Test MsgRemoveMargin: Invalid pair", - &MsgRemoveMargin{ - Sender: validSender, - Pair: invalidPair, - Margin: sdk.NewCoin("denom", sdk.NewInt(10)), - }, - true, - "invalid base asset", - }, - { - "Test MsgRemoveMargin: Invalid sender", - &MsgRemoveMargin{ - Sender: "invalid", - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.NewInt(10)), - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgRemoveMargin: Negative margin", - &MsgRemoveMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.ZeroInt()), - }, - true, - "margin must be positive", - }, - { - "Test MsgRemoveMargin: Invalid margin", - &MsgRemoveMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.OneInt()), - }, - true, - "invalid margin denom", - }, - - // MsgAddMargin test cases - { - "Test MsgAddMargin: Valid input", - &MsgAddMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("unusd", sdk.NewInt(10)), - }, - false, - "", - }, - { - "Test MsgAddMargin: Invalid sender", - &MsgAddMargin{ - Sender: "invalid", - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.NewInt(10)), - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgAddMargin: Invalid pair", - &MsgAddMargin{ - Sender: validSender, - Pair: invalidPair, - Margin: sdk.NewCoin("denom", sdk.NewInt(10)), - }, - true, - "invalid base asset", - }, - { - "Test MsgAddMargin: Negative margin", - &MsgAddMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.ZeroInt()), - }, - true, - "margin must be positive", - }, - { - "Test MsgAddMargin: Invalid margin", - &MsgAddMargin{ - Sender: validSender, - Pair: validPair, - Margin: sdk.NewCoin("denom", sdk.OneInt()), - }, - true, - "invalid margin denom", - }, - // MsgMarketOrder test cases - { - "Test MsgMarketOrder: Valid input", - &MsgMarketOrder{ - Sender: validSender, - Pair: validPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(10), - }, - false, - "", - }, - { - "Test MsgMarketOrder: Invalid Side", - &MsgMarketOrder{ - Sender: validSender, - Pair: validPair, - Side: Direction_DIRECTION_UNSPECIFIED, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(10), - }, - true, - "invalid side", - }, - { - "Test MsgMarketOrder: Invalid Pair", - &MsgMarketOrder{ - Sender: validSender, - Pair: invalidPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(10), - }, - true, - "invalid base asset", - }, - { - "Test MsgMarketOrder: Invalid Sender", - &MsgMarketOrder{ - Sender: "invalid", - Pair: validPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(10), - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgMarketOrder: Negative Leverage", - &MsgMarketOrder{ - Sender: validSender, - Pair: validPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(-10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(10), - }, - true, - "leverage must always be greater than zero", - }, - { - "Test MsgMarketOrder: Negative BaseAssetAmountLimit", - &MsgMarketOrder{ - Sender: validSender, - Pair: validPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(-10), - QuoteAssetAmount: sdk.NewInt(10), - }, - true, - "base asset amount limit must not be negative", - }, - { - "Test MsgMarketOrder: Negative QuoteAssetAmount", - &MsgMarketOrder{ - Sender: validSender, - Pair: validPair, - Side: Direction_SHORT, - Leverage: sdk.NewDec(10), - BaseAssetAmountLimit: sdk.NewInt(10), - QuoteAssetAmount: sdk.NewInt(-10), - }, - true, - "quote asset amount must be always greater than zero", - }, - // MsgClosePosition test cases - { - "Test MsgClosePosition: Valid input", - &MsgClosePosition{ - Sender: validSender, - Pair: validPair, - }, - false, - "", - }, - { - "Test MsgClosePosition: Invalid pair", - &MsgClosePosition{ - Sender: validSender, - Pair: invalidPair, - }, - true, - "invalid base asset", - }, - { - "Test MsgClosePosition: Invalid sender", - &MsgClosePosition{ - Sender: "invalid", - Pair: validPair, - }, - true, - "decoding bech32 failed", - }, - // MsgPartialClose test cases - { - "Test MsgPartialClose: Valid input", - &MsgPartialClose{ - Sender: validSender, - Pair: validPair, - Size_: sdk.NewDec(10), - }, - false, - "", - }, - { - "Test MsgPartialClose: Invalid pair", - &MsgPartialClose{ - Sender: validSender, - Pair: invalidPair, - Size_: sdk.NewDec(10), - }, - true, - "invalid base asset", - }, - { - "Test MsgPartialClose: Invalid sender", - &MsgPartialClose{ - Sender: "invalid", - Pair: validPair, - Size_: sdk.NewDec(10), - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgPartialClose: Invalid size", - &MsgPartialClose{ - Sender: validSender, - Pair: validPair, - Size_: sdk.NewDec(0), - }, - true, - "invalid size amount", - }, - - // MsgDonateToEcosystemFund test cases - { - "Test MsgDonateToEcosystemFund: Valid input", - &MsgDonateToEcosystemFund{ - Sender: validSender, - Donation: sdk.NewCoin("unusd", sdk.NewInt(10)), - }, - false, - "", - }, - { - "Test MsgDonateToEcosystemFund: Invalid sender", - &MsgDonateToEcosystemFund{ - Sender: "invalid", - Donation: sdk.NewCoin("unusd", sdk.NewInt(10)), - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgDonateToEcosystemFund: Invalid donation amount", - &MsgDonateToEcosystemFund{ - Sender: validSender, - }, - true, - "invalid donation amount", - }, - // MsgMultiLiquidate - { - "Test MsgMultiLiquidate: Valid input", - &MsgMultiLiquidate{ - Sender: validSender, - Liquidations: []*MsgMultiLiquidate_Liquidation{ - {Trader: validSender, Pair: validPair}, - {Trader: validSender, Pair: validPair}, - }, - }, - false, - "", - }, - { - "Test MsgMultiLiquidate: Invalid Sender", - &MsgMultiLiquidate{ - Sender: "invalid", - Liquidations: []*MsgMultiLiquidate_Liquidation{ - {Trader: validSender, Pair: validPair}, - {Trader: validSender, Pair: validPair}, - }, - }, - true, - "decoding bech32 failed", - }, - { - "Test MsgMultiLiquidate: Invalid Trader", - &MsgMultiLiquidate{ - Sender: validSender, - Liquidations: []*MsgMultiLiquidate_Liquidation{ - {Trader: "invalid", Pair: validPair}, - {Trader: validSender, Pair: validPair}, - }, - }, - true, - "invalid liquidation at index 0: decoding bech32 failed", - }, - { - "Test MsgMultiLiquidate: Invalid Pair", - &MsgMultiLiquidate{ - Sender: validSender, - Liquidations: []*MsgMultiLiquidate_Liquidation{ - {Trader: validSender, Pair: invalidPair}, - {Trader: validSender, Pair: validPair}, - }, - }, - true, - "invalid liquidation at index 0: invalid base asset", - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - err := tc.msg.ValidateBasic() - if tc.expectErr { - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedError) - } else { - require.NoError(t, err) - } - }) - } -} - -func TestMsg_GetSigners(t *testing.T) { - validSender := "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v" - invalidSender := "invalid_address" - - msgValidSenderList := []sdk.Msg{ - &MsgAddMargin{Sender: validSender}, - &MsgRemoveMargin{Sender: validSender}, - &MsgMarketOrder{Sender: validSender}, - &MsgClosePosition{Sender: validSender}, - &MsgPartialClose{Sender: validSender}, - &MsgDonateToEcosystemFund{Sender: validSender}, - &MsgMultiLiquidate{Sender: validSender}, - } - msgInvalidSenderList := []sdk.Msg{ - &MsgAddMargin{Sender: invalidSender}, - &MsgRemoveMargin{Sender: invalidSender}, - &MsgMarketOrder{Sender: invalidSender}, - &MsgClosePosition{Sender: invalidSender}, - &MsgPartialClose{Sender: invalidSender}, - &MsgDonateToEcosystemFund{Sender: invalidSender}, - &MsgMultiLiquidate{Sender: invalidSender}, - } - - for _, msg := range msgValidSenderList { - defer func() { - r := recover() - if (r != nil) != false { - t.Errorf("GetSigners() recover = %v, expectPanic = %v", r, false) - } - }() - signerAddr, _ := sdk.AccAddressFromBech32(validSender) - require.Equal(t, []sdk.AccAddress{signerAddr}, msg.GetSigners()) - } - for _, msg := range msgInvalidSenderList { - defer func() { - r := recover() - if (r != nil) != true { - t.Errorf("GetSigners() recover = %v, expectPanic = %v", r, true) - } - }() - msg.GetSigners() - } -} - -type RouteTyper interface { - sdk.Msg - Route() string - Type() string -} - -func TestMsg_RouteAndType(t *testing.T) { - testCases := []struct { - name string - msg RouteTyper - expectedRoute string - expectedType string - }{ - { - name: "MsgAddMargin", - msg: &MsgAddMargin{}, - expectedRoute: "perp", - expectedType: "add_margin_msg", - }, - { - name: "MsgRemoveMargin", - msg: &MsgRemoveMargin{}, - expectedRoute: "perp", - expectedType: "remove_margin_msg", - }, - { - name: "MsgMarketOrder", - msg: &MsgMarketOrder{}, - expectedRoute: "perp", - expectedType: "market_order_msg", - }, - { - name: "MsgClosePosition", - msg: &MsgClosePosition{}, - expectedRoute: "perp", - expectedType: "close_position_msg", - }, - { - name: "MsgPartialClose", - msg: &MsgPartialClose{}, - expectedRoute: "perp", - expectedType: "partial_close_msg", - }, - { - name: "MsgDonateToEcosystemFund", - msg: &MsgDonateToEcosystemFund{}, - expectedRoute: "perp", - expectedType: "donate_to_ef_msg", - }, - { - name: "MsgMultiLiquidate", - msg: &MsgMultiLiquidate{}, - expectedRoute: "perp", - expectedType: "multi_liquidate_msg", - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - require.Equal(t, tc.expectedRoute, tc.msg.Route()) - require.Equal(t, tc.expectedType, tc.msg.Type()) - }) - } -} - -type SignBytesGetter interface { - sdk.Msg - GetSignBytes() []byte -} - -func TestMsg_GetSignBytes(t *testing.T) { - testCases := []struct { - name string - msg SignBytesGetter - }{ - { - name: "MsgAddMargin", - msg: &MsgAddMargin{}, - }, - { - name: "MsgRemoveMargin", - msg: &MsgRemoveMargin{}, - }, - { - name: "MsgMarketOrder", - msg: &MsgMarketOrder{}, - }, - { - name: "MsgClosePosition", - msg: &MsgClosePosition{}, - }, - { - name: "MsgPartialClose", - msg: &MsgPartialClose{}, - }, - { - name: "MsgDonateToEcosystemFund", - msg: &MsgDonateToEcosystemFund{}, - }, - { - name: "MsgMultiLiquidate", - msg: &MsgMultiLiquidate{}, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - bytes := tc.msg.GetSignBytes() - require.NotNil(t, bytes) - require.NotEmpty(t, bytes) - - // The same message should always return the same bytes - require.Equal(t, bytes, tc.msg.GetSignBytes()) - }) - } -} diff --git a/x/perp/v2/types/position.go b/x/perp/v2/types/position.go deleted file mode 100644 index 141fe3f76..000000000 --- a/x/perp/v2/types/position.go +++ /dev/null @@ -1,156 +0,0 @@ -package types - -import ( - fmt "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func ZeroPosition(ctx sdk.Context, tokenPair asset.Pair, traderAddr sdk.AccAddress) Position { - return Position{ - TraderAddress: traderAddr.String(), - Pair: tokenPair, - Size_: sdk.ZeroDec(), - Margin: sdk.ZeroDec(), - OpenNotional: sdk.ZeroDec(), - LatestCumulativePremiumFraction: sdk.ZeroDec(), - LastUpdatedBlockNumber: ctx.BlockHeight(), - } -} - -func PositionsAreEqual(expected, actual *Position) error { - if expected.Pair != actual.Pair { - return fmt.Errorf("expected position pair %s, got %s", expected.Pair, actual.Pair) - } - - if expected.TraderAddress != actual.TraderAddress { - return fmt.Errorf("expected position trader address %s, got %s", expected.TraderAddress, actual.TraderAddress) - } - - if !expected.Margin.Equal(actual.Margin) { - return fmt.Errorf("expected position margin %s, got %s", expected.Margin, actual.Margin) - } - - if !expected.OpenNotional.Equal(actual.OpenNotional) { - return fmt.Errorf("expected position open notional %s, got %s", expected.OpenNotional, actual.OpenNotional) - } - - if !expected.Size_.Equal(actual.Size_) { - return fmt.Errorf("expected position size %s, got %s", expected.Size_, actual.Size_) - } - - if expected.LastUpdatedBlockNumber != actual.LastUpdatedBlockNumber { - return fmt.Errorf("expected position block number %d, got %d", expected.LastUpdatedBlockNumber, actual.LastUpdatedBlockNumber) - } - - if !expected.LatestCumulativePremiumFraction.Equal(actual.LatestCumulativePremiumFraction) { - return fmt.Errorf( - "expected position latest cumulative premium fraction %s, got %s", - expected.LatestCumulativePremiumFraction, - actual.LatestCumulativePremiumFraction, - ) - } - return nil -} - -type PositionResp struct { - Position Position - // The amount of quote assets exchanged. - ExchangedNotionalValue sdk.Dec - // The amount of base assets exchanged. Signed, positive represents long and negative represents short from the user's perspective. - ExchangedPositionSize sdk.Dec - // The amount of bad debt accrued during this position change. - // Measured in absolute value of quote units. - // If greater than zero, then the position change event will likely fail. - BadDebt sdk.Dec - // The funding payment applied on this position change. - FundingPayment sdk.Dec - // The amount of PnL realized on this position changed, measured in quote - // units. - RealizedPnl sdk.Dec - // The unrealized PnL in the position after the position change. - UnrealizedPnlAfter sdk.Dec - // The amount of margin the trader has to give to the vault. - // A negative value means the vault pays the trader. - MarginToVault sdk.Dec - // The position's notional value after the position change, measured in quote - // units. - PositionNotional sdk.Dec -} - -func (m *Position) Validate() error { - if _, err := sdk.AccAddressFromBech32(m.TraderAddress); err != nil { - return err - } - - if err := m.Pair.Validate(); err != nil { - return err - } - - if m.Size_.IsZero() { - return fmt.Errorf("zero size") - } - - if m.Margin.IsNegative() || m.Margin.IsZero() { - return fmt.Errorf("margin <= 0") - } - - if m.OpenNotional.IsNegative() || m.OpenNotional.IsZero() { - return fmt.Errorf("open notional <= 0") - } - - if m.LastUpdatedBlockNumber < 0 { - return fmt.Errorf("invalid block number") - } - - return nil -} - -func (position *Position) WithTraderAddress(value string) *Position { - position.TraderAddress = value - return position -} - -func (position *Position) WithPair(value asset.Pair) *Position { - position.Pair = value - return position -} - -func (position *Position) WithSize_(value sdk.Dec) *Position { - position.Size_ = value - return position -} - -func (position *Position) WithMargin(value sdk.Dec) *Position { - position.Margin = value - return position -} - -func (position *Position) WithOpenNotional(value sdk.Dec) *Position { - position.OpenNotional = value - return position -} - -func (position *Position) WithLatestCumulativePremiumFraction(value sdk.Dec) *Position { - position.LatestCumulativePremiumFraction = value - return position -} - -func (position *Position) WithLastUpdatedBlockNumber(value int64) *Position { - position.LastUpdatedBlockNumber = value - return position -} - -func (p *Position) copy() *Position { - return &Position{ - TraderAddress: p.TraderAddress, - Pair: p.Pair, - Size_: p.Size_, - Margin: p.Margin, - OpenNotional: p.OpenNotional, - LatestCumulativePremiumFraction: p.LatestCumulativePremiumFraction, - LastUpdatedBlockNumber: p.LastUpdatedBlockNumber, - } -} diff --git a/x/perp/v2/types/position_test.go b/x/perp/v2/types/position_test.go deleted file mode 100644 index 98c67ac4f..000000000 --- a/x/perp/v2/types/position_test.go +++ /dev/null @@ -1,143 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func TestZeroPosition(t *testing.T) { - // Initialization - ctx := sdk.Context{} - tokenPair := asset.NewPair("ubtc", "unusd") - traderAddr := sdk.AccAddress{} - - position := ZeroPosition(ctx, tokenPair, traderAddr) - - // Test the conditions - require.NotNil(t, position) - // Continue testing individual attributes of position as required -} - -func TestPositionsAreEqual(t *testing.T) { - accAddress := "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v" - accOtherAddress := "cosmos1g7vzqfthhf4l4vs6skyjj27vqhe97m5gp33hxy" - - expected := Position{ - TraderAddress: accAddress, - Pair: "ubtc:unusd", - Size_: sdk.OneDec(), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.OneDec(), - LastUpdatedBlockNumber: 0, - } - - err := PositionsAreEqual(&expected, expected.copy()) - require.NoError(t, err) - - testCases := []struct { - modifier func(*Position) - requiredError string - }{ - { - modifier: func(p *Position) { p.WithPair(asset.NewPair("ueth", "unusd")) }, - requiredError: "expected position pair", - }, - { - modifier: func(p *Position) { p.WithTraderAddress(accOtherAddress) }, - requiredError: "expected position trader address", - }, - { - modifier: func(p *Position) { p.WithMargin(sdk.NewDec(42)) }, - requiredError: "expected position margin", - }, - { - modifier: func(p *Position) { p.WithOpenNotional(sdk.NewDec(42)) }, - requiredError: "expected position open notional", - }, - { - modifier: func(p *Position) { p.WithSize_(sdk.NewDec(42)) }, - requiredError: "expected position size", - }, - { - modifier: func(p *Position) { p.WithLastUpdatedBlockNumber(42) }, - requiredError: "expected position block number", - }, - { - modifier: func(p *Position) { p.WithLatestCumulativePremiumFraction(sdk.NewDec(42)) }, - requiredError: "expected position latest cumulative premium fraction", - }, - } - for _, tc := range testCases { - tc := tc - t.Run(tc.requiredError, func(t *testing.T) { - newPosition := expected.copy() - - tc.modifier(newPosition) - - err := PositionsAreEqual(&expected, newPosition) - require.Error(t, err) - require.Contains(t, err.Error(), tc.requiredError) - }) - } -} - -func TestPositionValidate(t *testing.T) { - accAddress := "cosmos1zaavvzxez0elundtn32qnk9lkm8kmcszzsv80v" - - validPosition := Position{ - TraderAddress: accAddress, - Pair: "ubtc:unusd", - Size_: sdk.OneDec(), - Margin: sdk.OneDec(), - OpenNotional: sdk.OneDec(), - LatestCumulativePremiumFraction: sdk.OneDec(), - LastUpdatedBlockNumber: 0, - } - - testCases := []struct { - modifier func(*Position) - requiredError string - }{ - { - modifier: func(p *Position) { p.WithTraderAddress("invalid") }, - requiredError: "decoding bech32 failed", - }, - { - modifier: func(p *Position) { p.WithPair("invalid") }, - requiredError: "invalid: invalid token pair", - }, - { - modifier: func(p *Position) { p.WithSize_(sdk.ZeroDec()) }, - requiredError: "zero size", - }, - { - modifier: func(p *Position) { p.WithMargin(sdk.ZeroDec()) }, - requiredError: "margin <= 0", - }, - { - modifier: func(p *Position) { p.WithOpenNotional(sdk.ZeroDec()) }, - requiredError: "open notional <= 0", - }, - { - modifier: func(p *Position) { p.WithLastUpdatedBlockNumber(-1) }, - requiredError: "invalid block number", - }, - } - for _, tc := range testCases { - tc := tc - t.Run(tc.requiredError, func(t *testing.T) { - newPosition := validPosition.copy() - - tc.modifier(newPosition) - - err := newPosition.Validate() - require.Error(t, err) - require.Contains(t, err.Error(), tc.requiredError) - }) - } -} diff --git a/x/perp/v2/types/query.pb.go b/x/perp/v2/types/query.pb.go deleted file mode 100644 index b66a0e70f..000000000 --- a/x/perp/v2/types/query.pb.go +++ /dev/null @@ -1,2890 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/perp/v2/query.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type QueryPositionsRequest struct { - Trader string `protobuf:"bytes,1,opt,name=trader,proto3" json:"trader,omitempty"` -} - -func (m *QueryPositionsRequest) Reset() { *m = QueryPositionsRequest{} } -func (m *QueryPositionsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPositionsRequest) ProtoMessage() {} -func (*QueryPositionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{0} -} -func (m *QueryPositionsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionsRequest.Merge(m, src) -} -func (m *QueryPositionsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionsRequest proto.InternalMessageInfo - -func (m *QueryPositionsRequest) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -type QueryPositionsResponse struct { - Positions []QueryPositionResponse `protobuf:"bytes,1,rep,name=positions,proto3" json:"positions"` -} - -func (m *QueryPositionsResponse) Reset() { *m = QueryPositionsResponse{} } -func (m *QueryPositionsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPositionsResponse) ProtoMessage() {} -func (*QueryPositionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{1} -} -func (m *QueryPositionsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionsResponse.Merge(m, src) -} -func (m *QueryPositionsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionsResponse proto.InternalMessageInfo - -func (m *QueryPositionsResponse) GetPositions() []QueryPositionResponse { - if m != nil { - return m.Positions - } - return nil -} - -type QueryPositionStoreRequest struct { - // pagination defines a paginated request - Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryPositionStoreRequest) Reset() { *m = QueryPositionStoreRequest{} } -func (m *QueryPositionStoreRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPositionStoreRequest) ProtoMessage() {} -func (*QueryPositionStoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{2} -} -func (m *QueryPositionStoreRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionStoreRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionStoreRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionStoreRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionStoreRequest.Merge(m, src) -} -func (m *QueryPositionStoreRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionStoreRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionStoreRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionStoreRequest proto.InternalMessageInfo - -func (m *QueryPositionStoreRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -type QueryPositionStoreResponse struct { - // Position responses: collection of all stored positions (with pagination) - Positions []Position `protobuf:"bytes,1,rep,name=positions,proto3" json:"positions"` - // pagination defines a paginated response - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryPositionStoreResponse) Reset() { *m = QueryPositionStoreResponse{} } -func (m *QueryPositionStoreResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPositionStoreResponse) ProtoMessage() {} -func (*QueryPositionStoreResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{3} -} -func (m *QueryPositionStoreResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionStoreResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionStoreResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionStoreResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionStoreResponse.Merge(m, src) -} -func (m *QueryPositionStoreResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionStoreResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionStoreResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionStoreResponse proto.InternalMessageInfo - -func (m *QueryPositionStoreResponse) GetPositions() []Position { - if m != nil { - return m.Positions - } - return nil -} - -func (m *QueryPositionStoreResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -// QueryPositionRequest is the request type for the position of the x/perp -// module account. -type QueryPositionRequest struct { - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Trader string `protobuf:"bytes,2,opt,name=trader,proto3" json:"trader,omitempty"` -} - -func (m *QueryPositionRequest) Reset() { *m = QueryPositionRequest{} } -func (m *QueryPositionRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPositionRequest) ProtoMessage() {} -func (*QueryPositionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{4} -} -func (m *QueryPositionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionRequest.Merge(m, src) -} -func (m *QueryPositionRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionRequest proto.InternalMessageInfo - -func (m *QueryPositionRequest) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -type QueryPositionResponse struct { - // The position as it exists in the blockchain state - Position Position `protobuf:"bytes,1,opt,name=position,proto3" json:"position"` - // The position's current notional value, if it were to be entirely closed (in - // margin units). - PositionNotional github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=position_notional,json=positionNotional,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"position_notional"` - // The position's unrealized PnL. - UnrealizedPnl github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=unrealized_pnl,json=unrealizedPnl,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"unrealized_pnl"` - // margin ratio of the position based on the spot price - MarginRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=margin_ratio,json=marginRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"margin_ratio"` -} - -func (m *QueryPositionResponse) Reset() { *m = QueryPositionResponse{} } -func (m *QueryPositionResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPositionResponse) ProtoMessage() {} -func (*QueryPositionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{5} -} -func (m *QueryPositionResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPositionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPositionResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPositionResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPositionResponse.Merge(m, src) -} -func (m *QueryPositionResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPositionResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPositionResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPositionResponse proto.InternalMessageInfo - -func (m *QueryPositionResponse) GetPosition() Position { - if m != nil { - return m.Position - } - return Position{} -} - -type QueryModuleAccountsRequest struct { -} - -func (m *QueryModuleAccountsRequest) Reset() { *m = QueryModuleAccountsRequest{} } -func (m *QueryModuleAccountsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryModuleAccountsRequest) ProtoMessage() {} -func (*QueryModuleAccountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{6} -} -func (m *QueryModuleAccountsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryModuleAccountsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryModuleAccountsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryModuleAccountsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryModuleAccountsRequest.Merge(m, src) -} -func (m *QueryModuleAccountsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryModuleAccountsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryModuleAccountsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryModuleAccountsRequest proto.InternalMessageInfo - -type QueryModuleAccountsResponse struct { - Accounts []AccountWithBalance `protobuf:"bytes,1,rep,name=accounts,proto3" json:"accounts"` -} - -func (m *QueryModuleAccountsResponse) Reset() { *m = QueryModuleAccountsResponse{} } -func (m *QueryModuleAccountsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryModuleAccountsResponse) ProtoMessage() {} -func (*QueryModuleAccountsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{7} -} -func (m *QueryModuleAccountsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryModuleAccountsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryModuleAccountsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryModuleAccountsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryModuleAccountsResponse.Merge(m, src) -} -func (m *QueryModuleAccountsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryModuleAccountsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryModuleAccountsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryModuleAccountsResponse proto.InternalMessageInfo - -func (m *QueryModuleAccountsResponse) GetAccounts() []AccountWithBalance { - if m != nil { - return m.Accounts - } - return nil -} - -type AccountWithBalance struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` - Balance github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=balance,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"balance"` -} - -func (m *AccountWithBalance) Reset() { *m = AccountWithBalance{} } -func (m *AccountWithBalance) String() string { return proto.CompactTextString(m) } -func (*AccountWithBalance) ProtoMessage() {} -func (*AccountWithBalance) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{8} -} -func (m *AccountWithBalance) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AccountWithBalance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AccountWithBalance.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AccountWithBalance) XXX_Merge(src proto.Message) { - xxx_messageInfo_AccountWithBalance.Merge(m, src) -} -func (m *AccountWithBalance) XXX_Size() int { - return m.Size() -} -func (m *AccountWithBalance) XXX_DiscardUnknown() { - xxx_messageInfo_AccountWithBalance.DiscardUnknown(m) -} - -var xxx_messageInfo_AccountWithBalance proto.InternalMessageInfo - -func (m *AccountWithBalance) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *AccountWithBalance) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *AccountWithBalance) GetBalance() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.Balance - } - return nil -} - -type AmmMarket struct { - Market Market `protobuf:"bytes,1,opt,name=market,proto3" json:"market"` - Amm AMM `protobuf:"bytes,2,opt,name=amm,proto3" json:"amm"` -} - -func (m *AmmMarket) Reset() { *m = AmmMarket{} } -func (m *AmmMarket) String() string { return proto.CompactTextString(m) } -func (*AmmMarket) ProtoMessage() {} -func (*AmmMarket) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{9} -} -func (m *AmmMarket) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AmmMarket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AmmMarket.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AmmMarket) XXX_Merge(src proto.Message) { - xxx_messageInfo_AmmMarket.Merge(m, src) -} -func (m *AmmMarket) XXX_Size() int { - return m.Size() -} -func (m *AmmMarket) XXX_DiscardUnknown() { - xxx_messageInfo_AmmMarket.DiscardUnknown(m) -} - -var xxx_messageInfo_AmmMarket proto.InternalMessageInfo - -func (m *AmmMarket) GetMarket() Market { - if m != nil { - return m.Market - } - return Market{} -} - -func (m *AmmMarket) GetAmm() AMM { - if m != nil { - return m.Amm - } - return AMM{} -} - -type QueryMarketsRequest struct { - Versioned bool `protobuf:"varint,1,opt,name=versioned,proto3" json:"versioned,omitempty"` -} - -func (m *QueryMarketsRequest) Reset() { *m = QueryMarketsRequest{} } -func (m *QueryMarketsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryMarketsRequest) ProtoMessage() {} -func (*QueryMarketsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{10} -} -func (m *QueryMarketsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryMarketsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryMarketsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryMarketsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryMarketsRequest.Merge(m, src) -} -func (m *QueryMarketsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryMarketsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryMarketsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryMarketsRequest proto.InternalMessageInfo - -func (m *QueryMarketsRequest) GetVersioned() bool { - if m != nil { - return m.Versioned - } - return false -} - -type QueryMarketsResponse struct { - AmmMarkets []AmmMarket `protobuf:"bytes,1,rep,name=amm_markets,json=ammMarkets,proto3" json:"amm_markets"` -} - -func (m *QueryMarketsResponse) Reset() { *m = QueryMarketsResponse{} } -func (m *QueryMarketsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryMarketsResponse) ProtoMessage() {} -func (*QueryMarketsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_fc8f0be94fac333f, []int{11} -} -func (m *QueryMarketsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryMarketsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryMarketsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryMarketsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryMarketsResponse.Merge(m, src) -} -func (m *QueryMarketsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryMarketsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryMarketsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryMarketsResponse proto.InternalMessageInfo - -func (m *QueryMarketsResponse) GetAmmMarkets() []AmmMarket { - if m != nil { - return m.AmmMarkets - } - return nil -} - -func init() { - proto.RegisterType((*QueryPositionsRequest)(nil), "nibiru.perp.v2.QueryPositionsRequest") - proto.RegisterType((*QueryPositionsResponse)(nil), "nibiru.perp.v2.QueryPositionsResponse") - proto.RegisterType((*QueryPositionStoreRequest)(nil), "nibiru.perp.v2.QueryPositionStoreRequest") - proto.RegisterType((*QueryPositionStoreResponse)(nil), "nibiru.perp.v2.QueryPositionStoreResponse") - proto.RegisterType((*QueryPositionRequest)(nil), "nibiru.perp.v2.QueryPositionRequest") - proto.RegisterType((*QueryPositionResponse)(nil), "nibiru.perp.v2.QueryPositionResponse") - proto.RegisterType((*QueryModuleAccountsRequest)(nil), "nibiru.perp.v2.QueryModuleAccountsRequest") - proto.RegisterType((*QueryModuleAccountsResponse)(nil), "nibiru.perp.v2.QueryModuleAccountsResponse") - proto.RegisterType((*AccountWithBalance)(nil), "nibiru.perp.v2.AccountWithBalance") - proto.RegisterType((*AmmMarket)(nil), "nibiru.perp.v2.AmmMarket") - proto.RegisterType((*QueryMarketsRequest)(nil), "nibiru.perp.v2.QueryMarketsRequest") - proto.RegisterType((*QueryMarketsResponse)(nil), "nibiru.perp.v2.QueryMarketsResponse") -} - -func init() { proto.RegisterFile("nibiru/perp/v2/query.proto", fileDescriptor_fc8f0be94fac333f) } - -var fileDescriptor_fc8f0be94fac333f = []byte{ - // 904 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0x4f, 0x8f, 0xdb, 0x44, - 0x14, 0x5f, 0xef, 0x6e, 0xb7, 0xbb, 0x6f, 0xdb, 0x15, 0x4c, 0xcb, 0xe2, 0xb8, 0x2b, 0x27, 0x35, - 0x25, 0x5d, 0x5a, 0xd5, 0xc3, 0xa6, 0x5c, 0x40, 0x1c, 0x68, 0x5a, 0x51, 0x71, 0x48, 0x95, 0x1a, - 0x21, 0x10, 0x1c, 0xa2, 0x89, 0x33, 0xf2, 0x8e, 0x1a, 0xcf, 0xb8, 0x1e, 0x27, 0xa2, 0x95, 0xe0, - 0xd0, 0x4f, 0x80, 0xe8, 0x47, 0xe0, 0x04, 0x57, 0xbe, 0x44, 0x8f, 0x95, 0xb8, 0xa0, 0x1e, 0x0a, - 0xda, 0xe5, 0x83, 0x20, 0x8f, 0x67, 0x92, 0xd8, 0x49, 0x37, 0x51, 0x4f, 0xb1, 0xfd, 0x7e, 0xef, - 0xbd, 0xdf, 0xef, 0xfd, 0x99, 0x09, 0x38, 0x9c, 0xf5, 0x59, 0x3a, 0xc2, 0x09, 0x4d, 0x13, 0x3c, - 0x6e, 0xe1, 0xc7, 0x23, 0x9a, 0x3e, 0xf1, 0x93, 0x54, 0x64, 0x02, 0xed, 0x15, 0x36, 0x3f, 0xb7, - 0xf9, 0xe3, 0x96, 0x73, 0x39, 0x12, 0x91, 0x50, 0x26, 0x9c, 0x3f, 0x15, 0x28, 0xe7, 0x20, 0x12, - 0x22, 0x1a, 0x52, 0x4c, 0x12, 0x86, 0x09, 0xe7, 0x22, 0x23, 0x19, 0x13, 0x5c, 0x6a, 0x6b, 0x35, - 0xbe, 0xcc, 0x48, 0x46, 0xb5, 0xcd, 0x0d, 0x85, 0x8c, 0x85, 0xc4, 0x7d, 0x22, 0x29, 0x1e, 0x1f, - 0xf5, 0x69, 0x46, 0x8e, 0x70, 0x28, 0x18, 0xd7, 0xf6, 0x1b, 0xb3, 0x76, 0x45, 0x6c, 0x82, 0x4a, - 0x48, 0xc4, 0xb8, 0x4a, 0x54, 0x60, 0x3d, 0x0c, 0xef, 0x3d, 0xcc, 0x11, 0x5d, 0x21, 0x99, 0xca, - 0x1f, 0xd0, 0xc7, 0x23, 0x2a, 0x33, 0xb4, 0x0f, 0x5b, 0x59, 0x4a, 0x06, 0x34, 0xb5, 0xad, 0x86, - 0x75, 0xb8, 0x13, 0xe8, 0x37, 0x2f, 0x84, 0xfd, 0xaa, 0x83, 0x4c, 0x04, 0x97, 0x14, 0x7d, 0x05, - 0x3b, 0x89, 0xf9, 0x68, 0x5b, 0x8d, 0x8d, 0xc3, 0xdd, 0xd6, 0x87, 0x7e, 0xb9, 0x14, 0x7e, 0xc9, - 0xd5, 0x78, 0xb6, 0x37, 0x5f, 0xbc, 0xae, 0xaf, 0x05, 0x53, 0x6f, 0x2f, 0x84, 0x5a, 0x09, 0xf9, - 0x75, 0x26, 0x52, 0x6a, 0x98, 0x7d, 0x09, 0x30, 0x95, 0xa1, 0xd8, 0xed, 0xb6, 0x9a, 0x7e, 0xa1, - 0xd9, 0xcf, 0x35, 0xfb, 0x45, 0x33, 0xb4, 0x66, 0xbf, 0x4b, 0x22, 0xe3, 0x1b, 0xcc, 0x78, 0x7a, - 0xbf, 0x59, 0xe0, 0x2c, 0xca, 0xa2, 0xe5, 0x7c, 0x3e, 0x2f, 0xc7, 0xae, 0xca, 0x31, 0x9e, 0x73, - 0x0a, 0xd0, 0xfd, 0x12, 0xc9, 0x75, 0x45, 0xf2, 0xfa, 0x52, 0x92, 0x45, 0xea, 0x12, 0xcb, 0x9f, - 0xe0, 0x72, 0xa5, 0x68, 0x45, 0x15, 0x3a, 0xb0, 0x99, 0x10, 0xa6, 0xbb, 0xd3, 0xfe, 0x34, 0xcf, - 0xff, 0xea, 0x75, 0xfd, 0x28, 0x62, 0xd9, 0xf1, 0xa8, 0xef, 0x87, 0x22, 0xc6, 0x0f, 0x14, 0xd7, - 0xbb, 0xc7, 0x84, 0x71, 0xac, 0xa7, 0xe9, 0x47, 0x1c, 0x8a, 0x38, 0x16, 0x1c, 0x13, 0x29, 0x69, - 0xe6, 0x77, 0x09, 0x4b, 0x03, 0x15, 0x66, 0xa6, 0xdd, 0xeb, 0xa5, 0x76, 0xbf, 0x5a, 0xaf, 0x0c, - 0xc8, 0xa4, 0x3e, 0x9f, 0xc1, 0xb6, 0x91, 0xab, 0x9b, 0xb0, 0xac, 0x3c, 0x13, 0x3c, 0xfa, 0x01, - 0xde, 0x35, 0xcf, 0x3d, 0x2e, 0xf2, 0x1f, 0x32, 0x2c, 0x12, 0xb7, 0x7d, 0xad, 0xa4, 0x39, 0xa3, - 0x44, 0xcf, 0x73, 0xf1, 0x73, 0x4b, 0x0e, 0x1e, 0xe1, 0xec, 0x49, 0x42, 0xa5, 0x7f, 0x8f, 0x86, - 0xc1, 0x3b, 0x26, 0xd0, 0x03, 0x1d, 0x07, 0x7d, 0x03, 0x7b, 0x23, 0x9e, 0x52, 0x32, 0x64, 0x4f, - 0xe9, 0xa0, 0x97, 0xf0, 0xa1, 0xbd, 0xf1, 0x56, 0x91, 0x2f, 0x4e, 0xa3, 0x74, 0xf9, 0x10, 0x3d, - 0x84, 0x0b, 0x31, 0x49, 0x23, 0xc6, 0x7b, 0x69, 0xde, 0x19, 0x7b, 0xf3, 0xad, 0x82, 0xee, 0x16, - 0x31, 0x82, 0x3c, 0x84, 0x77, 0xa0, 0x07, 0xb0, 0x23, 0x06, 0xa3, 0x21, 0xbd, 0x13, 0x86, 0x62, - 0xc4, 0x33, 0xb3, 0x81, 0x5e, 0x08, 0x57, 0x16, 0x5a, 0x75, 0xfd, 0xef, 0xc1, 0x36, 0xd1, 0xdf, - 0xf4, 0x78, 0x7a, 0xd5, 0xfa, 0x6b, 0x9f, 0x6f, 0x59, 0x76, 0xdc, 0x26, 0x43, 0xc2, 0x43, 0xb3, - 0x6a, 0x13, 0x4f, 0xef, 0x77, 0x0b, 0xd0, 0x3c, 0x0c, 0x21, 0xd8, 0xe4, 0x24, 0xa6, 0x7a, 0xf7, - 0xd5, 0x33, 0xb2, 0xe1, 0x3c, 0x19, 0x0c, 0x52, 0x2a, 0xa5, 0x9e, 0x11, 0xf3, 0x8a, 0x28, 0x9c, - 0xef, 0x17, 0x8e, 0xf6, 0x86, 0x62, 0x52, 0x2b, 0x4d, 0xba, 0x99, 0xf1, 0xbb, 0x82, 0xf1, 0xf6, - 0xc7, 0x39, 0x81, 0x3f, 0xfe, 0xa9, 0x1f, 0xae, 0x50, 0xb0, 0xdc, 0x41, 0x06, 0x26, 0xb6, 0xc7, - 0x61, 0xe7, 0x4e, 0x1c, 0x77, 0x48, 0xfa, 0x88, 0x66, 0xe8, 0x13, 0xd8, 0x8a, 0xd5, 0x93, 0x1e, - 0xbe, 0xfd, 0xaa, 0xf8, 0x02, 0xa7, 0x05, 0x6b, 0x2c, 0xba, 0x09, 0x1b, 0x24, 0x8e, 0xf5, 0x3e, - 0x5e, 0x9a, 0xab, 0x57, 0xa7, 0xa3, 0xf1, 0x39, 0xca, 0xbb, 0x0d, 0x97, 0x8a, 0x06, 0x28, 0xdf, - 0xc9, 0xc9, 0x78, 0x00, 0x3b, 0x63, 0x9a, 0x4a, 0x26, 0x38, 0x1d, 0xa8, 0xe4, 0xdb, 0xc1, 0xf4, - 0x83, 0xf7, 0x9d, 0xde, 0xd7, 0x89, 0x93, 0x6e, 0xd7, 0x17, 0xb0, 0x4b, 0xe2, 0xb8, 0x57, 0xf0, - 0x30, 0x1d, 0xab, 0xcd, 0x31, 0x30, 0xfa, 0x34, 0x0f, 0x20, 0xe6, 0x83, 0x6c, 0xfd, 0x79, 0x0e, - 0xce, 0xa9, 0xd0, 0xe8, 0x67, 0xb8, 0x58, 0xda, 0x49, 0x74, 0x6d, 0xc9, 0x39, 0xab, 0x88, 0x3b, - 0xab, 0x9d, 0xc6, 0x5e, 0xe3, 0xd9, 0x5f, 0xff, 0x3d, 0x5f, 0x77, 0x90, 0x8d, 0x2b, 0x77, 0xd0, - 0x64, 0x7d, 0x9f, 0x59, 0xb0, 0x57, 0xbe, 0x04, 0xd0, 0xd9, 0xb1, 0x4d, 0xed, 0x9c, 0xe6, 0x32, - 0x98, 0xe6, 0x70, 0x55, 0x71, 0xb8, 0x82, 0x6a, 0x6f, 0xe2, 0x20, 0xd1, 0x73, 0x0b, 0xd0, 0xfc, - 0xf1, 0x8d, 0x3e, 0x3a, 0x33, 0xc3, 0xec, 0x45, 0xe2, 0xdc, 0x58, 0x05, 0xaa, 0x09, 0x35, 0x15, - 0xa1, 0x06, 0x72, 0xdf, 0x44, 0xa8, 0x27, 0x55, 0xfa, 0x5f, 0x2d, 0xd8, 0x2b, 0x2f, 0x2c, 0x5a, - 0x9c, 0x66, 0xe1, 0xce, 0x3b, 0x37, 0x57, 0xc2, 0x6a, 0x4e, 0xd7, 0x15, 0xa7, 0xab, 0xa8, 0x5e, - 0xe5, 0x14, 0x2b, 0x7c, 0xcf, 0x2c, 0x39, 0x7a, 0x0a, 0x17, 0x66, 0x67, 0x12, 0x7d, 0xb0, 0x38, - 0x4b, 0x69, 0xcc, 0x9d, 0x6b, 0x67, 0x83, 0x34, 0x87, 0xba, 0xe2, 0x50, 0x43, 0xef, 0xcf, 0x71, - 0x28, 0x80, 0xed, 0xfb, 0x2f, 0x4e, 0x5c, 0xeb, 0xe5, 0x89, 0x6b, 0xfd, 0x7b, 0xe2, 0x5a, 0xbf, - 0x9c, 0xba, 0x6b, 0x2f, 0x4f, 0xdd, 0xb5, 0xbf, 0x4f, 0xdd, 0xb5, 0xef, 0x6f, 0x2d, 0xbb, 0xab, - 0x4c, 0x28, 0x75, 0x18, 0xf4, 0xb7, 0xd4, 0x1f, 0x96, 0xdb, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, - 0xbb, 0xf9, 0xd2, 0xa6, 0x7a, 0x09, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - QueryPosition(ctx context.Context, in *QueryPositionRequest, opts ...grpc.CallOption) (*QueryPositionResponse, error) - QueryPositions(ctx context.Context, in *QueryPositionsRequest, opts ...grpc.CallOption) (*QueryPositionsResponse, error) - // QueryPositionStore queries all of the positions in the KV store. - QueryPositionStore(ctx context.Context, in *QueryPositionStoreRequest, opts ...grpc.CallOption) (*QueryPositionStoreResponse, error) - // Queries the reserve assets in a given pool, identified by a token pair. - ModuleAccounts(ctx context.Context, in *QueryModuleAccountsRequest, opts ...grpc.CallOption) (*QueryModuleAccountsResponse, error) - QueryMarkets(ctx context.Context, in *QueryMarketsRequest, opts ...grpc.CallOption) (*QueryMarketsResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) QueryPosition(ctx context.Context, in *QueryPositionRequest, opts ...grpc.CallOption) (*QueryPositionResponse, error) { - out := new(QueryPositionResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Query/QueryPosition", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) QueryPositions(ctx context.Context, in *QueryPositionsRequest, opts ...grpc.CallOption) (*QueryPositionsResponse, error) { - out := new(QueryPositionsResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Query/QueryPositions", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) QueryPositionStore(ctx context.Context, in *QueryPositionStoreRequest, opts ...grpc.CallOption) (*QueryPositionStoreResponse, error) { - out := new(QueryPositionStoreResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Query/QueryPositionStore", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) ModuleAccounts(ctx context.Context, in *QueryModuleAccountsRequest, opts ...grpc.CallOption) (*QueryModuleAccountsResponse, error) { - out := new(QueryModuleAccountsResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Query/ModuleAccounts", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) QueryMarkets(ctx context.Context, in *QueryMarketsRequest, opts ...grpc.CallOption) (*QueryMarketsResponse, error) { - out := new(QueryMarketsResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Query/QueryMarkets", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - QueryPosition(context.Context, *QueryPositionRequest) (*QueryPositionResponse, error) - QueryPositions(context.Context, *QueryPositionsRequest) (*QueryPositionsResponse, error) - // QueryPositionStore queries all of the positions in the KV store. - QueryPositionStore(context.Context, *QueryPositionStoreRequest) (*QueryPositionStoreResponse, error) - // Queries the reserve assets in a given pool, identified by a token pair. - ModuleAccounts(context.Context, *QueryModuleAccountsRequest) (*QueryModuleAccountsResponse, error) - QueryMarkets(context.Context, *QueryMarketsRequest) (*QueryMarketsResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) QueryPosition(ctx context.Context, req *QueryPositionRequest) (*QueryPositionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryPosition not implemented") -} -func (*UnimplementedQueryServer) QueryPositions(ctx context.Context, req *QueryPositionsRequest) (*QueryPositionsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryPositions not implemented") -} -func (*UnimplementedQueryServer) QueryPositionStore(ctx context.Context, req *QueryPositionStoreRequest) (*QueryPositionStoreResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryPositionStore not implemented") -} -func (*UnimplementedQueryServer) ModuleAccounts(ctx context.Context, req *QueryModuleAccountsRequest) (*QueryModuleAccountsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModuleAccounts not implemented") -} -func (*UnimplementedQueryServer) QueryMarkets(ctx context.Context, req *QueryMarketsRequest) (*QueryMarketsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method QueryMarkets not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_QueryPosition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPositionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).QueryPosition(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Query/QueryPosition", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).QueryPosition(ctx, req.(*QueryPositionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_QueryPositions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPositionsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).QueryPositions(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Query/QueryPositions", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).QueryPositions(ctx, req.(*QueryPositionsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_QueryPositionStore_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPositionStoreRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).QueryPositionStore(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Query/QueryPositionStore", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).QueryPositionStore(ctx, req.(*QueryPositionStoreRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_ModuleAccounts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryModuleAccountsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ModuleAccounts(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Query/ModuleAccounts", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ModuleAccounts(ctx, req.(*QueryModuleAccountsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_QueryMarkets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryMarketsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).QueryMarkets(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Query/QueryMarkets", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).QueryMarkets(ctx, req.(*QueryMarketsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.perp.v2.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "QueryPosition", - Handler: _Query_QueryPosition_Handler, - }, - { - MethodName: "QueryPositions", - Handler: _Query_QueryPositions_Handler, - }, - { - MethodName: "QueryPositionStore", - Handler: _Query_QueryPositionStore_Handler, - }, - { - MethodName: "ModuleAccounts", - Handler: _Query_ModuleAccounts_Handler, - }, - { - MethodName: "QueryMarkets", - Handler: _Query_QueryMarkets_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/perp/v2/query.proto", -} - -func (m *QueryPositionsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryPositionsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Positions) > 0 { - for iNdEx := len(m.Positions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Positions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryPositionStoreRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionStoreRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionStoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryPositionStoreResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionStoreResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionStoreResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Positions) > 0 { - for iNdEx := len(m.Positions) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Positions[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryPositionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0x12 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryPositionResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPositionResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPositionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MarginRatio.Size() - i -= size - if _, err := m.MarginRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.UnrealizedPnl.Size() - i -= size - if _, err := m.UnrealizedPnl.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.PositionNotional.Size() - i -= size - if _, err := m.PositionNotional.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Position.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryModuleAccountsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryModuleAccountsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryModuleAccountsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryModuleAccountsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryModuleAccountsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryModuleAccountsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Accounts) > 0 { - for iNdEx := len(m.Accounts) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Accounts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *AccountWithBalance) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AccountWithBalance) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AccountWithBalance) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Balance) > 0 { - for iNdEx := len(m.Balance) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Balance[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintQuery(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AmmMarket) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AmmMarket) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AmmMarket) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Amm.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Market.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryMarketsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryMarketsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryMarketsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Versioned { - i-- - if m.Versioned { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryMarketsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryMarketsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryMarketsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.AmmMarkets) > 0 { - for iNdEx := len(m.AmmMarkets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.AmmMarkets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryPositionsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPositionsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Positions) > 0 { - for _, e := range m.Positions { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryPositionStoreRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPositionStoreResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Positions) > 0 { - for _, e := range m.Positions { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPositionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovQuery(uint64(l)) - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPositionResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Position.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.PositionNotional.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.UnrealizedPnl.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.MarginRatio.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryModuleAccountsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryModuleAccountsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Accounts) > 0 { - for _, e := range m.Accounts { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *AccountWithBalance) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - l = len(m.Address) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - if len(m.Balance) > 0 { - for _, e := range m.Balance { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *AmmMarket) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Market.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.Amm.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryMarketsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Versioned { - n += 2 - } - return n -} - -func (m *QueryMarketsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.AmmMarkets) > 0 { - for _, e := range m.AmmMarkets { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryPositionsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPositionsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Positions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Positions = append(m.Positions, QueryPositionResponse{}) - if err := m.Positions[len(m.Positions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPositionStoreRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionStoreRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionStoreRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPositionStoreResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionStoreResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionStoreResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Positions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Positions = append(m.Positions, Position{}) - if err := m.Positions[len(m.Positions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPositionRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPositionResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPositionResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPositionResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Position", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Position.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PositionNotional", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PositionNotional.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnrealizedPnl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UnrealizedPnl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryModuleAccountsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryModuleAccountsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryModuleAccountsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryModuleAccountsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryModuleAccountsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryModuleAccountsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Accounts", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Accounts = append(m.Accounts, AccountWithBalance{}) - if err := m.Accounts[len(m.Accounts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AccountWithBalance) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AccountWithBalance: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AccountWithBalance: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Balance = append(m.Balance, types.Coin{}) - if err := m.Balance[len(m.Balance)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AmmMarket) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AmmMarket: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AmmMarket: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Market", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Market.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amm", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amm.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryMarketsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryMarketsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryMarketsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Versioned", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Versioned = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryMarketsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryMarketsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryMarketsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AmmMarkets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AmmMarkets = append(m.AmmMarkets, AmmMarket{}) - if err := m.AmmMarkets[len(m.AmmMarkets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/perp/v2/types/query.pb.gw.go b/x/perp/v2/types/query.pb.gw.go deleted file mode 100644 index d7f2bee0d..000000000 --- a/x/perp/v2/types/query.pb.gw.go +++ /dev/null @@ -1,485 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/perp/v2/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -var ( - filter_Query_QueryPosition_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_QueryPosition_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPosition_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.QueryPosition(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_QueryPosition_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPosition_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.QueryPosition(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_QueryPositions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_QueryPositions_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPositions_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.QueryPositions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_QueryPositions_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPositions_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.QueryPositions(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_QueryPositionStore_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_QueryPositionStore_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionStoreRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPositionStore_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.QueryPositionStore(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_QueryPositionStore_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPositionStoreRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryPositionStore_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.QueryPositionStore(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_ModuleAccounts_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryModuleAccountsRequest - var metadata runtime.ServerMetadata - - msg, err := client.ModuleAccounts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ModuleAccounts_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryModuleAccountsRequest - var metadata runtime.ServerMetadata - - msg, err := server.ModuleAccounts(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_QueryMarkets_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_QueryMarkets_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryMarketsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryMarkets_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.QueryMarkets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_QueryMarkets_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryMarketsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_QueryMarkets_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.QueryMarkets(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_QueryPosition_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_QueryPosition_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPosition_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryPositions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_QueryPositions_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPositions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryPositionStore_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_QueryPositionStore_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPositionStore_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ModuleAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ModuleAccounts_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ModuleAccounts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryMarkets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_QueryMarkets_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryMarkets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_QueryPosition_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_QueryPosition_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPosition_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryPositions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_QueryPositions_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPositions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryPositionStore_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_QueryPositionStore_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryPositionStore_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ModuleAccounts_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_ModuleAccounts_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ModuleAccounts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_QueryMarkets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_QueryMarkets_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_QueryMarkets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_QueryPosition_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "perp", "v2", "position"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_QueryPositions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "perp", "v2", "positions"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_QueryPositionStore_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "perp", "v2", "position_store"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ModuleAccounts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "perp", "v2", "module_accounts"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_QueryMarkets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "perp", "v2", "markets"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_QueryPosition_0 = runtime.ForwardResponseMessage - - forward_Query_QueryPositions_0 = runtime.ForwardResponseMessage - - forward_Query_QueryPositionStore_0 = runtime.ForwardResponseMessage - - forward_Query_ModuleAccounts_0 = runtime.ForwardResponseMessage - - forward_Query_QueryMarkets_0 = runtime.ForwardResponseMessage -) diff --git a/x/perp/v2/types/snapshot.go b/x/perp/v2/types/snapshot.go deleted file mode 100644 index e7c273b74..000000000 --- a/x/perp/v2/types/snapshot.go +++ /dev/null @@ -1,43 +0,0 @@ -package types - -import ( - fmt "fmt" - time "time" -) - -func (s ReserveSnapshot) Validate() error { - err := s.Amm.Pair.Validate() - if err != nil { - return err - } - - if (s.Amm.BaseReserve.String() == "") || (s.Amm.QuoteReserve.String() == "") { - // prevents panics from usage of 'new(Dec)' or 'sdk.Dec{}' - return fmt.Errorf("nil dec value in snapshot. snapshot: %v", s.String()) - } - - if s.Amm.BaseReserve.IsNegative() { - return fmt.Errorf("base asset reserve from snapshot cannot be negative: %d", s.Amm.BaseReserve) - } - - if s.Amm.QuoteReserve.IsNegative() { - return fmt.Errorf("quote asset reserve from snapshot cannot be negative: %d", s.Amm.QuoteReserve) - } - - if s.Amm.PriceMultiplier.IsNegative() { - return fmt.Errorf("peg multiplier from snapshot cannot be negative: %d", s.Amm.PriceMultiplier) - } - - // -62135596800000 in Unix milliseconds is equivalent to "0001-01-01 00:00:00 +0000 UTC". - // This is the earliest possible value for a ctx.blockTime().UnixMilli() - const earliestMs int64 = -62135596800000 - if s.TimestampMs < earliestMs { - snapshotTime := time.Unix(s.TimestampMs/1e3, s.TimestampMs%1e3).UTC() - earliestTime := time.Unix(earliestMs/1e3, earliestMs%1e3).UTC() - return fmt.Errorf("snapshot time (%s, milli=%v) should not be before "+ - "earliest possible UTC time (%s, milli=%v): ", - snapshotTime, s.TimestampMs, earliestTime, earliestMs) - } - - return nil -} diff --git a/x/perp/v2/types/snapshot_test.go b/x/perp/v2/types/snapshot_test.go deleted file mode 100644 index 6feff3892..000000000 --- a/x/perp/v2/types/snapshot_test.go +++ /dev/null @@ -1,130 +0,0 @@ -package types - -import ( - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/asset" -) - -func TestReserveSnapshot_Validate(t *testing.T) { - validPair := asset.MustNewPair("ubtc:unusd") - invalidPair := asset.NewPair("//ubtc", "unusd") - - validDec := sdk.NewDec(1) - - validTimestamp := time.Now().UnixMilli() - - testCases := []struct { - name string - snapshot ReserveSnapshot - expectErr bool - expectedError string - }{ - { - name: "Valid snapshot", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: validDec, - QuoteReserve: validDec, - PriceMultiplier: validDec, - }, - TimestampMs: validTimestamp, - }, - expectErr: false, - }, - { - name: "Invalid pair", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: invalidPair, - BaseReserve: validDec, - QuoteReserve: validDec, - PriceMultiplier: validDec, - }, - TimestampMs: validTimestamp, - }, - expectErr: true, - }, - { - name: "Missing quote reserve", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: validDec, - PriceMultiplier: validDec, - }, - TimestampMs: validTimestamp, - }, - expectErr: true, - }, - { - name: "Negative base reserve", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: sdk.NewDec(-1), - QuoteReserve: sdk.NewDec(1), - PriceMultiplier: validDec, - }, - TimestampMs: validTimestamp, - }, - expectErr: true, - }, - { - name: "Negative quote reserve", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: sdk.NewDec(1), - QuoteReserve: sdk.NewDec(-1), - PriceMultiplier: validDec, - }, - TimestampMs: validTimestamp, - }, - expectErr: true, - }, - { - name: "Peg multiplier", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: validDec, - QuoteReserve: validDec, - PriceMultiplier: sdk.NewDec(-1), - }, - TimestampMs: validTimestamp, - }, - expectErr: true, - }, - { - name: "low timestamp", - snapshot: ReserveSnapshot{ - Amm: AMM{ - Pair: validPair, - BaseReserve: validDec, - QuoteReserve: validDec, - PriceMultiplier: validDec, - }, - TimestampMs: -62135596800001, - }, - expectErr: true, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - err := tc.snapshot.Validate() - if tc.expectErr { - require.Error(t, err) - require.Contains(t, err.Error(), tc.expectedError) - } else { - require.NoError(t, err) - } - }) - } -} diff --git a/x/perp/v2/types/state.pb.go b/x/perp/v2/types/state.pb.go deleted file mode 100644 index 0849e70f6..000000000 --- a/x/perp/v2/types/state.pb.go +++ /dev/null @@ -1,2432 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/perp/v2/state.proto - -package types - -import ( - fmt "fmt" - github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" - _ "github.com/cosmos/cosmos-proto" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" - _ "google.golang.org/protobuf/types/known/durationpb" - io "io" - math "math" - math_bits "math/bits" - time "time" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// The direction that the user is trading in -// LONG means the user is going long the base asset (e.g. buy BTC) -// SHORT means the user is shorting the base asset (e.g. sell BTC) -type Direction int32 - -const ( - Direction_DIRECTION_UNSPECIFIED Direction = 0 - Direction_LONG Direction = 1 - Direction_SHORT Direction = 2 -) - -var Direction_name = map[int32]string{ - 0: "DIRECTION_UNSPECIFIED", - 1: "LONG", - 2: "SHORT", -} - -var Direction_value = map[string]int32{ - "DIRECTION_UNSPECIFIED": 0, - "LONG": 1, - "SHORT": 2, -} - -func (x Direction) String() string { - return proto.EnumName(Direction_name, int32(x)) -} - -func (Direction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{0} -} - -// Enumerates different options of calculating twap. -type TwapCalcOption int32 - -const ( - TwapCalcOption_TWAP_CALC_OPTION_UNSPECIFIED TwapCalcOption = 0 - // Spot price from quote asset reserve / base asset reserve - TwapCalcOption_SPOT TwapCalcOption = 1 - // Swapping with quote assets, output denominated in base assets - TwapCalcOption_QUOTE_ASSET_SWAP TwapCalcOption = 2 - // Swapping with base assets, output denominated in quote assets - TwapCalcOption_BASE_ASSET_SWAP TwapCalcOption = 3 -) - -var TwapCalcOption_name = map[int32]string{ - 0: "TWAP_CALC_OPTION_UNSPECIFIED", - 1: "SPOT", - 2: "QUOTE_ASSET_SWAP", - 3: "BASE_ASSET_SWAP", -} - -var TwapCalcOption_value = map[string]int32{ - "TWAP_CALC_OPTION_UNSPECIFIED": 0, - "SPOT": 1, - "QUOTE_ASSET_SWAP": 2, - "BASE_ASSET_SWAP": 3, -} - -func (x TwapCalcOption) String() string { - return proto.EnumName(TwapCalcOption_name, int32(x)) -} - -func (TwapCalcOption) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{1} -} - -type Market struct { - // the trading pair represented by this market - // always BASE:QUOTE, e.g. BTC:NUSD or ETH:NUSD - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // whether or not the market is enabled - Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` - // the version of the Market, only one market can exist per pair, when one is closed it cannot be reactivated, - // so a new market must be created, this is the version of the market - Version uint64 `protobuf:"varint,14,opt,name=version,proto3" json:"version,omitempty"` - // the minimum margin ratio which a user must maintain on this market - MaintenanceMarginRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=maintenance_margin_ratio,json=maintenanceMarginRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"maintenance_margin_ratio"` - // the maximum leverage a user is able to be taken on this market - MaxLeverage github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=max_leverage,json=maxLeverage,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"max_leverage"` - // Latest cumulative premium fraction for a given pair. - // Calculated once per funding rate interval. - // A premium fraction is the difference between mark and index, divided by the - // number of payments per day. (mark - index) / # payments in a day - LatestCumulativePremiumFraction github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=latest_cumulative_premium_fraction,json=latestCumulativePremiumFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"latest_cumulative_premium_fraction"` - // the percentage of the notional given to the exchange when trading - ExchangeFeeRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=exchange_fee_ratio,json=exchangeFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchange_fee_ratio"` - // the percentage of the notional transferred to the ecosystem fund when - // trading - EcosystemFundFeeRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=ecosystem_fund_fee_ratio,json=ecosystemFundFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"ecosystem_fund_fee_ratio"` - // the percentage of liquidated position that will be - // given to out as a reward. Half of the liquidation fee is given to the - // liquidator, and the other half is given to the ecosystem fund. - LiquidationFeeRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,8,opt,name=liquidation_fee_ratio,json=liquidationFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidation_fee_ratio"` - // the portion of the position size we try to liquidate if the available - // margin is higher than liquidation fee - PartialLiquidationRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,9,opt,name=partial_liquidation_ratio,json=partialLiquidationRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"partial_liquidation_ratio"` - // specifies the interval on which the funding rate is updated - FundingRateEpochId string `protobuf:"bytes,10,opt,name=funding_rate_epoch_id,json=fundingRateEpochId,proto3" json:"funding_rate_epoch_id,omitempty"` - // amount of time to look back for TWAP calculations - TwapLookbackWindow time.Duration `protobuf:"bytes,11,opt,name=twap_lookback_window,json=twapLookbackWindow,proto3,stdduration" json:"twap_lookback_window"` - // the amount of collateral already credited from the ecosystem fund - PrepaidBadDebt types.Coin `protobuf:"bytes,12,opt,name=prepaid_bad_debt,json=prepaidBadDebt,proto3" json:"prepaid_bad_debt"` - // the maximum funding rate payment per epoch, this represents the maximum - // amount of funding that can be paid out per epoch as a percentage of the - // position size - MaxFundingRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,13,opt,name=max_funding_rate,json=maxFundingRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec,stdduration" json:"max_funding_rate"` -} - -func (m *Market) Reset() { *m = Market{} } -func (m *Market) String() string { return proto.CompactTextString(m) } -func (*Market) ProtoMessage() {} -func (*Market) Descriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{0} -} -func (m *Market) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Market) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Market.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Market) XXX_Merge(src proto.Message) { - xxx_messageInfo_Market.Merge(m, src) -} -func (m *Market) XXX_Size() int { - return m.Size() -} -func (m *Market) XXX_DiscardUnknown() { - xxx_messageInfo_Market.DiscardUnknown(m) -} - -var xxx_messageInfo_Market proto.InternalMessageInfo - -func (m *Market) GetEnabled() bool { - if m != nil { - return m.Enabled - } - return false -} - -func (m *Market) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -func (m *Market) GetFundingRateEpochId() string { - if m != nil { - return m.FundingRateEpochId - } - return "" -} - -func (m *Market) GetTwapLookbackWindow() time.Duration { - if m != nil { - return m.TwapLookbackWindow - } - return 0 -} - -func (m *Market) GetPrepaidBadDebt() types.Coin { - if m != nil { - return m.PrepaidBadDebt - } - return types.Coin{} -} - -// MarketLastVersion is used to store the last version of the market -type MarketLastVersion struct { - // version of the market - Version uint64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` -} - -func (m *MarketLastVersion) Reset() { *m = MarketLastVersion{} } -func (m *MarketLastVersion) String() string { return proto.CompactTextString(m) } -func (*MarketLastVersion) ProtoMessage() {} -func (*MarketLastVersion) Descriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{1} -} -func (m *MarketLastVersion) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MarketLastVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MarketLastVersion.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MarketLastVersion) XXX_Merge(src proto.Message) { - xxx_messageInfo_MarketLastVersion.Merge(m, src) -} -func (m *MarketLastVersion) XXX_Size() int { - return m.Size() -} -func (m *MarketLastVersion) XXX_DiscardUnknown() { - xxx_messageInfo_MarketLastVersion.DiscardUnknown(m) -} - -var xxx_messageInfo_MarketLastVersion proto.InternalMessageInfo - -func (m *MarketLastVersion) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -type AMM struct { - // identifies the market this AMM belongs to - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // the version of the AMM, only one AMM can exist per pair, when one is closed it cannot be reactivated, - // so a new AMM must be created, this is the version of the AMM - Version uint64 `protobuf:"varint,8,opt,name=version,proto3" json:"version,omitempty"` - // the amount of base reserves this AMM has - BaseReserve github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=base_reserve,json=baseReserve,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"base_reserve"` - // the amount of quote reserves this AMM has - QuoteReserve github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=quote_reserve,json=quoteReserve,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"quote_reserve"` - // sqrt(k) - SqrtDepth github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=sqrt_depth,json=sqrtDepth,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"sqrt_depth"` - // the price multiplier of the dynamic AMM - PriceMultiplier github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=price_multiplier,json=priceMultiplier,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"price_multiplier"` - // Total long refers to the sum of long open notional in base. - TotalLong github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=total_long,json=totalLong,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"total_long"` - // Total short refers to the sum of short open notional in base. - TotalShort github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=total_short,json=totalShort,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"total_short"` - // The settlement price if the AMM is settled. - SettlementPrice github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,9,opt,name=settlement_price,json=settlementPrice,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec,stdduration" json:"settlement_price"` -} - -func (m *AMM) Reset() { *m = AMM{} } -func (m *AMM) String() string { return proto.CompactTextString(m) } -func (*AMM) ProtoMessage() {} -func (*AMM) Descriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{2} -} -func (m *AMM) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AMM) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AMM.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AMM) XXX_Merge(src proto.Message) { - xxx_messageInfo_AMM.Merge(m, src) -} -func (m *AMM) XXX_Size() int { - return m.Size() -} -func (m *AMM) XXX_DiscardUnknown() { - xxx_messageInfo_AMM.DiscardUnknown(m) -} - -var xxx_messageInfo_AMM proto.InternalMessageInfo - -func (m *AMM) GetVersion() uint64 { - if m != nil { - return m.Version - } - return 0 -} - -type Position struct { - // address identifies the address owner of this position - TraderAddress string `protobuf:"bytes,1,opt,name=trader_address,json=traderAddress,proto3" json:"trader_address,omitempty"` - // pair identifies the pair associated with this position - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - // the position size - Size_ github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=size,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"size"` - // amount of margin remaining in the position - Margin github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=margin,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"margin"` - // value of position in quote assets when opened - OpenNotional github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=open_notional,json=openNotional,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"open_notional"` - // The most recent cumulative premium fraction this position has. - // Used to calculate the next funding payment. - LatestCumulativePremiumFraction github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=latest_cumulative_premium_fraction,json=latestCumulativePremiumFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"latest_cumulative_premium_fraction"` - // last block number this position was updated - LastUpdatedBlockNumber int64 `protobuf:"varint,7,opt,name=last_updated_block_number,json=lastUpdatedBlockNumber,proto3" json:"last_updated_block_number,omitempty"` -} - -func (m *Position) Reset() { *m = Position{} } -func (m *Position) String() string { return proto.CompactTextString(m) } -func (*Position) ProtoMessage() {} -func (*Position) Descriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{3} -} -func (m *Position) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Position) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Position.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Position) XXX_Merge(src proto.Message) { - xxx_messageInfo_Position.Merge(m, src) -} -func (m *Position) XXX_Size() int { - return m.Size() -} -func (m *Position) XXX_DiscardUnknown() { - xxx_messageInfo_Position.DiscardUnknown(m) -} - -var xxx_messageInfo_Position proto.InternalMessageInfo - -func (m *Position) GetTraderAddress() string { - if m != nil { - return m.TraderAddress - } - return "" -} - -func (m *Position) GetLastUpdatedBlockNumber() int64 { - if m != nil { - return m.LastUpdatedBlockNumber - } - return 0 -} - -// a snapshot of the perp.amm's reserves at a given point in time -type ReserveSnapshot struct { - Amm AMM `protobuf:"bytes,1,opt,name=amm,proto3" json:"amm"` - // milliseconds since unix epoch - TimestampMs int64 `protobuf:"varint,2,opt,name=timestamp_ms,json=timestampMs,proto3" json:"timestamp_ms,omitempty"` -} - -func (m *ReserveSnapshot) Reset() { *m = ReserveSnapshot{} } -func (m *ReserveSnapshot) String() string { return proto.CompactTextString(m) } -func (*ReserveSnapshot) ProtoMessage() {} -func (*ReserveSnapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_8f4829f34f7b8040, []int{4} -} -func (m *ReserveSnapshot) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ReserveSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ReserveSnapshot.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ReserveSnapshot) XXX_Merge(src proto.Message) { - xxx_messageInfo_ReserveSnapshot.Merge(m, src) -} -func (m *ReserveSnapshot) XXX_Size() int { - return m.Size() -} -func (m *ReserveSnapshot) XXX_DiscardUnknown() { - xxx_messageInfo_ReserveSnapshot.DiscardUnknown(m) -} - -var xxx_messageInfo_ReserveSnapshot proto.InternalMessageInfo - -func (m *ReserveSnapshot) GetAmm() AMM { - if m != nil { - return m.Amm - } - return AMM{} -} - -func (m *ReserveSnapshot) GetTimestampMs() int64 { - if m != nil { - return m.TimestampMs - } - return 0 -} - -func init() { - proto.RegisterEnum("nibiru.perp.v2.Direction", Direction_name, Direction_value) - proto.RegisterEnum("nibiru.perp.v2.TwapCalcOption", TwapCalcOption_name, TwapCalcOption_value) - proto.RegisterType((*Market)(nil), "nibiru.perp.v2.Market") - proto.RegisterType((*MarketLastVersion)(nil), "nibiru.perp.v2.MarketLastVersion") - proto.RegisterType((*AMM)(nil), "nibiru.perp.v2.AMM") - proto.RegisterType((*Position)(nil), "nibiru.perp.v2.Position") - proto.RegisterType((*ReserveSnapshot)(nil), "nibiru.perp.v2.ReserveSnapshot") -} - -func init() { proto.RegisterFile("nibiru/perp/v2/state.proto", fileDescriptor_8f4829f34f7b8040) } - -var fileDescriptor_8f4829f34f7b8040 = []byte{ - // 1118 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x96, 0xcf, 0x6f, 0xdc, 0x44, - 0x14, 0xc7, 0xb3, 0xc9, 0x36, 0xcd, 0x4e, 0xd2, 0x64, 0x99, 0x36, 0xc5, 0xa9, 0xd0, 0x26, 0x44, - 0x02, 0x45, 0x45, 0xb5, 0x95, 0x70, 0xaa, 0x38, 0xed, 0x8f, 0xa4, 0x44, 0xda, 0x5f, 0xf5, 0x6e, - 0xa8, 0x40, 0x45, 0xa3, 0xb1, 0xfd, 0xe2, 0x1d, 0x62, 0x7b, 0xdc, 0x99, 0xf1, 0x26, 0x85, 0x3f, - 0x02, 0x8e, 0xf0, 0xd7, 0x70, 0xed, 0xb1, 0x47, 0xc4, 0xa1, 0xa0, 0xf6, 0x1f, 0x41, 0x33, 0xf6, - 0x6e, 0x36, 0x12, 0x12, 0x60, 0xd1, 0x53, 0x32, 0xf3, 0xfc, 0x3e, 0xdf, 0xe7, 0xb7, 0x6f, 0xbe, - 0x63, 0xf4, 0x20, 0x61, 0x1e, 0x13, 0x99, 0x93, 0x82, 0x48, 0x9d, 0xe9, 0x91, 0x23, 0x15, 0x55, - 0x60, 0xa7, 0x82, 0x2b, 0x8e, 0x37, 0xf3, 0x98, 0xad, 0x63, 0xf6, 0xf4, 0xe8, 0xc1, 0xbd, 0x90, - 0x87, 0xdc, 0x84, 0x1c, 0xfd, 0x5f, 0xfe, 0xd4, 0x83, 0x86, 0xcf, 0x65, 0xcc, 0xa5, 0xe3, 0x51, - 0x09, 0xce, 0xf4, 0xd0, 0x03, 0x45, 0x0f, 0x1d, 0x9f, 0xb3, 0xa4, 0x88, 0xef, 0xe4, 0x71, 0x92, - 0x27, 0xe6, 0x8b, 0x59, 0x6a, 0xc8, 0x79, 0x18, 0x81, 0x63, 0x56, 0x5e, 0x76, 0xee, 0x04, 0x99, - 0xa0, 0x8a, 0xf1, 0x22, 0x75, 0xff, 0xc7, 0x1a, 0x5a, 0xed, 0x51, 0x71, 0x01, 0x0a, 0xf7, 0x50, - 0x35, 0xa5, 0x4c, 0x58, 0x95, 0xbd, 0xca, 0x41, 0xad, 0xf5, 0xf8, 0xd5, 0x9b, 0xdd, 0xa5, 0xdf, - 0xdf, 0xec, 0x1e, 0x86, 0x4c, 0x4d, 0x32, 0xcf, 0xf6, 0x79, 0xec, 0xf4, 0x4d, 0xb1, 0xed, 0x09, - 0x65, 0x89, 0x53, 0xbc, 0xd4, 0x95, 0xe3, 0xf3, 0x38, 0xe6, 0x89, 0x43, 0xa5, 0x04, 0x65, 0x0f, - 0x29, 0x13, 0xae, 0xc1, 0x60, 0x0b, 0xdd, 0x86, 0x84, 0x7a, 0x11, 0x04, 0xd6, 0xf2, 0x5e, 0xe5, - 0x60, 0xcd, 0x9d, 0x2d, 0x75, 0x64, 0x0a, 0x42, 0x32, 0x9e, 0x58, 0x9b, 0x7b, 0x95, 0x83, 0xaa, - 0x3b, 0x5b, 0xe2, 0x09, 0xb2, 0x62, 0xca, 0x12, 0x05, 0x09, 0x4d, 0x7c, 0x20, 0x31, 0x15, 0x21, - 0x4b, 0x88, 0x29, 0xd8, 0x5a, 0x31, 0x65, 0xd9, 0x45, 0x59, 0x9f, 0x2e, 0x94, 0x55, 0x74, 0x27, - 0xff, 0xf3, 0x48, 0x06, 0x17, 0x8e, 0x7a, 0x99, 0x82, 0xb4, 0x3b, 0xe0, 0xbb, 0xf7, 0x17, 0x78, - 0x3d, 0x83, 0x73, 0x35, 0x0d, 0x3f, 0x45, 0x1b, 0x31, 0xbd, 0x22, 0x11, 0x4c, 0x41, 0xd0, 0x10, - 0xac, 0x6a, 0x29, 0xfa, 0x7a, 0x4c, 0xaf, 0xba, 0x05, 0x02, 0xff, 0x80, 0xf6, 0x23, 0xaa, 0x40, - 0x2a, 0xe2, 0x67, 0x71, 0x16, 0x51, 0xc5, 0xa6, 0x40, 0x52, 0x01, 0x31, 0xcb, 0x62, 0x72, 0x2e, - 0xa8, 0xaf, 0xdb, 0x6e, 0xdd, 0x2a, 0x25, 0xb4, 0x9b, 0x93, 0xdb, 0x73, 0xf0, 0x30, 0xe7, 0x9e, - 0x14, 0x58, 0xfc, 0x1c, 0x61, 0xb8, 0xf2, 0x27, 0x34, 0x09, 0x81, 0x9c, 0x03, 0x14, 0x3d, 0x5b, - 0x2d, 0x25, 0x56, 0x9f, 0x91, 0x4e, 0x00, 0xf2, 0x6e, 0x85, 0xc8, 0x02, 0x9f, 0xcb, 0x97, 0x52, - 0x41, 0x4c, 0xce, 0xb3, 0x24, 0x58, 0xd0, 0xb8, 0x5d, 0x4a, 0x63, 0x7b, 0xce, 0x3b, 0xc9, 0x92, - 0x60, 0x2e, 0xe4, 0xa1, 0xed, 0x88, 0xbd, 0xc8, 0x58, 0x60, 0x66, 0x74, 0x41, 0x65, 0xad, 0x94, - 0xca, 0xdd, 0x05, 0xd8, 0x5c, 0xe3, 0x3b, 0xb4, 0x93, 0x52, 0xa1, 0x18, 0x8d, 0xc8, 0xa2, 0x56, - 0xae, 0x53, 0x2b, 0xa5, 0xf3, 0x61, 0x01, 0xec, 0x5e, 0xf3, 0x72, 0xad, 0x43, 0xb4, 0xad, 0xdb, - 0xc5, 0x92, 0x50, 0xf3, 0x81, 0x40, 0xca, 0xfd, 0x09, 0x61, 0x81, 0x85, 0xb4, 0x8e, 0x8b, 0x8b, - 0xa0, 0x4b, 0x15, 0x1c, 0xeb, 0xd0, 0x69, 0x80, 0xcf, 0xd0, 0x3d, 0x75, 0x49, 0x53, 0x12, 0x71, - 0x7e, 0xe1, 0x51, 0xff, 0x82, 0x5c, 0xb2, 0x24, 0xe0, 0x97, 0xd6, 0xfa, 0x5e, 0xe5, 0x60, 0xfd, - 0x68, 0xc7, 0xce, 0x0f, 0xb4, 0x3d, 0x3b, 0xd0, 0x76, 0xa7, 0x38, 0xd0, 0xad, 0x35, 0x5d, 0xf4, - 0xcf, 0x7f, 0xec, 0x56, 0x5c, 0xac, 0x01, 0xdd, 0x22, 0xff, 0x99, 0x49, 0xc7, 0xa7, 0xa8, 0x9e, - 0x0a, 0x48, 0x29, 0x0b, 0x88, 0x47, 0x03, 0x12, 0x80, 0xa7, 0xac, 0x8d, 0x02, 0x59, 0x38, 0x86, - 0xb6, 0x17, 0xbb, 0xb0, 0x17, 0xbb, 0xcd, 0x59, 0xd2, 0xaa, 0x6a, 0xa4, 0xbb, 0x59, 0x24, 0xb6, - 0x68, 0xd0, 0x01, 0x4f, 0xe1, 0xe7, 0xa8, 0xae, 0xcf, 0xce, 0xe2, 0x8b, 0x59, 0x77, 0x4c, 0xdf, - 0x8e, 0xfe, 0x5b, 0xdf, 0x4c, 0xb1, 0x9b, 0x31, 0xbd, 0x3a, 0xb9, 0x6e, 0xc3, 0xfe, 0x23, 0xf4, - 0x41, 0x6e, 0x48, 0x5d, 0x2a, 0xd5, 0x57, 0x85, 0x31, 0x2c, 0x58, 0x46, 0xe5, 0x86, 0x65, 0xec, - 0xff, 0x7a, 0x0b, 0xad, 0x34, 0x7b, 0xbd, 0xf7, 0xe0, 0x5e, 0x33, 0xc1, 0xb5, 0x9b, 0x1e, 0xf5, - 0x14, 0x6d, 0xe8, 0x46, 0x11, 0x01, 0x12, 0xc4, 0x14, 0x8c, 0xb9, 0x95, 0x70, 0x0e, 0xcd, 0x70, - 0x73, 0x04, 0x1e, 0xa1, 0x3b, 0x2f, 0x32, 0xae, 0xae, 0x99, 0xe5, 0xbc, 0x6e, 0xc3, 0x40, 0x66, - 0xd0, 0x1e, 0x42, 0xf2, 0x85, 0x50, 0x24, 0x80, 0x54, 0x4d, 0x4a, 0xfa, 0x5b, 0x4d, 0x13, 0x3a, - 0x1a, 0x80, 0xbf, 0xd6, 0xf3, 0xc3, 0xb4, 0x29, 0x67, 0x91, 0x62, 0x69, 0xc4, 0x40, 0x94, 0xf4, - 0xb2, 0x2d, 0xc3, 0xe9, 0xcd, 0x31, 0xba, 0x52, 0xc5, 0x95, 0x3e, 0x8e, 0x3c, 0x09, 0x4b, 0x7a, - 0x56, 0xcd, 0x10, 0xba, 0x3c, 0x09, 0xf1, 0x00, 0xad, 0xe7, 0x38, 0x39, 0xe1, 0x42, 0x95, 0xf4, - 0xa7, 0xbc, 0xa2, 0x91, 0x26, 0xe0, 0x6f, 0x51, 0x5d, 0x82, 0x52, 0x11, 0xc4, 0x90, 0x28, 0x62, - 0xaa, 0x2f, 0x7c, 0xa2, 0xcc, 0xbc, 0x6f, 0x5d, 0xb3, 0x86, 0x1a, 0xb5, 0xff, 0x4b, 0x15, 0xad, - 0x0d, 0xb9, 0x64, 0xc6, 0xc7, 0x3f, 0x41, 0x9b, 0x4a, 0xd0, 0x00, 0x04, 0xa1, 0x41, 0x20, 0x40, - 0xca, 0x7c, 0xa0, 0xdd, 0x3b, 0xf9, 0x6e, 0x33, 0xdf, 0x9c, 0x4f, 0xfb, 0xf2, 0xff, 0x33, 0xed, - 0x2d, 0x54, 0x95, 0xec, 0xfb, 0xb2, 0x73, 0x67, 0x72, 0xf1, 0x09, 0x5a, 0xcd, 0xef, 0xeb, 0x92, - 0xb3, 0x56, 0x64, 0xeb, 0xc3, 0xc0, 0x53, 0x48, 0x48, 0xc2, 0x75, 0x43, 0x68, 0x54, 0x72, 0xca, - 0x36, 0x34, 0xa4, 0x5f, 0x30, 0xfe, 0xe5, 0xdd, 0xbc, 0xfa, 0x7e, 0xee, 0xe6, 0xc7, 0x68, 0x27, - 0xa2, 0x52, 0x91, 0x2c, 0x0d, 0xa8, 0x82, 0x80, 0x78, 0x11, 0xf7, 0x2f, 0x48, 0x92, 0xc5, 0x1e, - 0x08, 0x33, 0x9e, 0x2b, 0xee, 0x7d, 0xfd, 0xc0, 0x59, 0x1e, 0x6f, 0xe9, 0x70, 0xdf, 0x44, 0xf7, - 0x29, 0xda, 0x2a, 0xce, 0xf3, 0x28, 0xa1, 0xa9, 0x9c, 0x70, 0x85, 0x3f, 0x43, 0x2b, 0x34, 0x8e, - 0xcd, 0x58, 0xac, 0x1f, 0xdd, 0xb5, 0x6f, 0x7e, 0x40, 0xda, 0xcd, 0x5e, 0xaf, 0x70, 0x6d, 0xfd, - 0x14, 0xfe, 0x18, 0x6d, 0x28, 0x16, 0x83, 0x54, 0x34, 0x4e, 0x49, 0x2c, 0xcd, 0xbc, 0xac, 0xb8, - 0xeb, 0xf3, 0xbd, 0x9e, 0x7c, 0xf8, 0x05, 0xaa, 0x75, 0x98, 0x80, 0xbc, 0xd4, 0x1d, 0xb4, 0xdd, - 0x39, 0x75, 0x8f, 0xdb, 0xe3, 0xd3, 0x41, 0x9f, 0x9c, 0xf5, 0x47, 0xc3, 0xe3, 0xf6, 0xe9, 0xc9, - 0xe9, 0x71, 0xa7, 0xbe, 0x84, 0xd7, 0x50, 0xb5, 0x3b, 0xe8, 0x3f, 0xa9, 0x57, 0x70, 0x0d, 0xdd, - 0x1a, 0x7d, 0x39, 0x70, 0xc7, 0xf5, 0xe5, 0x87, 0x21, 0xda, 0x1c, 0x5f, 0xd2, 0xb4, 0x4d, 0x23, - 0x7f, 0x90, 0x1a, 0xc2, 0x1e, 0xfa, 0x68, 0xfc, 0xac, 0x39, 0x24, 0xed, 0x66, 0xb7, 0x4d, 0x06, - 0xc3, 0xbf, 0x07, 0x8d, 0x86, 0x83, 0x71, 0xbd, 0x82, 0xef, 0xa1, 0xfa, 0xd3, 0xb3, 0xc1, 0xf8, - 0x98, 0x34, 0x47, 0xa3, 0xe3, 0x31, 0x19, 0x3d, 0x6b, 0x0e, 0xeb, 0xcb, 0xf8, 0x2e, 0xda, 0x6a, - 0x35, 0x47, 0x37, 0x36, 0x57, 0x5a, 0x4f, 0x5e, 0xbd, 0x6d, 0x54, 0x5e, 0xbf, 0x6d, 0x54, 0xfe, - 0x7c, 0xdb, 0xa8, 0xfc, 0xf4, 0xae, 0xb1, 0xf4, 0xfa, 0x5d, 0x63, 0xe9, 0xb7, 0x77, 0x8d, 0xa5, - 0x6f, 0x1e, 0xfd, 0xd3, 0xd0, 0xcf, 0xbe, 0xbb, 0xcd, 0x2f, 0xe6, 0xad, 0x9a, 0x8b, 0xf3, 0xf3, - 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0x73, 0x2a, 0x4b, 0xe9, 0x96, 0x0b, 0x00, 0x00, -} - -func (m *Market) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Market) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Market) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Version != 0 { - i = encodeVarintState(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x70 - } - { - size := m.MaxFundingRate.Size() - i -= size - if _, err := m.MaxFundingRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x6a - { - size, err := m.PrepaidBadDebt.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x62 - n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.TwapLookbackWindow, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TwapLookbackWindow):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintState(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x5a - if len(m.FundingRateEpochId) > 0 { - i -= len(m.FundingRateEpochId) - copy(dAtA[i:], m.FundingRateEpochId) - i = encodeVarintState(dAtA, i, uint64(len(m.FundingRateEpochId))) - i-- - dAtA[i] = 0x52 - } - { - size := m.PartialLiquidationRatio.Size() - i -= size - if _, err := m.PartialLiquidationRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - { - size := m.LiquidationFeeRatio.Size() - i -= size - if _, err := m.LiquidationFeeRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - { - size := m.EcosystemFundFeeRatio.Size() - i -= size - if _, err := m.EcosystemFundFeeRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size := m.ExchangeFeeRatio.Size() - i -= size - if _, err := m.ExchangeFeeRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.LatestCumulativePremiumFraction.Size() - i -= size - if _, err := m.LatestCumulativePremiumFraction.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.MaxLeverage.Size() - i -= size - if _, err := m.MaxLeverage.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.MaintenanceMarginRatio.Size() - i -= size - if _, err := m.MaintenanceMarginRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.Enabled { - i-- - if m.Enabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MarketLastVersion) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MarketLastVersion) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MarketLastVersion) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Version != 0 { - i = encodeVarintState(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *AMM) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AMM) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AMM) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.SettlementPrice.Size() - i -= size - if _, err := m.SettlementPrice.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - if m.Version != 0 { - i = encodeVarintState(dAtA, i, uint64(m.Version)) - i-- - dAtA[i] = 0x40 - } - { - size := m.TotalShort.Size() - i -= size - if _, err := m.TotalShort.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size := m.TotalLong.Size() - i -= size - if _, err := m.TotalLong.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.PriceMultiplier.Size() - i -= size - if _, err := m.PriceMultiplier.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.SqrtDepth.Size() - i -= size - if _, err := m.SqrtDepth.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.QuoteReserve.Size() - i -= size - if _, err := m.QuoteReserve.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.BaseReserve.Size() - i -= size - if _, err := m.BaseReserve.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Position) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Position) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Position) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.LastUpdatedBlockNumber != 0 { - i = encodeVarintState(dAtA, i, uint64(m.LastUpdatedBlockNumber)) - i-- - dAtA[i] = 0x38 - } - { - size := m.LatestCumulativePremiumFraction.Size() - i -= size - if _, err := m.LatestCumulativePremiumFraction.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.OpenNotional.Size() - i -= size - if _, err := m.OpenNotional.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.Margin.Size() - i -= size - if _, err := m.Margin.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.Size_.Size() - i -= size - if _, err := m.Size_.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.TraderAddress) > 0 { - i -= len(m.TraderAddress) - copy(dAtA[i:], m.TraderAddress) - i = encodeVarintState(dAtA, i, uint64(len(m.TraderAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ReserveSnapshot) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ReserveSnapshot) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ReserveSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.TimestampMs != 0 { - i = encodeVarintState(dAtA, i, uint64(m.TimestampMs)) - i-- - dAtA[i] = 0x10 - } - { - size, err := m.Amm.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintState(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintState(dAtA []byte, offset int, v uint64) int { - offset -= sovState(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Market) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovState(uint64(l)) - if m.Enabled { - n += 2 - } - l = m.MaintenanceMarginRatio.Size() - n += 1 + l + sovState(uint64(l)) - l = m.MaxLeverage.Size() - n += 1 + l + sovState(uint64(l)) - l = m.LatestCumulativePremiumFraction.Size() - n += 1 + l + sovState(uint64(l)) - l = m.ExchangeFeeRatio.Size() - n += 1 + l + sovState(uint64(l)) - l = m.EcosystemFundFeeRatio.Size() - n += 1 + l + sovState(uint64(l)) - l = m.LiquidationFeeRatio.Size() - n += 1 + l + sovState(uint64(l)) - l = m.PartialLiquidationRatio.Size() - n += 1 + l + sovState(uint64(l)) - l = len(m.FundingRateEpochId) - if l > 0 { - n += 1 + l + sovState(uint64(l)) - } - l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.TwapLookbackWindow) - n += 1 + l + sovState(uint64(l)) - l = m.PrepaidBadDebt.Size() - n += 1 + l + sovState(uint64(l)) - l = m.MaxFundingRate.Size() - n += 1 + l + sovState(uint64(l)) - if m.Version != 0 { - n += 1 + sovState(uint64(m.Version)) - } - return n -} - -func (m *MarketLastVersion) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Version != 0 { - n += 1 + sovState(uint64(m.Version)) - } - return n -} - -func (m *AMM) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovState(uint64(l)) - l = m.BaseReserve.Size() - n += 1 + l + sovState(uint64(l)) - l = m.QuoteReserve.Size() - n += 1 + l + sovState(uint64(l)) - l = m.SqrtDepth.Size() - n += 1 + l + sovState(uint64(l)) - l = m.PriceMultiplier.Size() - n += 1 + l + sovState(uint64(l)) - l = m.TotalLong.Size() - n += 1 + l + sovState(uint64(l)) - l = m.TotalShort.Size() - n += 1 + l + sovState(uint64(l)) - if m.Version != 0 { - n += 1 + sovState(uint64(m.Version)) - } - l = m.SettlementPrice.Size() - n += 1 + l + sovState(uint64(l)) - return n -} - -func (m *Position) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TraderAddress) - if l > 0 { - n += 1 + l + sovState(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovState(uint64(l)) - l = m.Size_.Size() - n += 1 + l + sovState(uint64(l)) - l = m.Margin.Size() - n += 1 + l + sovState(uint64(l)) - l = m.OpenNotional.Size() - n += 1 + l + sovState(uint64(l)) - l = m.LatestCumulativePremiumFraction.Size() - n += 1 + l + sovState(uint64(l)) - if m.LastUpdatedBlockNumber != 0 { - n += 1 + sovState(uint64(m.LastUpdatedBlockNumber)) - } - return n -} - -func (m *ReserveSnapshot) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Amm.Size() - n += 1 + l + sovState(uint64(l)) - if m.TimestampMs != 0 { - n += 1 + sovState(uint64(m.TimestampMs)) - } - return n -} - -func sovState(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozState(x uint64) (n int) { - return sovState(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Market) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Market: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Market: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Enabled = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaintenanceMarginRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaintenanceMarginRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxLeverage", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxLeverage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LatestCumulativePremiumFraction", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LatestCumulativePremiumFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangeFeeRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangeFeeRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EcosystemFundFeeRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EcosystemFundFeeRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LiquidationFeeRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LiquidationFeeRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PartialLiquidationRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PartialLiquidationRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingRateEpochId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FundingRateEpochId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TwapLookbackWindow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.TwapLookbackWindow, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 12: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrepaidBadDebt", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PrepaidBadDebt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 13: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxFundingRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MaxFundingRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 14: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipState(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthState - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MarketLastVersion) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MarketLastVersion: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MarketLastVersion: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipState(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthState - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AMM) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AMM: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AMM: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BaseReserve", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BaseReserve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field QuoteReserve", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.QuoteReserve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SqrtDepth", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SqrtDepth.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceMultiplier", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PriceMultiplier.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalLong", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TotalLong.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalShort", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TotalShort.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - m.Version = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Version |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SettlementPrice", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SettlementPrice.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipState(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthState - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Position) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Position: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Position: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TraderAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TraderAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Size_.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Margin", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Margin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OpenNotional", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.OpenNotional.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LatestCumulativePremiumFraction", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LatestCumulativePremiumFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUpdatedBlockNumber", wireType) - } - m.LastUpdatedBlockNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastUpdatedBlockNumber |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipState(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthState - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ReserveSnapshot) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ReserveSnapshot: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ReserveSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amm", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthState - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthState - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amm.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TimestampMs", wireType) - } - m.TimestampMs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowState - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TimestampMs |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipState(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthState - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipState(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowState - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowState - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowState - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthState - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupState - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthState - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthState = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowState = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupState = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/perp/v2/types/tx.pb.go b/x/perp/v2/types/tx.pb.go deleted file mode 100644 index a6993682b..000000000 --- a/x/perp/v2/types/tx.pb.go +++ /dev/null @@ -1,5089 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/perp/v2/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// MsgRemoveMargin: Msg to remove margin. -type MsgRemoveMargin struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Margin types.Coin `protobuf:"bytes,3,opt,name=margin,proto3" json:"margin"` -} - -func (m *MsgRemoveMargin) Reset() { *m = MsgRemoveMargin{} } -func (m *MsgRemoveMargin) String() string { return proto.CompactTextString(m) } -func (*MsgRemoveMargin) ProtoMessage() {} -func (*MsgRemoveMargin) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{0} -} -func (m *MsgRemoveMargin) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRemoveMargin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRemoveMargin.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRemoveMargin) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRemoveMargin.Merge(m, src) -} -func (m *MsgRemoveMargin) XXX_Size() int { - return m.Size() -} -func (m *MsgRemoveMargin) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRemoveMargin.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRemoveMargin proto.InternalMessageInfo - -func (m *MsgRemoveMargin) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgRemoveMargin) GetMargin() types.Coin { - if m != nil { - return m.Margin - } - return types.Coin{} -} - -type MsgRemoveMarginResponse struct { - // tokens transferred back to the trader - MarginOut types.Coin `protobuf:"bytes,1,opt,name=margin_out,json=marginOut,proto3" json:"margin_out"` - // the funding payment applied on this position interaction - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - // The resulting position - Position *Position `protobuf:"bytes,3,opt,name=position,proto3" json:"position,omitempty"` -} - -func (m *MsgRemoveMarginResponse) Reset() { *m = MsgRemoveMarginResponse{} } -func (m *MsgRemoveMarginResponse) String() string { return proto.CompactTextString(m) } -func (*MsgRemoveMarginResponse) ProtoMessage() {} -func (*MsgRemoveMarginResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{1} -} -func (m *MsgRemoveMarginResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRemoveMarginResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRemoveMarginResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRemoveMarginResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRemoveMarginResponse.Merge(m, src) -} -func (m *MsgRemoveMarginResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgRemoveMarginResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRemoveMarginResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRemoveMarginResponse proto.InternalMessageInfo - -func (m *MsgRemoveMarginResponse) GetMarginOut() types.Coin { - if m != nil { - return m.MarginOut - } - return types.Coin{} -} - -func (m *MsgRemoveMarginResponse) GetPosition() *Position { - if m != nil { - return m.Position - } - return nil -} - -// MsgAddMargin: Msg to remove margin. -type MsgAddMargin struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Margin types.Coin `protobuf:"bytes,3,opt,name=margin,proto3" json:"margin"` -} - -func (m *MsgAddMargin) Reset() { *m = MsgAddMargin{} } -func (m *MsgAddMargin) String() string { return proto.CompactTextString(m) } -func (*MsgAddMargin) ProtoMessage() {} -func (*MsgAddMargin) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{2} -} -func (m *MsgAddMargin) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAddMargin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAddMargin.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAddMargin) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAddMargin.Merge(m, src) -} -func (m *MsgAddMargin) XXX_Size() int { - return m.Size() -} -func (m *MsgAddMargin) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAddMargin.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAddMargin proto.InternalMessageInfo - -func (m *MsgAddMargin) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgAddMargin) GetMargin() types.Coin { - if m != nil { - return m.Margin - } - return types.Coin{} -} - -type MsgAddMarginResponse struct { - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - Position *Position `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` -} - -func (m *MsgAddMarginResponse) Reset() { *m = MsgAddMarginResponse{} } -func (m *MsgAddMarginResponse) String() string { return proto.CompactTextString(m) } -func (*MsgAddMarginResponse) ProtoMessage() {} -func (*MsgAddMarginResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{3} -} -func (m *MsgAddMarginResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgAddMarginResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgAddMarginResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgAddMarginResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgAddMarginResponse.Merge(m, src) -} -func (m *MsgAddMarginResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgAddMarginResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgAddMarginResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgAddMarginResponse proto.InternalMessageInfo - -func (m *MsgAddMarginResponse) GetPosition() *Position { - if m != nil { - return m.Position - } - return nil -} - -type MsgMultiLiquidate struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Liquidations []*MsgMultiLiquidate_Liquidation `protobuf:"bytes,2,rep,name=liquidations,proto3" json:"liquidations,omitempty"` -} - -func (m *MsgMultiLiquidate) Reset() { *m = MsgMultiLiquidate{} } -func (m *MsgMultiLiquidate) String() string { return proto.CompactTextString(m) } -func (*MsgMultiLiquidate) ProtoMessage() {} -func (*MsgMultiLiquidate) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{4} -} -func (m *MsgMultiLiquidate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMultiLiquidate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMultiLiquidate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMultiLiquidate) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMultiLiquidate.Merge(m, src) -} -func (m *MsgMultiLiquidate) XXX_Size() int { - return m.Size() -} -func (m *MsgMultiLiquidate) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMultiLiquidate.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMultiLiquidate proto.InternalMessageInfo - -func (m *MsgMultiLiquidate) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgMultiLiquidate) GetLiquidations() []*MsgMultiLiquidate_Liquidation { - if m != nil { - return m.Liquidations - } - return nil -} - -type MsgMultiLiquidate_Liquidation struct { - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,1,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Trader string `protobuf:"bytes,2,opt,name=trader,proto3" json:"trader,omitempty"` -} - -func (m *MsgMultiLiquidate_Liquidation) Reset() { *m = MsgMultiLiquidate_Liquidation{} } -func (m *MsgMultiLiquidate_Liquidation) String() string { return proto.CompactTextString(m) } -func (*MsgMultiLiquidate_Liquidation) ProtoMessage() {} -func (*MsgMultiLiquidate_Liquidation) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{4, 0} -} -func (m *MsgMultiLiquidate_Liquidation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMultiLiquidate_Liquidation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMultiLiquidate_Liquidation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMultiLiquidate_Liquidation) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMultiLiquidate_Liquidation.Merge(m, src) -} -func (m *MsgMultiLiquidate_Liquidation) XXX_Size() int { - return m.Size() -} -func (m *MsgMultiLiquidate_Liquidation) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMultiLiquidate_Liquidation.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMultiLiquidate_Liquidation proto.InternalMessageInfo - -func (m *MsgMultiLiquidate_Liquidation) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -type MsgMultiLiquidateResponse struct { - Liquidations []*MsgMultiLiquidateResponse_LiquidationResponse `protobuf:"bytes,1,rep,name=liquidations,proto3" json:"liquidations,omitempty"` -} - -func (m *MsgMultiLiquidateResponse) Reset() { *m = MsgMultiLiquidateResponse{} } -func (m *MsgMultiLiquidateResponse) String() string { return proto.CompactTextString(m) } -func (*MsgMultiLiquidateResponse) ProtoMessage() {} -func (*MsgMultiLiquidateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{5} -} -func (m *MsgMultiLiquidateResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMultiLiquidateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMultiLiquidateResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMultiLiquidateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMultiLiquidateResponse.Merge(m, src) -} -func (m *MsgMultiLiquidateResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgMultiLiquidateResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMultiLiquidateResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMultiLiquidateResponse proto.InternalMessageInfo - -func (m *MsgMultiLiquidateResponse) GetLiquidations() []*MsgMultiLiquidateResponse_LiquidationResponse { - if m != nil { - return m.Liquidations - } - return nil -} - -type MsgMultiLiquidateResponse_LiquidationResponse struct { - Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - LiquidatorFee *types.Coin `protobuf:"bytes,3,opt,name=liquidator_fee,json=liquidatorFee,proto3" json:"liquidator_fee,omitempty"` - PerpEfFee *types.Coin `protobuf:"bytes,4,opt,name=perp_ef_fee,json=perpEfFee,proto3" json:"perp_ef_fee,omitempty"` - Trader string `protobuf:"bytes,5,opt,name=trader,proto3" json:"trader,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,6,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) Reset() { - *m = MsgMultiLiquidateResponse_LiquidationResponse{} -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) String() string { - return proto.CompactTextString(m) -} -func (*MsgMultiLiquidateResponse_LiquidationResponse) ProtoMessage() {} -func (*MsgMultiLiquidateResponse_LiquidationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{5, 0} -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMultiLiquidateResponse_LiquidationResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMultiLiquidateResponse_LiquidationResponse.Merge(m, src) -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMultiLiquidateResponse_LiquidationResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMultiLiquidateResponse_LiquidationResponse proto.InternalMessageInfo - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) GetSuccess() bool { - if m != nil { - return m.Success - } - return false -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) GetError() string { - if m != nil { - return m.Error - } - return "" -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) GetLiquidatorFee() *types.Coin { - if m != nil { - return m.LiquidatorFee - } - return nil -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) GetPerpEfFee() *types.Coin { - if m != nil { - return m.PerpEfFee - } - return nil -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) GetTrader() string { - if m != nil { - return m.Trader - } - return "" -} - -type MsgMarketOrder struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Side Direction `protobuf:"varint,3,opt,name=side,proto3,enum=nibiru.perp.v2.Direction" json:"side,omitempty"` - QuoteAssetAmount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=quote_asset_amount,json=quoteAssetAmount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"quote_asset_amount"` - Leverage github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=leverage,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"leverage"` - BaseAssetAmountLimit github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,6,opt,name=base_asset_amount_limit,json=baseAssetAmountLimit,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"base_asset_amount_limit"` -} - -func (m *MsgMarketOrder) Reset() { *m = MsgMarketOrder{} } -func (m *MsgMarketOrder) String() string { return proto.CompactTextString(m) } -func (*MsgMarketOrder) ProtoMessage() {} -func (*MsgMarketOrder) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{6} -} -func (m *MsgMarketOrder) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMarketOrder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMarketOrder.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMarketOrder) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMarketOrder.Merge(m, src) -} -func (m *MsgMarketOrder) XXX_Size() int { - return m.Size() -} -func (m *MsgMarketOrder) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMarketOrder.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMarketOrder proto.InternalMessageInfo - -func (m *MsgMarketOrder) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgMarketOrder) GetSide() Direction { - if m != nil { - return m.Side - } - return Direction_DIRECTION_UNSPECIFIED -} - -type MsgMarketOrderResponse struct { - Position *Position `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` - // The amount of quote assets exchanged. - ExchangedNotionalValue github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exchanged_notional_value,json=exchangedNotionalValue,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_notional_value"` - // The amount of base assets exchanged. - ExchangedPositionSize github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=exchanged_position_size,json=exchangedPositionSize,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_position_size"` - // The funding payment applied on this position change, measured in quote - // units. - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - // The amount of PnL realized on this position changed, measured in quote - // units. - RealizedPnl github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=realized_pnl,json=realizedPnl,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"realized_pnl"` - // The unrealized PnL in the position after the position change, measured in - // quote units. - UnrealizedPnlAfter github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=unrealized_pnl_after,json=unrealizedPnlAfter,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"unrealized_pnl_after"` - // The amount of margin the trader has to give to the vault. - // A negative value means the vault pays the trader. - MarginToVault github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=margin_to_vault,json=marginToVault,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"margin_to_vault"` - // The position's notional value after the position change, measured in quote - // units. - PositionNotional github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,8,opt,name=position_notional,json=positionNotional,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"position_notional"` -} - -func (m *MsgMarketOrderResponse) Reset() { *m = MsgMarketOrderResponse{} } -func (m *MsgMarketOrderResponse) String() string { return proto.CompactTextString(m) } -func (*MsgMarketOrderResponse) ProtoMessage() {} -func (*MsgMarketOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{7} -} -func (m *MsgMarketOrderResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMarketOrderResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMarketOrderResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMarketOrderResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMarketOrderResponse.Merge(m, src) -} -func (m *MsgMarketOrderResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgMarketOrderResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMarketOrderResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMarketOrderResponse proto.InternalMessageInfo - -func (m *MsgMarketOrderResponse) GetPosition() *Position { - if m != nil { - return m.Position - } - return nil -} - -type MsgClosePosition struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` -} - -func (m *MsgClosePosition) Reset() { *m = MsgClosePosition{} } -func (m *MsgClosePosition) String() string { return proto.CompactTextString(m) } -func (*MsgClosePosition) ProtoMessage() {} -func (*MsgClosePosition) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{8} -} -func (m *MsgClosePosition) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgClosePosition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgClosePosition.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgClosePosition) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgClosePosition.Merge(m, src) -} -func (m *MsgClosePosition) XXX_Size() int { - return m.Size() -} -func (m *MsgClosePosition) XXX_DiscardUnknown() { - xxx_messageInfo_MsgClosePosition.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgClosePosition proto.InternalMessageInfo - -func (m *MsgClosePosition) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -type MsgClosePositionResponse struct { - // The amount of quote assets exchanged. - ExchangedNotionalValue github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=exchanged_notional_value,json=exchangedNotionalValue,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_notional_value"` - // The amount of base assets exchanged. - ExchangedPositionSize github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exchanged_position_size,json=exchangedPositionSize,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_position_size"` - // The funding payment applied on this position change, measured in quote - // units. - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - // The amount of PnL realized on this position changed, measured in quote - // units. - RealizedPnl github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=realized_pnl,json=realizedPnl,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"realized_pnl"` - // The amount of margin the trader receives after closing the position, from - // the vault. Should never be negative. - MarginToTrader github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=margin_to_trader,json=marginToTrader,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"margin_to_trader"` -} - -func (m *MsgClosePositionResponse) Reset() { *m = MsgClosePositionResponse{} } -func (m *MsgClosePositionResponse) String() string { return proto.CompactTextString(m) } -func (*MsgClosePositionResponse) ProtoMessage() {} -func (*MsgClosePositionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{9} -} -func (m *MsgClosePositionResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgClosePositionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgClosePositionResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgClosePositionResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgClosePositionResponse.Merge(m, src) -} -func (m *MsgClosePositionResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgClosePositionResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgClosePositionResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgClosePositionResponse proto.InternalMessageInfo - -type MsgPartialClose struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - Pair github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,2,opt,name=pair,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"pair"` - Size_ github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=size,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"size"` -} - -func (m *MsgPartialClose) Reset() { *m = MsgPartialClose{} } -func (m *MsgPartialClose) String() string { return proto.CompactTextString(m) } -func (*MsgPartialClose) ProtoMessage() {} -func (*MsgPartialClose) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{10} -} -func (m *MsgPartialClose) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgPartialClose) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgPartialClose.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgPartialClose) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgPartialClose.Merge(m, src) -} -func (m *MsgPartialClose) XXX_Size() int { - return m.Size() -} -func (m *MsgPartialClose) XXX_DiscardUnknown() { - xxx_messageInfo_MsgPartialClose.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgPartialClose proto.InternalMessageInfo - -func (m *MsgPartialClose) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -type MsgPartialCloseResponse struct { - // The amount of quote assets exchanged. - ExchangedNotionalValue github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=exchanged_notional_value,json=exchangedNotionalValue,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_notional_value"` - // The amount of base assets exchanged. - ExchangedPositionSize github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exchanged_position_size,json=exchangedPositionSize,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exchanged_position_size"` - // The funding payment applied on this position change, measured in quote - // units. - FundingPayment github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=funding_payment,json=fundingPayment,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"funding_payment"` - // The amount of PnL realized on this position changed, measured in quote - // units. - RealizedPnl github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=realized_pnl,json=realizedPnl,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"realized_pnl"` - // The amount of margin the trader receives after closing the position, from - // the vault. Should never be negative. - MarginToTrader github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=margin_to_trader,json=marginToTrader,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"margin_to_trader"` -} - -func (m *MsgPartialCloseResponse) Reset() { *m = MsgPartialCloseResponse{} } -func (m *MsgPartialCloseResponse) String() string { return proto.CompactTextString(m) } -func (*MsgPartialCloseResponse) ProtoMessage() {} -func (*MsgPartialCloseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{11} -} -func (m *MsgPartialCloseResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgPartialCloseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgPartialCloseResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgPartialCloseResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgPartialCloseResponse.Merge(m, src) -} -func (m *MsgPartialCloseResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgPartialCloseResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgPartialCloseResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgPartialCloseResponse proto.InternalMessageInfo - -type MsgDonateToEcosystemFund struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - // donation to the EF - Donation types.Coin `protobuf:"bytes,2,opt,name=donation,proto3" json:"donation" yaml:"donation"` -} - -func (m *MsgDonateToEcosystemFund) Reset() { *m = MsgDonateToEcosystemFund{} } -func (m *MsgDonateToEcosystemFund) String() string { return proto.CompactTextString(m) } -func (*MsgDonateToEcosystemFund) ProtoMessage() {} -func (*MsgDonateToEcosystemFund) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{12} -} -func (m *MsgDonateToEcosystemFund) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgDonateToEcosystemFund) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgDonateToEcosystemFund.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgDonateToEcosystemFund) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgDonateToEcosystemFund.Merge(m, src) -} -func (m *MsgDonateToEcosystemFund) XXX_Size() int { - return m.Size() -} -func (m *MsgDonateToEcosystemFund) XXX_DiscardUnknown() { - xxx_messageInfo_MsgDonateToEcosystemFund.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgDonateToEcosystemFund proto.InternalMessageInfo - -func (m *MsgDonateToEcosystemFund) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgDonateToEcosystemFund) GetDonation() types.Coin { - if m != nil { - return m.Donation - } - return types.Coin{} -} - -type MsgDonateToEcosystemFundResponse struct { -} - -func (m *MsgDonateToEcosystemFundResponse) Reset() { *m = MsgDonateToEcosystemFundResponse{} } -func (m *MsgDonateToEcosystemFundResponse) String() string { return proto.CompactTextString(m) } -func (*MsgDonateToEcosystemFundResponse) ProtoMessage() {} -func (*MsgDonateToEcosystemFundResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_b95cda40bf0a0f91, []int{13} -} -func (m *MsgDonateToEcosystemFundResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgDonateToEcosystemFundResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgDonateToEcosystemFundResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgDonateToEcosystemFundResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgDonateToEcosystemFundResponse.Merge(m, src) -} -func (m *MsgDonateToEcosystemFundResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgDonateToEcosystemFundResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgDonateToEcosystemFundResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgDonateToEcosystemFundResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*MsgRemoveMargin)(nil), "nibiru.perp.v2.MsgRemoveMargin") - proto.RegisterType((*MsgRemoveMarginResponse)(nil), "nibiru.perp.v2.MsgRemoveMarginResponse") - proto.RegisterType((*MsgAddMargin)(nil), "nibiru.perp.v2.MsgAddMargin") - proto.RegisterType((*MsgAddMarginResponse)(nil), "nibiru.perp.v2.MsgAddMarginResponse") - proto.RegisterType((*MsgMultiLiquidate)(nil), "nibiru.perp.v2.MsgMultiLiquidate") - proto.RegisterType((*MsgMultiLiquidate_Liquidation)(nil), "nibiru.perp.v2.MsgMultiLiquidate.Liquidation") - proto.RegisterType((*MsgMultiLiquidateResponse)(nil), "nibiru.perp.v2.MsgMultiLiquidateResponse") - proto.RegisterType((*MsgMultiLiquidateResponse_LiquidationResponse)(nil), "nibiru.perp.v2.MsgMultiLiquidateResponse.LiquidationResponse") - proto.RegisterType((*MsgMarketOrder)(nil), "nibiru.perp.v2.MsgMarketOrder") - proto.RegisterType((*MsgMarketOrderResponse)(nil), "nibiru.perp.v2.MsgMarketOrderResponse") - proto.RegisterType((*MsgClosePosition)(nil), "nibiru.perp.v2.MsgClosePosition") - proto.RegisterType((*MsgClosePositionResponse)(nil), "nibiru.perp.v2.MsgClosePositionResponse") - proto.RegisterType((*MsgPartialClose)(nil), "nibiru.perp.v2.MsgPartialClose") - proto.RegisterType((*MsgPartialCloseResponse)(nil), "nibiru.perp.v2.MsgPartialCloseResponse") - proto.RegisterType((*MsgDonateToEcosystemFund)(nil), "nibiru.perp.v2.MsgDonateToEcosystemFund") - proto.RegisterType((*MsgDonateToEcosystemFundResponse)(nil), "nibiru.perp.v2.MsgDonateToEcosystemFundResponse") -} - -func init() { proto.RegisterFile("nibiru/perp/v2/tx.proto", fileDescriptor_b95cda40bf0a0f91) } - -var fileDescriptor_b95cda40bf0a0f91 = []byte{ - // 1200 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0xcf, 0x6f, 0x1b, 0xc5, - 0x17, 0xf7, 0xda, 0x4e, 0x9a, 0x3c, 0xa7, 0x4e, 0x3a, 0xdf, 0x34, 0x71, 0xad, 0xca, 0xc9, 0x77, - 0x85, 0x4a, 0x38, 0x64, 0x97, 0x1a, 0x24, 0x04, 0x12, 0xa0, 0xa4, 0x3f, 0x10, 0xa8, 0x6e, 0xdd, - 0xa5, 0x6a, 0x51, 0x01, 0x6d, 0x27, 0xf6, 0x78, 0x33, 0xea, 0x7a, 0xc6, 0xdd, 0x99, 0xb5, 0x9a, - 0x1c, 0xf9, 0x0b, 0xf8, 0x17, 0x38, 0x70, 0x45, 0xe2, 0x00, 0x5c, 0xf8, 0x03, 0x7a, 0xec, 0x11, - 0x71, 0x88, 0x50, 0x72, 0xe1, 0x4a, 0xc5, 0x1f, 0x80, 0x66, 0x7f, 0x79, 0xed, 0x6e, 0x12, 0xc7, - 0xa4, 0x91, 0x40, 0x9c, 0xec, 0xdd, 0xf7, 0xde, 0xe7, 0xfd, 0xf8, 0xbc, 0x79, 0x33, 0xb3, 0xb0, - 0xcc, 0xe8, 0x16, 0xf5, 0x7c, 0xb3, 0x47, 0xbc, 0x9e, 0xd9, 0xaf, 0x9b, 0xf2, 0xa9, 0xd1, 0xf3, - 0xb8, 0xe4, 0xa8, 0x1c, 0x0a, 0x0c, 0x25, 0x30, 0xfa, 0xf5, 0xea, 0x65, 0x87, 0x73, 0xc7, 0x25, - 0x26, 0xee, 0x51, 0x13, 0x33, 0xc6, 0x25, 0x96, 0x94, 0x33, 0x11, 0x6a, 0x57, 0x6b, 0x2d, 0x2e, - 0xba, 0x5c, 0x98, 0x5b, 0x58, 0x10, 0xb3, 0x7f, 0x75, 0x8b, 0x48, 0x7c, 0xd5, 0x6c, 0x71, 0xca, - 0x22, 0xf9, 0xa2, 0xc3, 0x1d, 0x1e, 0xfc, 0x35, 0xd5, 0xbf, 0xe8, 0x6d, 0x75, 0xc4, 0xb9, 0x90, - 0x58, 0x92, 0x50, 0xa6, 0x7f, 0xaf, 0xc1, 0x7c, 0x43, 0x38, 0x16, 0xe9, 0xf2, 0x3e, 0x69, 0x60, - 0xcf, 0xa1, 0x0c, 0x2d, 0xc1, 0xb4, 0x20, 0xac, 0x4d, 0xbc, 0x8a, 0xb6, 0xaa, 0xad, 0xcd, 0x5a, - 0xd1, 0x13, 0x6a, 0x40, 0xb1, 0x87, 0xa9, 0x57, 0xc9, 0xab, 0xb7, 0x9b, 0xef, 0x3e, 0xdb, 0x5b, - 0xc9, 0xfd, 0xba, 0xb7, 0x72, 0xd5, 0xa1, 0x72, 0xdb, 0xdf, 0x32, 0x5a, 0xbc, 0x6b, 0xde, 0x0e, - 0x1c, 0x5d, 0xdb, 0xc6, 0x94, 0x99, 0x91, 0xd3, 0xa7, 0x66, 0x8b, 0x77, 0xbb, 0x9c, 0x99, 0x58, - 0x08, 0x22, 0x8d, 0x26, 0xa6, 0x9e, 0x15, 0xc0, 0xa0, 0x77, 0x60, 0xba, 0x1b, 0x38, 0xac, 0x14, - 0x56, 0xb5, 0xb5, 0x52, 0xfd, 0x92, 0x11, 0x66, 0x67, 0xa8, 0xec, 0x8c, 0x28, 0x3b, 0xe3, 0x1a, - 0xa7, 0x6c, 0xb3, 0xa8, 0x7c, 0x59, 0x91, 0xba, 0xfe, 0xbb, 0x06, 0xcb, 0x23, 0x31, 0x5b, 0x44, - 0xf4, 0x38, 0x13, 0x04, 0x7d, 0x00, 0x10, 0x6a, 0xd9, 0xdc, 0x97, 0x41, 0xfc, 0x63, 0x00, 0xcf, - 0x86, 0x26, 0x77, 0x7c, 0x89, 0x1e, 0xc0, 0x7c, 0xc7, 0x67, 0x6d, 0xca, 0x1c, 0xbb, 0x87, 0x77, - 0xba, 0x84, 0xc9, 0x28, 0x5d, 0x23, 0x4a, 0xf7, 0x4a, 0x2a, 0xdd, 0x88, 0x8d, 0xf0, 0x67, 0x5d, - 0xb4, 0x1f, 0x9b, 0x72, 0xa7, 0x47, 0x84, 0x71, 0x9d, 0xb4, 0xac, 0x72, 0x04, 0xd3, 0x0c, 0x51, - 0xd0, 0xdb, 0x30, 0xd3, 0xe3, 0x82, 0x2a, 0x36, 0xa3, 0x7c, 0x2b, 0xc6, 0x30, 0xf7, 0x46, 0x33, - 0x92, 0x5b, 0x89, 0xa6, 0xfe, 0x9d, 0x06, 0x73, 0x0d, 0xe1, 0x6c, 0xb4, 0xdb, 0xff, 0x10, 0x6e, - 0xbe, 0xd5, 0x60, 0x31, 0x1d, 0x70, 0x42, 0x4c, 0x46, 0x61, 0xb5, 0x53, 0x2f, 0x6c, 0x7e, 0xec, - 0xc2, 0xfe, 0xa9, 0xc1, 0x85, 0x86, 0x70, 0x1a, 0xbe, 0x2b, 0xe9, 0x2d, 0xfa, 0xc4, 0xa7, 0x6d, - 0x2c, 0xc9, 0xa1, 0xd5, 0xbd, 0x0b, 0x73, 0x6e, 0xa4, 0xa4, 0x56, 0x63, 0x25, 0xbf, 0x5a, 0x58, - 0x2b, 0xd5, 0xd7, 0x47, 0xfd, 0xbc, 0x04, 0x68, 0xdc, 0x1a, 0x58, 0x59, 0x43, 0x10, 0x55, 0x09, - 0xa5, 0x94, 0x30, 0xe1, 0x4f, 0x3b, 0x1d, 0xfe, 0x96, 0x60, 0x5a, 0x7a, 0x58, 0x25, 0x92, 0x0f, - 0x13, 0x09, 0x9f, 0xf4, 0x1f, 0x0b, 0x70, 0xe9, 0xa5, 0x28, 0x13, 0x8e, 0xf0, 0x48, 0x9a, 0x5a, - 0x90, 0xe6, 0xfb, 0xc7, 0xa6, 0x19, 0x03, 0x0c, 0xa5, 0x1b, 0xbd, 0x1b, 0x49, 0xfb, 0x87, 0x3c, - 0xfc, 0x2f, 0x43, 0x0b, 0x55, 0xe0, 0x9c, 0xf0, 0x5b, 0x2d, 0x22, 0x44, 0x50, 0x82, 0x19, 0x2b, - 0x7e, 0x44, 0x8b, 0x30, 0x45, 0x3c, 0x8f, 0xc7, 0x99, 0x84, 0x0f, 0xe8, 0x26, 0x94, 0x63, 0x5c, - 0xee, 0xd9, 0x1d, 0x42, 0xc6, 0x6b, 0x54, 0xcd, 0x3a, 0x3f, 0x30, 0xbb, 0x49, 0x08, 0xfa, 0x10, - 0x4a, 0x2a, 0x2d, 0x9b, 0x74, 0x02, 0x90, 0xe2, 0x78, 0x20, 0xb3, 0xca, 0xe6, 0x46, 0x47, 0x01, - 0x0c, 0x2a, 0x3d, 0x95, 0xae, 0x74, 0x42, 0xe8, 0xf4, 0xa9, 0x10, 0xaa, 0xff, 0x54, 0x80, 0xb2, - 0xaa, 0x3b, 0xf6, 0x1e, 0x13, 0x79, 0xc7, 0x53, 0x1e, 0xce, 0x68, 0x14, 0xac, 0x43, 0x51, 0xd0, - 0x76, 0x58, 0xdf, 0x72, 0xfd, 0xd2, 0x68, 0x33, 0x5c, 0xa7, 0x1e, 0x69, 0x05, 0x54, 0x06, 0x6a, - 0xe8, 0x0b, 0x40, 0x4f, 0x7c, 0x2e, 0x89, 0x1d, 0x00, 0xd9, 0xb8, 0xcb, 0x7d, 0x26, 0x83, 0xba, - 0x9e, 0x6c, 0xa9, 0x7f, 0xcc, 0xa4, 0xb5, 0x10, 0x20, 0x6d, 0x28, 0xa0, 0x8d, 0x00, 0x07, 0x7d, - 0x02, 0x33, 0x2e, 0xe9, 0x13, 0x0f, 0x3b, 0x24, 0xac, 0xf7, 0x89, 0xc7, 0x47, 0x62, 0x8f, 0x08, - 0x2c, 0x2b, 0x7e, 0x87, 0x02, 0xb5, 0x5d, 0xda, 0xa5, 0x32, 0x22, 0xed, 0xa4, 0xe1, 0x2e, 0x2a, - 0xb8, 0x54, 0xb4, 0xb7, 0x14, 0x96, 0x7e, 0x30, 0x05, 0x4b, 0xc3, 0xcc, 0x25, 0x4d, 0x9f, 0x1e, - 0x5d, 0xda, 0xb8, 0xa3, 0x0b, 0x6d, 0x43, 0x85, 0x3c, 0x6d, 0x6d, 0x63, 0xe6, 0x90, 0xb6, 0xcd, - 0xb8, 0x7a, 0x87, 0x5d, 0xbb, 0x8f, 0x5d, 0x9f, 0x4c, 0xb8, 0x57, 0x2d, 0x25, 0x78, 0xb7, 0x23, - 0xb8, 0xfb, 0x0a, 0x0d, 0x75, 0x60, 0x79, 0xe0, 0x29, 0xf6, 0x6f, 0x0b, 0xba, 0x1b, 0x76, 0xc3, - 0xc9, 0x1d, 0x5d, 0x4c, 0xe0, 0xe2, 0xbc, 0x3e, 0xa5, 0xbb, 0x99, 0x7b, 0x43, 0xf1, 0x54, 0xf6, - 0x86, 0xbb, 0x30, 0xe7, 0x11, 0xec, 0xd2, 0x5d, 0x15, 0x3f, 0x73, 0x27, 0x6c, 0x99, 0x52, 0x8c, - 0xd1, 0x64, 0x2e, 0x7a, 0x04, 0x8b, 0x3e, 0x4b, 0x83, 0xda, 0xb8, 0x23, 0x89, 0x37, 0x41, 0xcb, - 0x28, 0x68, 0x34, 0xc0, 0x6a, 0x32, 0x77, 0x43, 0x21, 0xa1, 0xfb, 0x30, 0x1f, 0x1d, 0x61, 0x24, - 0xb7, 0xfb, 0xd8, 0x77, 0x65, 0xe5, 0xdc, 0x44, 0xe0, 0xe7, 0x43, 0x98, 0x7b, 0xfc, 0xbe, 0x02, - 0x41, 0x9f, 0xc3, 0x85, 0x84, 0xc3, 0xb8, 0x6d, 0x2a, 0x33, 0x13, 0x21, 0x2f, 0xc4, 0x40, 0x71, - 0xbf, 0xe8, 0x3b, 0xb0, 0xd0, 0x10, 0xce, 0x35, 0x97, 0x0b, 0x12, 0x53, 0x7b, 0x46, 0x03, 0x4a, - 0x7f, 0x51, 0x80, 0xca, 0xa8, 0xef, 0x64, 0x89, 0x1d, 0xb5, 0x58, 0xb4, 0xb3, 0x5a, 0x2c, 0xf9, - 0x57, 0xbc, 0x58, 0x0a, 0xaf, 0x64, 0xb1, 0x14, 0xff, 0xfe, 0x62, 0xf9, 0x0c, 0x16, 0x06, 0xad, - 0x9c, 0xde, 0x26, 0x4f, 0x1e, 0x6c, 0xdc, 0xcb, 0xf7, 0xc2, 0x83, 0xcc, 0xcf, 0xe1, 0xbd, 0xa5, - 0x89, 0x3d, 0x49, 0xb1, 0x1b, 0x70, 0x7f, 0x56, 0x1b, 0xe2, 0xa6, 0xda, 0x10, 0x27, 0x1e, 0x81, - 0x81, 0xad, 0xfe, 0x47, 0x21, 0xb8, 0xc2, 0xa4, 0xc3, 0xff, 0xaf, 0x65, 0xff, 0xe5, 0x2d, 0xfb, - 0x95, 0x16, 0xcc, 0xa9, 0xeb, 0x9c, 0x61, 0x49, 0xee, 0xf1, 0x1b, 0x2d, 0x2e, 0x76, 0x84, 0x24, - 0xdd, 0x9b, 0x3e, 0x6b, 0x1f, 0xda, 0xbb, 0xb7, 0x61, 0xa6, 0xad, 0x0c, 0x06, 0xb7, 0x9b, 0x23, - 0x0e, 0xa7, 0xcb, 0x2a, 0xc2, 0x17, 0x7b, 0x2b, 0xf3, 0x3b, 0xb8, 0xeb, 0xbe, 0xa7, 0xc7, 0x86, - 0xba, 0x95, 0x60, 0xe8, 0x3a, 0xac, 0x1e, 0x16, 0x43, 0xdc, 0x80, 0xf5, 0x6f, 0xa6, 0xa0, 0xd0, - 0x10, 0x0e, 0x7a, 0x08, 0x73, 0x43, 0xdf, 0x05, 0x56, 0x32, 0x2e, 0x02, 0x69, 0x85, 0xea, 0xeb, - 0xc7, 0x28, 0xc4, 0x1e, 0xf4, 0x1c, 0xba, 0x0b, 0xb3, 0x83, 0x4b, 0xed, 0xe5, 0x0c, 0xbb, 0x44, - 0x5a, 0x7d, 0xed, 0x28, 0x69, 0x0a, 0xf2, 0x11, 0x94, 0x47, 0xae, 0x73, 0xff, 0x3f, 0xf6, 0xe6, - 0x52, 0x7d, 0x63, 0xec, 0xcb, 0x8d, 0x9e, 0x43, 0x0f, 0xa0, 0x94, 0x3e, 0x80, 0xd7, 0xb2, 0x6c, - 0x07, 0xf2, 0xea, 0x95, 0xa3, 0xe5, 0x29, 0xe0, 0x2f, 0xe1, 0xfc, 0xf0, 0xd6, 0xb9, 0x9a, 0x61, - 0x3a, 0xa4, 0x51, 0x5d, 0x3b, 0x4e, 0x23, 0x05, 0xff, 0x10, 0xe6, 0x86, 0x06, 0x65, 0x16, 0x91, - 0x69, 0x85, 0x4c, 0x22, 0xb3, 0x66, 0x95, 0x9e, 0x43, 0x3e, 0x5c, 0xcc, 0xee, 0xe8, 0xac, 0x00, - 0x33, 0x35, 0xab, 0x6f, 0x8e, 0xab, 0x39, 0x70, 0xbb, 0xf9, 0xd1, 0xb3, 0xfd, 0x9a, 0xf6, 0x7c, - 0xbf, 0xa6, 0xfd, 0xb6, 0x5f, 0xd3, 0xbe, 0x3e, 0xa8, 0xe5, 0x9e, 0x1f, 0xd4, 0x72, 0xbf, 0x1c, - 0xd4, 0x72, 0x0f, 0xd7, 0x8f, 0x9b, 0xeb, 0xc9, 0x37, 0x38, 0xb5, 0x52, 0xb7, 0xa6, 0x83, 0xef, - 0x60, 0x6f, 0xfd, 0x15, 0x00, 0x00, 0xff, 0xff, 0x1f, 0xd0, 0xb3, 0xf4, 0xa2, 0x13, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - RemoveMargin(ctx context.Context, in *MsgRemoveMargin, opts ...grpc.CallOption) (*MsgRemoveMarginResponse, error) - AddMargin(ctx context.Context, in *MsgAddMargin, opts ...grpc.CallOption) (*MsgAddMarginResponse, error) - MultiLiquidate(ctx context.Context, in *MsgMultiLiquidate, opts ...grpc.CallOption) (*MsgMultiLiquidateResponse, error) - MarketOrder(ctx context.Context, in *MsgMarketOrder, opts ...grpc.CallOption) (*MsgMarketOrderResponse, error) - ClosePosition(ctx context.Context, in *MsgClosePosition, opts ...grpc.CallOption) (*MsgClosePositionResponse, error) - PartialClose(ctx context.Context, in *MsgPartialClose, opts ...grpc.CallOption) (*MsgPartialCloseResponse, error) - DonateToEcosystemFund(ctx context.Context, in *MsgDonateToEcosystemFund, opts ...grpc.CallOption) (*MsgDonateToEcosystemFundResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) RemoveMargin(ctx context.Context, in *MsgRemoveMargin, opts ...grpc.CallOption) (*MsgRemoveMarginResponse, error) { - out := new(MsgRemoveMarginResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/RemoveMargin", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) AddMargin(ctx context.Context, in *MsgAddMargin, opts ...grpc.CallOption) (*MsgAddMarginResponse, error) { - out := new(MsgAddMarginResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/AddMargin", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) MultiLiquidate(ctx context.Context, in *MsgMultiLiquidate, opts ...grpc.CallOption) (*MsgMultiLiquidateResponse, error) { - out := new(MsgMultiLiquidateResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/MultiLiquidate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) MarketOrder(ctx context.Context, in *MsgMarketOrder, opts ...grpc.CallOption) (*MsgMarketOrderResponse, error) { - out := new(MsgMarketOrderResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/MarketOrder", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) ClosePosition(ctx context.Context, in *MsgClosePosition, opts ...grpc.CallOption) (*MsgClosePositionResponse, error) { - out := new(MsgClosePositionResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/ClosePosition", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) PartialClose(ctx context.Context, in *MsgPartialClose, opts ...grpc.CallOption) (*MsgPartialCloseResponse, error) { - out := new(MsgPartialCloseResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/PartialClose", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) DonateToEcosystemFund(ctx context.Context, in *MsgDonateToEcosystemFund, opts ...grpc.CallOption) (*MsgDonateToEcosystemFundResponse, error) { - out := new(MsgDonateToEcosystemFundResponse) - err := c.cc.Invoke(ctx, "/nibiru.perp.v2.Msg/DonateToEcosystemFund", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - RemoveMargin(context.Context, *MsgRemoveMargin) (*MsgRemoveMarginResponse, error) - AddMargin(context.Context, *MsgAddMargin) (*MsgAddMarginResponse, error) - MultiLiquidate(context.Context, *MsgMultiLiquidate) (*MsgMultiLiquidateResponse, error) - MarketOrder(context.Context, *MsgMarketOrder) (*MsgMarketOrderResponse, error) - ClosePosition(context.Context, *MsgClosePosition) (*MsgClosePositionResponse, error) - PartialClose(context.Context, *MsgPartialClose) (*MsgPartialCloseResponse, error) - DonateToEcosystemFund(context.Context, *MsgDonateToEcosystemFund) (*MsgDonateToEcosystemFundResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) RemoveMargin(ctx context.Context, req *MsgRemoveMargin) (*MsgRemoveMarginResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveMargin not implemented") -} -func (*UnimplementedMsgServer) AddMargin(ctx context.Context, req *MsgAddMargin) (*MsgAddMarginResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddMargin not implemented") -} -func (*UnimplementedMsgServer) MultiLiquidate(ctx context.Context, req *MsgMultiLiquidate) (*MsgMultiLiquidateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MultiLiquidate not implemented") -} -func (*UnimplementedMsgServer) MarketOrder(ctx context.Context, req *MsgMarketOrder) (*MsgMarketOrderResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MarketOrder not implemented") -} -func (*UnimplementedMsgServer) ClosePosition(ctx context.Context, req *MsgClosePosition) (*MsgClosePositionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ClosePosition not implemented") -} -func (*UnimplementedMsgServer) PartialClose(ctx context.Context, req *MsgPartialClose) (*MsgPartialCloseResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PartialClose not implemented") -} -func (*UnimplementedMsgServer) DonateToEcosystemFund(ctx context.Context, req *MsgDonateToEcosystemFund) (*MsgDonateToEcosystemFundResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method DonateToEcosystemFund not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_RemoveMargin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRemoveMargin) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).RemoveMargin(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/RemoveMargin", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).RemoveMargin(ctx, req.(*MsgRemoveMargin)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_AddMargin_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgAddMargin) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).AddMargin(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/AddMargin", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).AddMargin(ctx, req.(*MsgAddMargin)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_MultiLiquidate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgMultiLiquidate) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).MultiLiquidate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/MultiLiquidate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).MultiLiquidate(ctx, req.(*MsgMultiLiquidate)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_MarketOrder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgMarketOrder) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).MarketOrder(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/MarketOrder", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).MarketOrder(ctx, req.(*MsgMarketOrder)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_ClosePosition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgClosePosition) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).ClosePosition(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/ClosePosition", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).ClosePosition(ctx, req.(*MsgClosePosition)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_PartialClose_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgPartialClose) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).PartialClose(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/PartialClose", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).PartialClose(ctx, req.(*MsgPartialClose)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_DonateToEcosystemFund_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgDonateToEcosystemFund) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).DonateToEcosystemFund(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.perp.v2.Msg/DonateToEcosystemFund", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).DonateToEcosystemFund(ctx, req.(*MsgDonateToEcosystemFund)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.perp.v2.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "RemoveMargin", - Handler: _Msg_RemoveMargin_Handler, - }, - { - MethodName: "AddMargin", - Handler: _Msg_AddMargin_Handler, - }, - { - MethodName: "MultiLiquidate", - Handler: _Msg_MultiLiquidate_Handler, - }, - { - MethodName: "MarketOrder", - Handler: _Msg_MarketOrder_Handler, - }, - { - MethodName: "ClosePosition", - Handler: _Msg_ClosePosition_Handler, - }, - { - MethodName: "PartialClose", - Handler: _Msg_PartialClose_Handler, - }, - { - MethodName: "DonateToEcosystemFund", - Handler: _Msg_DonateToEcosystemFund_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/perp/v2/tx.proto", -} - -func (m *MsgRemoveMargin) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRemoveMargin) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRemoveMargin) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Margin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgRemoveMarginResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRemoveMarginResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRemoveMarginResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Position != nil { - { - size, err := m.Position.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.MarginOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgAddMargin) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAddMargin) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAddMargin) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Margin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgAddMarginResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgAddMarginResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgAddMarginResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Position != nil { - { - size, err := m.Position.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgMultiLiquidate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMultiLiquidate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMultiLiquidate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Liquidations) > 0 { - for iNdEx := len(m.Liquidations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Liquidations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgMultiLiquidate_Liquidation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMultiLiquidate_Liquidation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMultiLiquidate_Liquidation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintTx(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0x12 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgMultiLiquidateResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMultiLiquidateResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMultiLiquidateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Liquidations) > 0 { - for iNdEx := len(m.Liquidations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Liquidations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - if len(m.Trader) > 0 { - i -= len(m.Trader) - copy(dAtA[i:], m.Trader) - i = encodeVarintTx(dAtA, i, uint64(len(m.Trader))) - i-- - dAtA[i] = 0x2a - } - if m.PerpEfFee != nil { - { - size, err := m.PerpEfFee.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - if m.LiquidatorFee != nil { - { - size, err := m.LiquidatorFee.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintTx(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x12 - } - if m.Success { - i-- - if m.Success { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MsgMarketOrder) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMarketOrder) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMarketOrder) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.BaseAssetAmountLimit.Size() - i -= size - if _, err := m.BaseAssetAmountLimit.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.Leverage.Size() - i -= size - if _, err := m.Leverage.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.QuoteAssetAmount.Size() - i -= size - if _, err := m.QuoteAssetAmount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if m.Side != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.Side)) - i-- - dAtA[i] = 0x18 - } - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgMarketOrderResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMarketOrderResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMarketOrderResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.PositionNotional.Size() - i -= size - if _, err := m.PositionNotional.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - { - size := m.MarginToVault.Size() - i -= size - if _, err := m.MarginToVault.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size := m.UnrealizedPnlAfter.Size() - i -= size - if _, err := m.UnrealizedPnlAfter.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.RealizedPnl.Size() - i -= size - if _, err := m.RealizedPnl.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.ExchangedPositionSize.Size() - i -= size - if _, err := m.ExchangedPositionSize.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.ExchangedNotionalValue.Size() - i -= size - if _, err := m.ExchangedNotionalValue.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.Position != nil { - { - size, err := m.Position.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgClosePosition) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgClosePosition) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgClosePosition) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgClosePositionResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgClosePositionResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgClosePositionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MarginToTrader.Size() - i -= size - if _, err := m.MarginToTrader.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.RealizedPnl.Size() - i -= size - if _, err := m.RealizedPnl.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.ExchangedPositionSize.Size() - i -= size - if _, err := m.ExchangedPositionSize.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.ExchangedNotionalValue.Size() - i -= size - if _, err := m.ExchangedNotionalValue.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgPartialClose) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgPartialClose) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgPartialClose) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Size_.Size() - i -= size - if _, err := m.Size_.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.Pair.Size() - i -= size - if _, err := m.Pair.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgPartialCloseResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgPartialCloseResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgPartialCloseResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.MarginToTrader.Size() - i -= size - if _, err := m.MarginToTrader.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size := m.RealizedPnl.Size() - i -= size - if _, err := m.RealizedPnl.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size := m.FundingPayment.Size() - i -= size - if _, err := m.FundingPayment.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.ExchangedPositionSize.Size() - i -= size - if _, err := m.ExchangedPositionSize.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.ExchangedNotionalValue.Size() - i -= size - if _, err := m.ExchangedNotionalValue.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgDonateToEcosystemFund) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgDonateToEcosystemFund) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgDonateToEcosystemFund) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Donation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgDonateToEcosystemFundResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgDonateToEcosystemFundResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgDonateToEcosystemFundResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgRemoveMargin) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Margin.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgRemoveMarginResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.MarginOut.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.FundingPayment.Size() - n += 1 + l + sovTx(uint64(l)) - if m.Position != nil { - l = m.Position.Size() - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgAddMargin) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Margin.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgAddMarginResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.FundingPayment.Size() - n += 1 + l + sovTx(uint64(l)) - if m.Position != nil { - l = m.Position.Size() - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgMultiLiquidate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if len(m.Liquidations) > 0 { - for _, e := range m.Liquidations { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgMultiLiquidate_Liquidation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgMultiLiquidateResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Liquidations) > 0 { - for _, e := range m.Liquidations { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgMultiLiquidateResponse_LiquidationResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Success { - n += 2 - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.LiquidatorFee != nil { - l = m.LiquidatorFee.Size() - n += 1 + l + sovTx(uint64(l)) - } - if m.PerpEfFee != nil { - l = m.PerpEfFee.Size() - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.Trader) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgMarketOrder) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - if m.Side != 0 { - n += 1 + sovTx(uint64(m.Side)) - } - l = m.QuoteAssetAmount.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Leverage.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.BaseAssetAmountLimit.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgMarketOrderResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Position != nil { - l = m.Position.Size() - n += 1 + l + sovTx(uint64(l)) - } - l = m.ExchangedNotionalValue.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.ExchangedPositionSize.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.FundingPayment.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.RealizedPnl.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.UnrealizedPnlAfter.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.MarginToVault.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.PositionNotional.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgClosePosition) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgClosePositionResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ExchangedNotionalValue.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.ExchangedPositionSize.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.FundingPayment.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.RealizedPnl.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.MarginToTrader.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgPartialClose) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Pair.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Size_.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgPartialCloseResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ExchangedNotionalValue.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.ExchangedPositionSize.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.FundingPayment.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.RealizedPnl.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.MarginToTrader.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgDonateToEcosystemFund) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Donation.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgDonateToEcosystemFundResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgRemoveMargin) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRemoveMargin: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRemoveMargin: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Margin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Margin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgRemoveMarginResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRemoveMarginResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRemoveMarginResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Position", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Position == nil { - m.Position = &Position{} - } - if err := m.Position.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgAddMargin) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAddMargin: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAddMargin: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Margin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Margin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgAddMarginResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgAddMarginResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgAddMarginResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Position", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Position == nil { - m.Position = &Position{} - } - if err := m.Position.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMultiLiquidate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMultiLiquidate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMultiLiquidate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Liquidations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Liquidations = append(m.Liquidations, &MsgMultiLiquidate_Liquidation{}) - if err := m.Liquidations[len(m.Liquidations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMultiLiquidate_Liquidation) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Liquidation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Liquidation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMultiLiquidateResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMultiLiquidateResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMultiLiquidateResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Liquidations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Liquidations = append(m.Liquidations, &MsgMultiLiquidateResponse_LiquidationResponse{}) - if err := m.Liquidations[len(m.Liquidations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMultiLiquidateResponse_LiquidationResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LiquidationResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LiquidationResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Success", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Success = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LiquidatorFee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.LiquidatorFee == nil { - m.LiquidatorFee = &types.Coin{} - } - if err := m.LiquidatorFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PerpEfFee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PerpEfFee == nil { - m.PerpEfFee = &types.Coin{} - } - if err := m.PerpEfFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Trader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Trader = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMarketOrder) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMarketOrder: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMarketOrder: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Side", wireType) - } - m.Side = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Side |= Direction(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field QuoteAssetAmount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.QuoteAssetAmount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Leverage", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Leverage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BaseAssetAmountLimit", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.BaseAssetAmountLimit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMarketOrderResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMarketOrderResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMarketOrderResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Position", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Position == nil { - m.Position = &Position{} - } - if err := m.Position.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedNotionalValue", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedNotionalValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedPositionSize", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedPositionSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RealizedPnl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RealizedPnl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UnrealizedPnlAfter", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UnrealizedPnlAfter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginToVault", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginToVault.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PositionNotional", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PositionNotional.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgClosePosition) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgClosePosition: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgClosePosition: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgClosePositionResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgClosePositionResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgClosePositionResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedNotionalValue", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedNotionalValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedPositionSize", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedPositionSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RealizedPnl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RealizedPnl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginToTrader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginToTrader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgPartialClose) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgPartialClose: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgPartialClose: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pair", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Pair.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Size_", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Size_.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgPartialCloseResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgPartialCloseResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgPartialCloseResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedNotionalValue", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedNotionalValue.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExchangedPositionSize", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExchangedPositionSize.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FundingPayment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FundingPayment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RealizedPnl", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.RealizedPnl.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MarginToTrader", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.MarginToTrader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgDonateToEcosystemFund) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgDonateToEcosystemFund: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDonateToEcosystemFund: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Donation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Donation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgDonateToEcosystemFundResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgDonateToEcosystemFundResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDonateToEcosystemFundResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/client/testutil/cli_test.go b/x/spot/client/testutil/cli_test.go index e38cf894c..a642f1182 100644 --- a/x/spot/client/testutil/cli_test.go +++ b/x/spot/client/testutil/cli_test.go @@ -25,7 +25,7 @@ func TestIntegrationTestSuite(t *testing.T) { } app.SetPrefixes(app.AccountAddressPrefix) - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfigAndRegister()) + genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) genesisState = WhitelistGenesisAssets( genesisState, diff --git a/x/spot/client/testutil/test_helpers.go b/x/spot/client/testutil/test_helpers.go index 33c003c22..af093b723 100644 --- a/x/spot/client/testutil/test_helpers.go +++ b/x/spot/client/testutil/test_helpers.go @@ -141,7 +141,7 @@ func ExecMsgSwapAssets( // WhitelistGenesisAssets given a testapp.GenesisState includes the whitelisted assets into spot Whitelisted assets. func WhitelistGenesisAssets(state app.GenesisState, assets []string) app.GenesisState { - encConfig := app.MakeEncodingConfigAndRegister() + encConfig := app.MakeEncodingConfig() jsonState := state[types.ModuleName] diff --git a/x/sudo/cli/cli_test.go b/x/sudo/cli/cli_test.go index 88893d13b..4b365575c 100644 --- a/x/sudo/cli/cli_test.go +++ b/x/sudo/cli/cli_test.go @@ -103,7 +103,7 @@ func TestSuite_IntegrationSuite_RunAll(t *testing.T) { func (s *IntegrationSuite) SetupSuite() { app.SetPrefixes(app.AccountAddressPrefix) - genState := genesis.NewTestGenesisState(app.MakeEncodingConfigAndRegister()) + genState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) genState, rootPrivKey, rootAddr := genesis.AddSudoGenesis(genState) s.root = Account{ privKey: rootPrivKey, @@ -261,7 +261,7 @@ func (s *IntegrationSuite) TestMarshal_EditSudoers() { fileJsonBz, _ := msgPlus.ToJson(t) t.Log("check unmarshal file → proto") - cdc := genesis.TEST_ENCODING_CONFIG.Marshaler + cdc := app.MakeEncodingConfig().Marshaler newMsg := new(types.MsgEditSudoers) err := cdc.UnmarshalJSON(fileJsonBz, newMsg) assert.NoErrorf(t, err, "fileJsonBz: #%v", fileJsonBz) diff --git a/x/sudo/keeper/msg_server_test.go b/x/sudo/keeper/msg_server_test.go index 832473d7a..c3ed126cf 100644 --- a/x/sudo/keeper/msg_server_test.go +++ b/x/sudo/keeper/msg_server_test.go @@ -14,7 +14,6 @@ import ( "github.com/stretchr/testify/require" "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/app/codec" "github.com/NibiruChain/nibiru/x/common/set" "github.com/NibiruChain/nibiru/x/common/testutil" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" @@ -26,7 +25,7 @@ func init() { } func setup() (*app.NibiruApp, sdk.Context) { - genState := app.NewDefaultGenesisState(codec.DefaultEncoding().Marshaler) + genState := app.NewDefaultGenesisState(app.MakeEncodingConfig().Marshaler) nibiru := testapp.NewNibiruTestApp(genState) ctx := nibiru.NewContext(false, tmproto.Header{ Height: 1, diff --git a/x/tokenfactory/cli/cli_test.go b/x/tokenfactory/cli/cli_test.go index 45d8a70dc..c7b90b03b 100644 --- a/x/tokenfactory/cli/cli_test.go +++ b/x/tokenfactory/cli/cli_test.go @@ -51,7 +51,7 @@ func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") testapp.EnsureNibiruPrefix() - encodingConfig := app.MakeEncodingConfigAndRegister() + encodingConfig := app.MakeEncodingConfig() genState := genesis.NewTestGenesisState(encodingConfig) cfg := testutilcli.BuildNetworkConfig(genState) cfg.NumValidators = 1 From 011f1ed431d92899d01583e5e6110e663eceaa24 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:20:18 -0500 Subject: [PATCH 02/99] chore(perp): remove perp protos --- proto/nibiru/perp/v2/event.proto | 236 ---------------------- proto/nibiru/perp/v2/genesis.proto | 84 -------- proto/nibiru/perp/v2/query.proto | 130 ------------ proto/nibiru/perp/v2/state.proto | 229 --------------------- proto/nibiru/perp/v2/tx.proto | 313 ----------------------------- 5 files changed, 992 deletions(-) delete mode 100644 proto/nibiru/perp/v2/event.proto delete mode 100644 proto/nibiru/perp/v2/genesis.proto delete mode 100644 proto/nibiru/perp/v2/query.proto delete mode 100644 proto/nibiru/perp/v2/state.proto delete mode 100644 proto/nibiru/perp/v2/tx.proto diff --git a/proto/nibiru/perp/v2/event.proto b/proto/nibiru/perp/v2/event.proto deleted file mode 100644 index f8a6b7a04..000000000 --- a/proto/nibiru/perp/v2/event.proto +++ /dev/null @@ -1,236 +0,0 @@ -syntax = "proto3"; - -package nibiru.perp.v2; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "nibiru/perp/v2/state.proto"; -import "google/protobuf/timestamp.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/perp/v2/types"; - -// Emitted when a position changes. -message PositionChangedEvent { - nibiru.perp.v2.Position final_position = 1 [ (gogoproto.nullable) = false ]; - - // Position notional (in quote units) after the change. In general, - // 'notional = baseAmount * priceQuotePerBase', where size is the baseAmount. - string position_notional = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // Transaction fee paid. A "taker" fee. - cosmos.base.v1beta1.Coin transaction_fee = 3 [ - (gogoproto.moretags) = "yaml:\"transaction_fee\"", - (gogoproto.nullable) = false - ]; - - // realize profits and losses after the change - string realized_pnl = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // Amount of bad debt cleared by the PerpEF during the change. - // Bad debt is negative net margin past the liquidation point of a position. - cosmos.base.v1beta1.Coin bad_debt = 5 [ (gogoproto.nullable) = false ]; - - /* A funding payment made or received by the trader on the current position. - 'fundingPayment' is positive if 'owner' is the sender and negative if 'owner' - is the receiver of the payment. Its magnitude is abs(size * fundingRate). - Funding payments act to converge the mark price and index price - (average price on major exchanges). - */ - string funding_payment = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The block number at which this position was changed. - int64 block_height = 7; - - // margin_to_user is the amount of collateral received by the trader during - // the position change. A positve value indicates that the trader received - // funds, while a negative value indicates that the trader spent funds. - string margin_to_user = 8 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; - - // change_reason describes the reason for why the position resulted in a - // change. Change type can take the following values: - // - // - CHANGE_REASON_UNSPECIFIED: Unspecified change reason. - // - CHANGE_REASON_ADD_MARGIN: Margin was added to the position. - // - CHANGE_REASON_REMOVE_MARGIN: Margin was removed from the position. - // - CHANGE_REASON_OPEN_POSITION: A new position was opened. - // - CHANGE_REASON_CLOSE_POSITION: An existing position was closed. - string change_reason = 9 - [ (gogoproto.customtype) = "ChangeReason", (gogoproto.nullable) = false ]; - - // exchanged_size represent the change in size for an existing position - // after the change. A positive value indicates that the position size - // increased, while a negative value indicates that the position size - // decreased. - string exchanged_size = 10 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // exchanged_notional represent the change in notional for an existing - // position after the change. A positive value indicates that the position - // notional increased, while a negative value indicates that the position - // notional decreased. - string exchanged_notional = 11 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// Emitted when a position is liquidated. Wraps a PositionChanged event since a -// liquidation causes position changes. -message PositionLiquidatedEvent { - nibiru.perp.v2.PositionChangedEvent position_changed_event = 1 - [ (gogoproto.nullable) = false ]; - - // Address of the account that executed the tx. - string liquidator_address = 2; - - // Commission (in margin units) received by 'liquidator'. - cosmos.base.v1beta1.Coin fee_to_liquidator = 3 [ - (gogoproto.moretags) = "yaml:\"fee_to_liquidator\"", - (gogoproto.nullable) = false - ]; - - // Commission (in margin units) given to the ecosystem fund. - cosmos.base.v1beta1.Coin fee_to_ecosystem_fund = 4 [ - (gogoproto.moretags) = "yaml:\"fee_to_ecosystem_fund\"", - (gogoproto.nullable) = false - ]; -} - -// Emitted when a position is settled. -message PositionSettledEvent { - // Identifier for the virtual pool of the position. - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // Owner of the position. - string trader_address = 2; - - // Settled coin as dictated by the settlement price of the perp.amm. - repeated cosmos.base.v1beta1.Coin settled_coins = 3 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"settled_coins\"", - (gogoproto.nullable) = false - ]; -} - -// Emitted when the funding rate changes for a market. -message FundingRateChangedEvent { - // The pair for which the funding rate was calculated. - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // The mark price of the pair. - string mark_price_twap = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The oracle index price of the pair. - string index_price_twap = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The latest premium fraction just calculated. - string premium_fraction = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The market's latest cumulative premium fraction. - // The funding payment a position will pay is the difference between this - // value and the latest cumulative premium fraction on the position, - // multiplied by the position size. - string cumulative_premium_fraction = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// Emitted when liquidation fails. -message LiquidationFailedEvent { - // The pair for which we are trying to liquidate. - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // owner of the position. - string trader = 2; - - // Address of the account that executed the tx. - string liquidator = 3; - - enum LiquidationFailedReason { - UNSPECIFIED = 0; - - // the position is healthy and does not need to be liquidated. - POSITION_HEALTHY = 1; - - // the pair does not exist. - NONEXISTENT_PAIR = 2; - - // the position does not exist. - NONEXISTENT_POSITION = 3; - } - // Reason for the liquidation failure. - LiquidationFailedReason reason = 4; -} - -// This event is emitted when the amm is updated, which can be triggered by -// the following events: -// -// - swap -// - edit price multiplier -// - edit depth -message AmmUpdatedEvent { - // the final state of the AMM - nibiru.perp.v2.AMM final_amm = 1 [ (gogoproto.nullable) = false ]; - - // The mark price of the pair. - string mark_price_twap = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The oracle index price of the pair. - string index_price_twap = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// This event is emitted at the end of every block for persisting market changes -// off-chain -// -// Market changes are triggered by the following actions: -// -// - disabling market -// - changing market fees -// - bad debt is prepaid by the ecosystem fund -message MarketUpdatedEvent { - // the final state of the market - nibiru.perp.v2.Market final_market = 1 [ (gogoproto.nullable) = false ]; -} diff --git a/proto/nibiru/perp/v2/genesis.proto b/proto/nibiru/perp/v2/genesis.proto deleted file mode 100644 index 66ca0a8a8..000000000 --- a/proto/nibiru/perp/v2/genesis.proto +++ /dev/null @@ -1,84 +0,0 @@ -syntax = "proto3"; - -package nibiru.perp.v2; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "nibiru/perp/v2/state.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/perp/v2/types"; - -// GenesisState defines the perp module's genesis state. -// Thge genesis state is used not only to start the network but also useful for -// exporting and importing state during network upgrades. -message GenesisState { - repeated nibiru.perp.v2.Market markets = 2 [ (gogoproto.nullable) = false ]; - - repeated nibiru.perp.v2.AMM amms = 3 [ (gogoproto.nullable) = false ]; - - repeated GenesisPosition positions = 4 [ (gogoproto.nullable) = false ]; - - repeated nibiru.perp.v2.ReserveSnapshot reserve_snapshots = 5 - [ (gogoproto.nullable) = false ]; - - uint64 dnr_epoch = 6; - - message TraderVolume { - string trader = 1; - uint64 epoch = 2; - string volume = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; - } - - repeated TraderVolume trader_volumes = 7 [ (gogoproto.nullable) = false ]; - - message Discount { - string fee = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - string volume = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; - } - - repeated Discount global_discount = 8 [ (gogoproto.nullable) = false ]; - - repeated CustomDiscount custom_discounts = 9 [ (gogoproto.nullable) = false ]; - - message CustomDiscount { - string trader = 1; - Discount discount = 2; - } - - repeated nibiru.perp.v2.GenesisMarketLastVersion market_last_versions = 10 - [ (gogoproto.nullable) = false ]; -} - -// GenesisMarketLastVersion is the last version including pair only used for -// genesis -message GenesisMarketLastVersion { - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - uint64 version = 2; -} - -message GenesisPosition { - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - uint64 version = 2; - - Position position = 3 [ (gogoproto.nullable) = false ]; -} \ No newline at end of file diff --git a/proto/nibiru/perp/v2/query.proto b/proto/nibiru/perp/v2/query.proto deleted file mode 100644 index bb69dacdb..000000000 --- a/proto/nibiru/perp/v2/query.proto +++ /dev/null @@ -1,130 +0,0 @@ -syntax = "proto3"; - -package nibiru.perp.v2; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "nibiru/perp/v2/state.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/perp/v2/types"; - -// Query defines the gRPC querier service. -service Query { - rpc QueryPosition(QueryPositionRequest) returns (QueryPositionResponse) { - option (google.api.http).get = "/nibiru/perp/v2/position"; - } - - rpc QueryPositions(QueryPositionsRequest) returns (QueryPositionsResponse) { - option (google.api.http).get = "/nibiru/perp/v2/positions"; - } - - // QueryPositionStore queries all of the positions in the KV store. - rpc QueryPositionStore(QueryPositionStoreRequest) - returns (QueryPositionStoreResponse) { - option (google.api.http).get = "/nibiru/perp/v2/position_store"; - } - - // Queries the reserve assets in a given pool, identified by a token pair. - rpc ModuleAccounts(QueryModuleAccountsRequest) - returns (QueryModuleAccountsResponse) { - option (google.api.http).get = "/nibiru/perp/v2/module_accounts"; - } - - rpc QueryMarkets(QueryMarketsRequest) returns (QueryMarketsResponse) { - option (google.api.http).get = "/nibiru/perp/v2/markets"; - } -} - -// ---------------------------------------- Positions - -message QueryPositionsRequest { string trader = 1; } - -message QueryPositionsResponse { - repeated nibiru.perp.v2.QueryPositionResponse positions = 1 - [ (gogoproto.nullable) = false ]; -} - -message QueryPositionStoreRequest { - // pagination defines a paginated request - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} - -message QueryPositionStoreResponse { - // Position responses: collection of all stored positions (with pagination) - repeated nibiru.perp.v2.Position positions = 1 - [ (gogoproto.nullable) = false ]; - - // pagination defines a paginated response - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -// ---------------------------------------- Position - -// QueryPositionRequest is the request type for the position of the x/perp -// module account. -message QueryPositionRequest { - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - string trader = 2; -} - -message QueryPositionResponse { - // The position as it exists in the blockchain state - nibiru.perp.v2.Position position = 1 [ (gogoproto.nullable) = false ]; - - // The position's current notional value, if it were to be entirely closed (in - // margin units). - string position_notional = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The position's unrealized PnL. - string unrealized_pnl = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // margin ratio of the position based on the spot price - string margin_ratio = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// ---------------------------------------- QueryModuleAccounts - -message QueryModuleAccountsRequest {} - -message QueryModuleAccountsResponse { - repeated nibiru.perp.v2.AccountWithBalance accounts = 1 - [ (gogoproto.nullable) = false ]; -} - -message AccountWithBalance { - string name = 1; - string address = 2; - - repeated cosmos.base.v1beta1.Coin balance = 3 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins" - ]; -} - -message AmmMarket { - nibiru.perp.v2.Market market = 1 [ (gogoproto.nullable) = false ]; - nibiru.perp.v2.AMM amm = 2 [ (gogoproto.nullable) = false ]; -} - -message QueryMarketsRequest { bool versioned = 1; } - -message QueryMarketsResponse { - repeated nibiru.perp.v2.AmmMarket amm_markets = 1 - [ (gogoproto.nullable) = false ]; -} diff --git a/proto/nibiru/perp/v2/state.proto b/proto/nibiru/perp/v2/state.proto deleted file mode 100644 index 364a685a9..000000000 --- a/proto/nibiru/perp/v2/state.proto +++ /dev/null @@ -1,229 +0,0 @@ -syntax = "proto3"; - -package nibiru.perp.v2; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos_proto/cosmos.proto"; -import "google/protobuf/duration.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/perp/v2/types"; - -// The direction that the user is trading in -// LONG means the user is going long the base asset (e.g. buy BTC) -// SHORT means the user is shorting the base asset (e.g. sell BTC) -enum Direction { - DIRECTION_UNSPECIFIED = 0; - LONG = 1; - SHORT = 2; -} - -// Enumerates different options of calculating twap. -enum TwapCalcOption { - TWAP_CALC_OPTION_UNSPECIFIED = 0; - - // Spot price from quote asset reserve / base asset reserve - SPOT = 1; - - // Swapping with quote assets, output denominated in base assets - QUOTE_ASSET_SWAP = 2; - - // Swapping with base assets, output denominated in quote assets - BASE_ASSET_SWAP = 3; -} - -message Market { - // the trading pair represented by this market - // always BASE:QUOTE, e.g. BTC:NUSD or ETH:NUSD - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // whether or not the market is enabled - bool enabled = 2; - - // the version of the Market, only one market can exist per pair, when one is closed it cannot be reactivated, - // so a new market must be created, this is the version of the market - uint64 version = 14; - - // the minimum margin ratio which a user must maintain on this market - string maintenance_margin_ratio = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the maximum leverage a user is able to be taken on this market - string max_leverage = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // Latest cumulative premium fraction for a given pair. - // Calculated once per funding rate interval. - // A premium fraction is the difference between mark and index, divided by the - // number of payments per day. (mark - index) / # payments in a day - string latest_cumulative_premium_fraction = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the percentage of the notional given to the exchange when trading - string exchange_fee_ratio = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the percentage of the notional transferred to the ecosystem fund when - // trading - string ecosystem_fund_fee_ratio = 7 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the percentage of liquidated position that will be - // given to out as a reward. Half of the liquidation fee is given to the - // liquidator, and the other half is given to the ecosystem fund. - string liquidation_fee_ratio = 8 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the portion of the position size we try to liquidate if the available - // margin is higher than liquidation fee - string partial_liquidation_ratio = 9 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // specifies the interval on which the funding rate is updated - string funding_rate_epoch_id = 10; - - // amount of time to look back for TWAP calculations - google.protobuf.Duration twap_lookback_window = 11 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; - - // the amount of collateral already credited from the ecosystem fund - cosmos.base.v1beta1.Coin prepaid_bad_debt = 12 - [ (gogoproto.nullable) = false ]; - - // the maximum funding rate payment per epoch, this represents the maximum - // amount of funding that can be paid out per epoch as a percentage of the - // position size - string max_funding_rate = 13 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.stdduration) = true, - (gogoproto.nullable) = false - ]; -} - -// MarketLastVersion is used to store the last version of the market -message MarketLastVersion { - // version of the market - uint64 version = 1; -} - -message AMM { - // identifies the market this AMM belongs to - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // the version of the AMM, only one AMM can exist per pair, when one is closed it cannot be reactivated, - // so a new AMM must be created, this is the version of the AMM - uint64 version = 8; - - // the amount of base reserves this AMM has - string base_reserve = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the amount of quote reserves this AMM has - string quote_reserve = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // sqrt(k) - string sqrt_depth = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // the price multiplier of the dynamic AMM - string price_multiplier = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // Total long refers to the sum of long open notional in base. - string total_long = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // Total short refers to the sum of short open notional in base. - string total_short = 7 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The settlement price if the AMM is settled. - string settlement_price = 9 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.stdduration) = true, - (gogoproto.nullable) = false - ]; -} - -message Position { - // address identifies the address owner of this position - string trader_address = 1; - - // pair identifies the pair associated with this position - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - // the position size - string size = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // amount of margin remaining in the position - string margin = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // value of position in quote assets when opened - string open_notional = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The most recent cumulative premium fraction this position has. - // Used to calculate the next funding payment. - string latest_cumulative_premium_fraction = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // last block number this position was updated - int64 last_updated_block_number = 7; -} - -// a snapshot of the perp.amm's reserves at a given point in time -message ReserveSnapshot { - AMM amm = 1 [ (gogoproto.nullable) = false ]; - - // milliseconds since unix epoch - int64 timestamp_ms = 2; -} diff --git a/proto/nibiru/perp/v2/tx.proto b/proto/nibiru/perp/v2/tx.proto deleted file mode 100644 index 29bf3a6a2..000000000 --- a/proto/nibiru/perp/v2/tx.proto +++ /dev/null @@ -1,313 +0,0 @@ -syntax = "proto3"; - -package nibiru.perp.v2; - -import "google/api/annotations.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "gogoproto/gogo.proto"; -import "nibiru/perp/v2/state.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/perp/v2/types"; - -// Msg defines the x/perp Msg service. -service Msg { - - rpc RemoveMargin(MsgRemoveMargin) returns (MsgRemoveMarginResponse) {} - - rpc AddMargin(MsgAddMargin) returns (MsgAddMarginResponse) {} - - rpc MultiLiquidate(MsgMultiLiquidate) returns (MsgMultiLiquidateResponse) {} - - rpc MarketOrder(MsgMarketOrder) returns (MsgMarketOrderResponse) {} - - rpc ClosePosition(MsgClosePosition) returns (MsgClosePositionResponse) {} - - rpc PartialClose(MsgPartialClose) returns (MsgPartialCloseResponse) {} - - rpc DonateToEcosystemFund(MsgDonateToEcosystemFund) - returns (MsgDonateToEcosystemFundResponse) {} -} - -// -------------------------- RemoveMargin -------------------------- - -/* MsgRemoveMargin: Msg to remove margin. */ -message MsgRemoveMargin { - string sender = 1; - - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - cosmos.base.v1beta1.Coin margin = 3 [ (gogoproto.nullable) = false ]; -} - -message MsgRemoveMarginResponse { - // tokens transferred back to the trader - cosmos.base.v1beta1.Coin margin_out = 1 [ (gogoproto.nullable) = false ]; - - // the funding payment applied on this position interaction - string funding_payment = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The resulting position - nibiru.perp.v2.Position position = 3; -} - -// -------------------------- AddMargin -------------------------- - -/* MsgAddMargin: Msg to remove margin. */ -message MsgAddMargin { - string sender = 1; - - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - cosmos.base.v1beta1.Coin margin = 3 [ (gogoproto.nullable) = false ]; -} - -message MsgAddMarginResponse { - string funding_payment = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - nibiru.perp.v2.Position position = 2; -} - -// -------------------------- Liquidation -------------------------- - -message MsgMultiLiquidate { - string sender = 1; - - message Liquidation { - string pair = 1 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - string trader = 2; - } - - repeated Liquidation liquidations = 2; -} - -message MsgMultiLiquidateResponse { - message LiquidationResponse { - bool success = 1; - string error = 2; - - cosmos.base.v1beta1.Coin liquidator_fee = 3 [ (gogoproto.nullable) = true ]; - // nullable since no fee is taken on failed liquidation - - cosmos.base.v1beta1.Coin perp_ef_fee = 4 - [ (gogoproto.nullable) = true ]; // perp ecosystem fund - // nullable since no fee is taken on failed liquidation - - string trader = 5; - string pair = 6 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - } - - repeated LiquidationResponse liquidations = 1; -} - -// -------------------------- MarketOrder -------------------------- - -message MsgMarketOrder { - string sender = 1; - - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - nibiru.perp.v2.Direction side = 3; - - string quote_asset_amount = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; - - string leverage = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - string base_asset_amount_limit = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = false - ]; -} - -message MsgMarketOrderResponse { - nibiru.perp.v2.Position position = 1; - - // The amount of quote assets exchanged. - string exchanged_notional_value = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of base assets exchanged. - string exchanged_position_size = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The funding payment applied on this position change, measured in quote - // units. - string funding_payment = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of PnL realized on this position changed, measured in quote - // units. - string realized_pnl = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The unrealized PnL in the position after the position change, measured in - // quote units. - string unrealized_pnl_after = 6 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of margin the trader has to give to the vault. - // A negative value means the vault pays the trader. - string margin_to_vault = 7 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The position's notional value after the position change, measured in quote - // units. - string position_notional = 8 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// -------------------------- ClosePosition -------------------------- - -message MsgClosePosition { - string sender = 1; - - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; -} - -message MsgClosePositionResponse { - // The amount of quote assets exchanged. - string exchanged_notional_value = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of base assets exchanged. - string exchanged_position_size = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The funding payment applied on this position change, measured in quote - // units. - string funding_payment = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of PnL realized on this position changed, measured in quote - // units. - string realized_pnl = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of margin the trader receives after closing the position, from - // the vault. Should never be negative. - string margin_to_trader = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -message MsgPartialClose { - string sender = 1; - - string pair = 2 [ - (gogoproto.customtype) = - "github.com/NibiruChain/nibiru/x/common/asset.Pair", - (gogoproto.nullable) = false - ]; - - string size = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -message MsgPartialCloseResponse { - // The amount of quote assets exchanged. - string exchanged_notional_value = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of base assets exchanged. - string exchanged_position_size = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The funding payment applied on this position change, measured in quote - // units. - string funding_payment = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of PnL realized on this position changed, measured in quote - // units. - string realized_pnl = 4 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - - // The amount of margin the trader receives after closing the position, from - // the vault. Should never be negative. - string margin_to_trader = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// -------------------------- DonateToEcosystemFund -------------------------- - -message MsgDonateToEcosystemFund { - string sender = 1; - - // donation to the EF - cosmos.base.v1beta1.Coin donation = 2 [ - (gogoproto.moretags) = "yaml:\"donation\"", - (gogoproto.nullable) = false - ]; -} - -message MsgDonateToEcosystemFundResponse {} From 2a250a3c4c60c58c5526ac7d75ce5b9e13889471 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:21:07 -0500 Subject: [PATCH 03/99] chore(stablecoin): remove stablecoin --- x/stablecoin/types/events.pb.go | 1749 ---------------------- x/stablecoin/types/genesis.pb.go | 383 ----- x/stablecoin/types/params.pb.go | 631 -------- x/stablecoin/types/query.pb.go | 2225 ---------------------------- x/stablecoin/types/query.pb.gw.go | 348 ----- x/stablecoin/types/tx.pb.go | 2228 ----------------------------- x/stablecoin/types/tx.pb.gw.go | 420 ------ 7 files changed, 7984 deletions(-) delete mode 100644 x/stablecoin/types/events.pb.go delete mode 100644 x/stablecoin/types/genesis.pb.go delete mode 100644 x/stablecoin/types/params.pb.go delete mode 100644 x/stablecoin/types/query.pb.go delete mode 100644 x/stablecoin/types/query.pb.gw.go delete mode 100644 x/stablecoin/types/tx.pb.go delete mode 100644 x/stablecoin/types/tx.pb.gw.go diff --git a/x/stablecoin/types/events.pb.go b/x/stablecoin/types/events.pb.go deleted file mode 100644 index c1304ccf5..000000000 --- a/x/stablecoin/types/events.pb.go +++ /dev/null @@ -1,1749 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/stablecoin/v1/events.proto - -package types - -import ( - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type EventTransfer struct { - Coin types.Coin `protobuf:"bytes,1,opt,name=coin,proto3" json:"coin"` - From string `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` - To string `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` -} - -func (m *EventTransfer) Reset() { *m = EventTransfer{} } -func (m *EventTransfer) String() string { return proto.CompactTextString(m) } -func (*EventTransfer) ProtoMessage() {} -func (*EventTransfer) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{0} -} -func (m *EventTransfer) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventTransfer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventTransfer.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventTransfer) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventTransfer.Merge(m, src) -} -func (m *EventTransfer) XXX_Size() int { - return m.Size() -} -func (m *EventTransfer) XXX_DiscardUnknown() { - xxx_messageInfo_EventTransfer.DiscardUnknown(m) -} - -var xxx_messageInfo_EventTransfer proto.InternalMessageInfo - -func (m *EventTransfer) GetCoin() types.Coin { - if m != nil { - return m.Coin - } - return types.Coin{} -} - -func (m *EventTransfer) GetFrom() string { - if m != nil { - return m.From - } - return "" -} - -func (m *EventTransfer) GetTo() string { - if m != nil { - return m.To - } - return "" -} - -type EventMintStable struct { - Amount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount"` -} - -func (m *EventMintStable) Reset() { *m = EventMintStable{} } -func (m *EventMintStable) String() string { return proto.CompactTextString(m) } -func (*EventMintStable) ProtoMessage() {} -func (*EventMintStable) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{1} -} -func (m *EventMintStable) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventMintStable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventMintStable.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventMintStable) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventMintStable.Merge(m, src) -} -func (m *EventMintStable) XXX_Size() int { - return m.Size() -} -func (m *EventMintStable) XXX_DiscardUnknown() { - xxx_messageInfo_EventMintStable.DiscardUnknown(m) -} - -var xxx_messageInfo_EventMintStable proto.InternalMessageInfo - -type EventBurnStable struct { - Amount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount"` -} - -func (m *EventBurnStable) Reset() { *m = EventBurnStable{} } -func (m *EventBurnStable) String() string { return proto.CompactTextString(m) } -func (*EventBurnStable) ProtoMessage() {} -func (*EventBurnStable) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{2} -} -func (m *EventBurnStable) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventBurnStable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventBurnStable.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventBurnStable) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventBurnStable.Merge(m, src) -} -func (m *EventBurnStable) XXX_Size() int { - return m.Size() -} -func (m *EventBurnStable) XXX_DiscardUnknown() { - xxx_messageInfo_EventBurnStable.DiscardUnknown(m) -} - -var xxx_messageInfo_EventBurnStable proto.InternalMessageInfo - -type EventMintNIBI struct { - Amount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount"` -} - -func (m *EventMintNIBI) Reset() { *m = EventMintNIBI{} } -func (m *EventMintNIBI) String() string { return proto.CompactTextString(m) } -func (*EventMintNIBI) ProtoMessage() {} -func (*EventMintNIBI) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{3} -} -func (m *EventMintNIBI) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventMintNIBI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventMintNIBI.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventMintNIBI) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventMintNIBI.Merge(m, src) -} -func (m *EventMintNIBI) XXX_Size() int { - return m.Size() -} -func (m *EventMintNIBI) XXX_DiscardUnknown() { - xxx_messageInfo_EventMintNIBI.DiscardUnknown(m) -} - -var xxx_messageInfo_EventMintNIBI proto.InternalMessageInfo - -type EventBurnNIBI struct { - Amount github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=amount,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"amount"` -} - -func (m *EventBurnNIBI) Reset() { *m = EventBurnNIBI{} } -func (m *EventBurnNIBI) String() string { return proto.CompactTextString(m) } -func (*EventBurnNIBI) ProtoMessage() {} -func (*EventBurnNIBI) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{4} -} -func (m *EventBurnNIBI) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventBurnNIBI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventBurnNIBI.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventBurnNIBI) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventBurnNIBI.Merge(m, src) -} -func (m *EventBurnNIBI) XXX_Size() int { - return m.Size() -} -func (m *EventBurnNIBI) XXX_DiscardUnknown() { - xxx_messageInfo_EventBurnNIBI.DiscardUnknown(m) -} - -var xxx_messageInfo_EventBurnNIBI proto.InternalMessageInfo - -type EventRecollateralize struct { - Caller string `protobuf:"bytes,1,opt,name=caller,proto3" json:"caller,omitempty"` - InCoin types.Coin `protobuf:"bytes,2,opt,name=in_coin,json=inCoin,proto3" json:"in_coin"` - OutCoin types.Coin `protobuf:"bytes,3,opt,name=out_coin,json=outCoin,proto3" json:"out_coin"` - CollRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=coll_ratio,json=collRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"coll_ratio"` -} - -func (m *EventRecollateralize) Reset() { *m = EventRecollateralize{} } -func (m *EventRecollateralize) String() string { return proto.CompactTextString(m) } -func (*EventRecollateralize) ProtoMessage() {} -func (*EventRecollateralize) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{5} -} -func (m *EventRecollateralize) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventRecollateralize) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventRecollateralize.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventRecollateralize) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventRecollateralize.Merge(m, src) -} -func (m *EventRecollateralize) XXX_Size() int { - return m.Size() -} -func (m *EventRecollateralize) XXX_DiscardUnknown() { - xxx_messageInfo_EventRecollateralize.DiscardUnknown(m) -} - -var xxx_messageInfo_EventRecollateralize proto.InternalMessageInfo - -func (m *EventRecollateralize) GetCaller() string { - if m != nil { - return m.Caller - } - return "" -} - -func (m *EventRecollateralize) GetInCoin() types.Coin { - if m != nil { - return m.InCoin - } - return types.Coin{} -} - -func (m *EventRecollateralize) GetOutCoin() types.Coin { - if m != nil { - return m.OutCoin - } - return types.Coin{} -} - -type EventBuyback struct { - Caller string `protobuf:"bytes,1,opt,name=caller,proto3" json:"caller,omitempty"` - InCoin types.Coin `protobuf:"bytes,2,opt,name=in_coin,json=inCoin,proto3" json:"in_coin"` - OutCoin types.Coin `protobuf:"bytes,3,opt,name=out_coin,json=outCoin,proto3" json:"out_coin"` - CollRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=coll_ratio,json=collRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"coll_ratio"` -} - -func (m *EventBuyback) Reset() { *m = EventBuyback{} } -func (m *EventBuyback) String() string { return proto.CompactTextString(m) } -func (*EventBuyback) ProtoMessage() {} -func (*EventBuyback) Descriptor() ([]byte, []int) { - return fileDescriptor_10d156cd0ca9fb9a, []int{6} -} -func (m *EventBuyback) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventBuyback) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventBuyback.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventBuyback) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventBuyback.Merge(m, src) -} -func (m *EventBuyback) XXX_Size() int { - return m.Size() -} -func (m *EventBuyback) XXX_DiscardUnknown() { - xxx_messageInfo_EventBuyback.DiscardUnknown(m) -} - -var xxx_messageInfo_EventBuyback proto.InternalMessageInfo - -func (m *EventBuyback) GetCaller() string { - if m != nil { - return m.Caller - } - return "" -} - -func (m *EventBuyback) GetInCoin() types.Coin { - if m != nil { - return m.InCoin - } - return types.Coin{} -} - -func (m *EventBuyback) GetOutCoin() types.Coin { - if m != nil { - return m.OutCoin - } - return types.Coin{} -} - -func init() { - proto.RegisterType((*EventTransfer)(nil), "nibiru.stablecoin.v1.EventTransfer") - proto.RegisterType((*EventMintStable)(nil), "nibiru.stablecoin.v1.EventMintStable") - proto.RegisterType((*EventBurnStable)(nil), "nibiru.stablecoin.v1.EventBurnStable") - proto.RegisterType((*EventMintNIBI)(nil), "nibiru.stablecoin.v1.EventMintNIBI") - proto.RegisterType((*EventBurnNIBI)(nil), "nibiru.stablecoin.v1.EventBurnNIBI") - proto.RegisterType((*EventRecollateralize)(nil), "nibiru.stablecoin.v1.EventRecollateralize") - proto.RegisterType((*EventBuyback)(nil), "nibiru.stablecoin.v1.EventBuyback") -} - -func init() { proto.RegisterFile("nibiru/stablecoin/v1/events.proto", fileDescriptor_10d156cd0ca9fb9a) } - -var fileDescriptor_10d156cd0ca9fb9a = []byte{ - // 434 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x94, 0x3f, 0x6f, 0xd4, 0x30, - 0x18, 0xc6, 0xe3, 0x34, 0x4a, 0x39, 0xf3, 0x4f, 0xb2, 0x4e, 0x28, 0x74, 0x48, 0xcb, 0x0d, 0xa8, - 0x0b, 0x36, 0xa1, 0x0b, 0x62, 0x4c, 0x01, 0xe9, 0x90, 0xda, 0x21, 0x20, 0x21, 0x58, 0x2a, 0x27, - 0xb8, 0x77, 0x56, 0x13, 0xbf, 0x95, 0xed, 0x44, 0x94, 0x4f, 0xc1, 0xc7, 0xea, 0xd8, 0x11, 0x31, - 0x9c, 0xd0, 0xdd, 0xc8, 0xc8, 0x17, 0x40, 0x76, 0x22, 0xb8, 0xf1, 0x90, 0x6e, 0x62, 0x8a, 0x1d, - 0x3f, 0xcf, 0xef, 0x7d, 0xec, 0x57, 0x7a, 0xf1, 0x23, 0x25, 0x4b, 0xa9, 0x5b, 0x66, 0x2c, 0x2f, - 0x6b, 0x51, 0x81, 0x54, 0xac, 0xcb, 0x98, 0xe8, 0x84, 0xb2, 0x86, 0x5e, 0x6a, 0xb0, 0x40, 0xc6, - 0xbd, 0x84, 0xfe, 0x95, 0xd0, 0x2e, 0xdb, 0x1b, 0xcf, 0x60, 0x06, 0x5e, 0xc0, 0xdc, 0xaa, 0xd7, - 0xee, 0xa5, 0x15, 0x98, 0x06, 0x0c, 0x2b, 0xb9, 0x11, 0xac, 0xcb, 0x4a, 0x61, 0x79, 0xc6, 0xbc, - 0xc5, 0x9f, 0x4f, 0xe6, 0xf8, 0xee, 0x2b, 0xc7, 0x7e, 0xa7, 0xb9, 0x32, 0xe7, 0x42, 0x93, 0x23, - 0x1c, 0xb9, 0xe3, 0x04, 0x1d, 0xa0, 0xc3, 0xdb, 0xcf, 0x1e, 0xd2, 0xde, 0x4f, 0x9d, 0x9f, 0x0e, - 0x7e, 0x7a, 0x0c, 0x52, 0xe5, 0xd1, 0xf5, 0x62, 0x3f, 0x28, 0xbc, 0x98, 0x10, 0x1c, 0x9d, 0x6b, - 0x68, 0x92, 0xf0, 0x00, 0x1d, 0x8e, 0x0a, 0xbf, 0x26, 0xf7, 0x70, 0x68, 0x21, 0xd9, 0xf1, 0x7f, - 0x42, 0x0b, 0x93, 0x0f, 0xf8, 0xbe, 0xaf, 0x74, 0x22, 0x95, 0x7d, 0xeb, 0x93, 0x93, 0xd7, 0x38, - 0xe6, 0x0d, 0xb4, 0xca, 0xfa, 0x6a, 0xa3, 0x9c, 0x3a, 0xe4, 0xf7, 0xc5, 0xfe, 0xe3, 0x99, 0xb4, - 0xf3, 0xb6, 0xa4, 0x15, 0x34, 0x6c, 0xc8, 0xdf, 0x7f, 0x9e, 0x98, 0x4f, 0x17, 0xcc, 0x5e, 0x5d, - 0x0a, 0x43, 0xa7, 0xca, 0x16, 0x83, 0xfb, 0x0f, 0x3a, 0x6f, 0xb5, 0xda, 0x32, 0xfa, 0xfd, 0xf0, - 0x3e, 0x2e, 0xf5, 0xe9, 0x34, 0x9f, 0x6e, 0x1d, 0xec, 0x32, 0x6f, 0x15, 0xfc, 0x0b, 0xe1, 0xb1, - 0x27, 0x17, 0xa2, 0x82, 0xba, 0xe6, 0x56, 0x68, 0x5e, 0xcb, 0x2f, 0x82, 0x3c, 0xc0, 0x71, 0xc5, - 0xeb, 0x5a, 0xe8, 0xbe, 0x40, 0x31, 0xec, 0xc8, 0x73, 0xbc, 0x2b, 0xd5, 0x99, 0x6f, 0x7a, 0xb8, - 0x59, 0xd3, 0x63, 0xa9, 0xdc, 0x8e, 0xbc, 0xc0, 0xb7, 0xa0, 0xb5, 0xbd, 0x75, 0x67, 0x33, 0xeb, - 0x2e, 0xb4, 0xd6, 0x7b, 0x4f, 0x30, 0x76, 0xf1, 0xce, 0x34, 0xb7, 0x12, 0x92, 0xe8, 0x9f, 0xaf, - 0xfc, 0x52, 0x54, 0xc5, 0xc8, 0x11, 0x0a, 0x07, 0x98, 0xfc, 0x44, 0xf8, 0xce, 0xf0, 0x9e, 0x57, - 0x25, 0xaf, 0x2e, 0xfe, 0xeb, 0xdb, 0xe6, 0x6f, 0xae, 0x97, 0x29, 0xba, 0x59, 0xa6, 0xe8, 0xc7, - 0x32, 0x45, 0x5f, 0x57, 0x69, 0x70, 0xb3, 0x4a, 0x83, 0x6f, 0xab, 0x34, 0xf8, 0xf8, 0x74, 0x0d, - 0x76, 0xea, 0xc7, 0xc4, 0xf1, 0x9c, 0x4b, 0xc5, 0x86, 0xa9, 0xf2, 0x79, 0x7d, 0xae, 0x78, 0x74, - 0x19, 0xfb, 0x41, 0x70, 0xf4, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5c, 0x6f, 0x32, 0xc4, 0x79, 0x04, - 0x00, 0x00, -} - -func (m *EventTransfer) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventTransfer) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventTransfer) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.To) > 0 { - i -= len(m.To) - copy(dAtA[i:], m.To) - i = encodeVarintEvents(dAtA, i, uint64(len(m.To))) - i-- - dAtA[i] = 0x1a - } - if len(m.From) > 0 { - i -= len(m.From) - copy(dAtA[i:], m.From) - i = encodeVarintEvents(dAtA, i, uint64(len(m.From))) - i-- - dAtA[i] = 0x12 - } - { - size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EventMintStable) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventMintStable) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventMintStable) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Amount.Size() - i -= size - if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EventBurnStable) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventBurnStable) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventBurnStable) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Amount.Size() - i -= size - if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EventMintNIBI) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventMintNIBI) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventMintNIBI) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Amount.Size() - i -= size - if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EventBurnNIBI) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventBurnNIBI) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventBurnNIBI) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Amount.Size() - i -= size - if _, err := m.Amount.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *EventRecollateralize) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventRecollateralize) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventRecollateralize) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.CollRatio.Size() - i -= size - if _, err := m.CollRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.OutCoin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.InCoin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Caller) > 0 { - i -= len(m.Caller) - copy(dAtA[i:], m.Caller) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Caller))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventBuyback) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventBuyback) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventBuyback) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.CollRatio.Size() - i -= size - if _, err := m.CollRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.OutCoin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.InCoin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Caller) > 0 { - i -= len(m.Caller) - copy(dAtA[i:], m.Caller) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Caller))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { - offset -= sovEvents(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *EventTransfer) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Coin.Size() - n += 1 + l + sovEvents(uint64(l)) - l = len(m.From) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = len(m.To) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - return n -} - -func (m *EventMintStable) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Amount.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func (m *EventBurnStable) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Amount.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func (m *EventMintNIBI) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Amount.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func (m *EventBurnNIBI) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Amount.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func (m *EventRecollateralize) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Caller) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = m.InCoin.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.OutCoin.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.CollRatio.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func (m *EventBuyback) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Caller) - if l > 0 { - n += 1 + l + sovEvents(uint64(l)) - } - l = m.InCoin.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.OutCoin.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.CollRatio.Size() - n += 1 + l + sovEvents(uint64(l)) - return n -} - -func sovEvents(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvents(x uint64) (n int) { - return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *EventTransfer) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventTransfer: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventTransfer: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field From", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.From = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field To", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.To = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventMintStable) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventMintStable: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventMintStable: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventBurnStable) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventBurnStable: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventBurnStable: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventMintNIBI) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventMintNIBI: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventMintNIBI: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventBurnNIBI) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventBurnNIBI: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventBurnNIBI: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventRecollateralize) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventRecollateralize: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventRecollateralize: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Caller", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Caller = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InCoin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InCoin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutCoin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.OutCoin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CollRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CollRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventBuyback) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventBuyback: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventBuyback: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Caller", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Caller = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InCoin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InCoin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutCoin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.OutCoin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CollRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CollRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvents(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvents - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvents - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvents - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvents - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvents = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/stablecoin/types/genesis.pb.go b/x/stablecoin/types/genesis.pb.go deleted file mode 100644 index db29b5597..000000000 --- a/x/stablecoin/types/genesis.pb.go +++ /dev/null @@ -1,383 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/stablecoin/v1/genesis.proto - -package types - -import ( - fmt "fmt" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the stablecoin module's genesis state. -type GenesisState struct { - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - ModuleAccountBalance types.Coin `protobuf:"bytes,2,opt,name=module_account_balance,json=moduleAccountBalance,proto3" json:"module_account_balance" yaml:"module_account_balance"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_0aa97d97dd3fb3f7, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetModuleAccountBalance() types.Coin { - if m != nil { - return m.ModuleAccountBalance - } - return types.Coin{} -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "nibiru.stablecoin.v1.GenesisState") -} - -func init() { - proto.RegisterFile("nibiru/stablecoin/v1/genesis.proto", fileDescriptor_0aa97d97dd3fb3f7) -} - -var fileDescriptor_0aa97d97dd3fb3f7 = []byte{ - // 298 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x50, 0xb1, 0x4e, 0xc3, 0x30, - 0x14, 0x8c, 0x11, 0xea, 0x10, 0x98, 0xaa, 0x0a, 0x95, 0x0a, 0x5c, 0x88, 0x84, 0xc4, 0x64, 0x13, - 0xd8, 0xba, 0x91, 0x0e, 0x48, 0x0c, 0x08, 0x95, 0x8d, 0xa5, 0xb2, 0x8d, 0x95, 0x5a, 0x4a, 0xfc, - 0xaa, 0xd8, 0x89, 0xe8, 0x5f, 0xf0, 0x4d, 0x4c, 0x1d, 0x3b, 0x32, 0x55, 0x28, 0xf9, 0x03, 0xbe, - 0x00, 0xc5, 0x8e, 0x04, 0x43, 0xb6, 0xa7, 0x7b, 0xf7, 0xee, 0xdd, 0x5d, 0x18, 0x69, 0xc5, 0x55, - 0x51, 0x52, 0x63, 0x19, 0xcf, 0xa4, 0x00, 0xa5, 0x69, 0x15, 0xd3, 0x54, 0x6a, 0x69, 0x94, 0x21, - 0xeb, 0x02, 0x2c, 0x0c, 0x47, 0x9e, 0x43, 0xfe, 0x38, 0xa4, 0x8a, 0x27, 0x58, 0x80, 0xc9, 0xc1, - 0x50, 0xce, 0x8c, 0xa4, 0x55, 0xcc, 0xa5, 0x65, 0x31, 0x75, 0x4b, 0x77, 0x35, 0x19, 0xa5, 0x90, - 0x82, 0x1b, 0x69, 0x3b, 0x75, 0xe8, 0x65, 0xef, 0xbf, 0x35, 0x2b, 0x58, 0xde, 0xbd, 0x8b, 0x3e, - 0x51, 0x78, 0xfc, 0xe0, 0x0d, 0xbc, 0x58, 0x66, 0xe5, 0x70, 0x16, 0x0e, 0x3c, 0x61, 0x8c, 0x2e, - 0xd0, 0xf5, 0xd1, 0xed, 0x19, 0xe9, 0x33, 0x44, 0x9e, 0x1d, 0x27, 0x39, 0xdc, 0xee, 0xa7, 0xc1, - 0xa2, 0xbb, 0x18, 0x56, 0xe1, 0x49, 0x0e, 0x6f, 0x65, 0x26, 0x97, 0x4c, 0x08, 0x28, 0xb5, 0x5d, - 0x72, 0x96, 0x31, 0x2d, 0xe4, 0xf8, 0xc0, 0x69, 0x9d, 0x12, 0x1f, 0x83, 0xb4, 0x31, 0x48, 0x17, - 0x83, 0xcc, 0x41, 0xe9, 0xe4, 0xaa, 0x15, 0xfa, 0xd9, 0x4f, 0xcf, 0x37, 0x2c, 0xcf, 0x66, 0x51, - 0xbf, 0x4c, 0xb4, 0x18, 0xf9, 0xc5, 0xbd, 0xc7, 0x13, 0x0f, 0x27, 0x8f, 0xdb, 0x1a, 0xa3, 0x5d, - 0x8d, 0xd1, 0x77, 0x8d, 0xd1, 0x47, 0x83, 0x83, 0x5d, 0x83, 0x83, 0xaf, 0x06, 0x07, 0xaf, 0x37, - 0xa9, 0xb2, 0xab, 0x92, 0x13, 0x01, 0x39, 0x7d, 0x72, 0x39, 0xe6, 0x2b, 0xa6, 0x34, 0xed, 0x8a, - 0x79, 0xff, 0x5f, 0x8d, 0xdd, 0xac, 0xa5, 0xe1, 0x03, 0xd7, 0xcb, 0xdd, 0x6f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xf8, 0x3a, 0xd0, 0x91, 0xac, 0x01, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.ModuleAccountBalance.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.ModuleAccountBalance.Size() - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ModuleAccountBalance", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ModuleAccountBalance.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/stablecoin/types/params.pb.go b/x/stablecoin/types/params.pb.go deleted file mode 100644 index 5e50937e4..000000000 --- a/x/stablecoin/types/params.pb.go +++ /dev/null @@ -1,631 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/stablecoin/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { - // collRatio is the ratio needed as collateral to exchange for stables - CollRatio int64 `protobuf:"varint,1,opt,name=coll_ratio,json=collRatio,proto3" json:"coll_ratio,omitempty"` - // feeRatio is the ratio taken as fees when minting or burning stables - FeeRatio int64 `protobuf:"varint,2,opt,name=fee_ratio,json=feeRatio,proto3" json:"fee_ratio,omitempty"` - // efFeeRatio is the ratio taken from the fees that goes to Ecosystem Fund - EfFeeRatio int64 `protobuf:"varint,3,opt,name=ef_fee_ratio,json=efFeeRatio,proto3" json:"ef_fee_ratio,omitempty"` - // BonusRateRecoll is the percentage of extra stablecoin value given to the - // caller of 'Recollateralize' in units of governance tokens. - BonusRateRecoll int64 `protobuf:"varint,4,opt,name=bonus_rate_recoll,json=bonusRateRecoll,proto3" json:"bonus_rate_recoll,omitempty"` - // distr_epoch_identifier defines the frequnecy of update for the collateral - // ratio - DistrEpochIdentifier string `protobuf:"bytes,5,opt,name=distr_epoch_identifier,json=distrEpochIdentifier,proto3" json:"distr_epoch_identifier,omitempty" yaml:"distr_epoch_identifier"` - // adjustmentStep is the size of the step taken when updating the collateral - // ratio - AdjustmentStep int64 `protobuf:"varint,6,opt,name=adjustment_step,json=adjustmentStep,proto3" json:"adjustment_step,omitempty"` - // priceLowerBound is the lower bound for the stable coin to trigger a - // collateral ratio update - PriceLowerBound int64 `protobuf:"varint,7,opt,name=price_lower_bound,json=priceLowerBound,proto3" json:"price_lower_bound,omitempty"` - // priceUpperBound is the upper bound for the stable coin to trigger a - // collateral ratio update - PriceUpperBound int64 `protobuf:"varint,8,opt,name=price_upper_bound,json=priceUpperBound,proto3" json:"price_upper_bound,omitempty"` - // isCollateralRatioValid checks if the collateral ratio is correctly updated - IsCollateralRatioValid bool `protobuf:"varint,9,opt,name=is_collateral_ratio_valid,json=isCollateralRatioValid,proto3" json:"is_collateral_ratio_valid,omitempty"` -} - -func (m *Params) Reset() { *m = Params{} } -func (m *Params) String() string { return proto.CompactTextString(m) } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_2d2b84d268bc3814, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetCollRatio() int64 { - if m != nil { - return m.CollRatio - } - return 0 -} - -func (m *Params) GetFeeRatio() int64 { - if m != nil { - return m.FeeRatio - } - return 0 -} - -func (m *Params) GetEfFeeRatio() int64 { - if m != nil { - return m.EfFeeRatio - } - return 0 -} - -func (m *Params) GetBonusRateRecoll() int64 { - if m != nil { - return m.BonusRateRecoll - } - return 0 -} - -func (m *Params) GetDistrEpochIdentifier() string { - if m != nil { - return m.DistrEpochIdentifier - } - return "" -} - -func (m *Params) GetAdjustmentStep() int64 { - if m != nil { - return m.AdjustmentStep - } - return 0 -} - -func (m *Params) GetPriceLowerBound() int64 { - if m != nil { - return m.PriceLowerBound - } - return 0 -} - -func (m *Params) GetPriceUpperBound() int64 { - if m != nil { - return m.PriceUpperBound - } - return 0 -} - -func (m *Params) GetIsCollateralRatioValid() bool { - if m != nil { - return m.IsCollateralRatioValid - } - return false -} - -func init() { - proto.RegisterType((*Params)(nil), "nibiru.stablecoin.v1.Params") -} - -func init() { proto.RegisterFile("nibiru/stablecoin/v1/params.proto", fileDescriptor_2d2b84d268bc3814) } - -var fileDescriptor_2d2b84d268bc3814 = []byte{ - // 400 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xc1, 0x8a, 0xd3, 0x40, - 0x18, 0x80, 0x1b, 0xab, 0xb5, 0x19, 0xc4, 0x62, 0x28, 0x25, 0x2a, 0x8d, 0x69, 0x2f, 0x16, 0x0f, - 0x89, 0xc5, 0x93, 0x1e, 0x5b, 0x14, 0x14, 0x11, 0x89, 0xa8, 0xb0, 0x97, 0x61, 0x92, 0xfc, 0x69, - 0x67, 0x49, 0x32, 0xc3, 0xcc, 0xa4, 0xbb, 0x7d, 0x8b, 0x7d, 0x8b, 0x7d, 0x95, 0x3d, 0xf6, 0xb8, - 0xa7, 0x65, 0x69, 0xdf, 0x60, 0x9f, 0x60, 0x99, 0x49, 0xb7, 0xe9, 0x61, 0x6f, 0xe1, 0xfb, 0xbe, - 0x84, 0x3f, 0x33, 0x3f, 0x1a, 0x95, 0x34, 0xa6, 0xa2, 0x0a, 0xa5, 0x22, 0x71, 0x0e, 0x09, 0xa3, - 0x65, 0xb8, 0x9a, 0x86, 0x9c, 0x08, 0x52, 0xc8, 0x80, 0x0b, 0xa6, 0x98, 0xd3, 0xaf, 0x93, 0xa0, - 0x49, 0x82, 0xd5, 0xf4, 0x4d, 0x7f, 0xc1, 0x16, 0xcc, 0x04, 0xa1, 0x7e, 0xaa, 0xdb, 0xf1, 0x65, - 0x1b, 0x75, 0x7e, 0x9b, 0x97, 0x9d, 0x21, 0x42, 0x09, 0xcb, 0x73, 0x2c, 0x88, 0xa2, 0xcc, 0xb5, - 0x7c, 0x6b, 0xd2, 0x8e, 0x6c, 0x4d, 0x22, 0x0d, 0x9c, 0xb7, 0xc8, 0xce, 0x00, 0xf6, 0xf6, 0x89, - 0xb1, 0xdd, 0x0c, 0xa0, 0x96, 0x3e, 0x7a, 0x01, 0x19, 0x6e, 0x7c, 0xdb, 0x78, 0x04, 0xd9, 0xb7, - 0x87, 0xe2, 0x03, 0x7a, 0x15, 0xb3, 0xb2, 0x92, 0x3a, 0x00, 0x2c, 0x40, 0x7f, 0xd8, 0x7d, 0x6a, - 0xb2, 0x9e, 0x11, 0x11, 0x51, 0x10, 0x19, 0xec, 0xfc, 0x47, 0x83, 0x94, 0x4a, 0x25, 0x30, 0x70, - 0x96, 0x2c, 0x31, 0x4d, 0xa1, 0x54, 0x34, 0xa3, 0x20, 0xdc, 0x67, 0xbe, 0x35, 0xb1, 0x67, 0xa3, - 0xbb, 0x9b, 0x77, 0xc3, 0x35, 0x29, 0xf2, 0x2f, 0xe3, 0xc7, 0xbb, 0x71, 0xd4, 0x37, 0xe2, 0xab, - 0xe6, 0xdf, 0x0f, 0xd8, 0x79, 0x8f, 0x7a, 0x24, 0x3d, 0xad, 0xa4, 0x2a, 0xa0, 0x54, 0x58, 0x2a, - 0xe0, 0x6e, 0xc7, 0x8c, 0xf0, 0xb2, 0xc1, 0x7f, 0x14, 0x70, 0x3d, 0x2d, 0x17, 0x34, 0x01, 0x9c, - 0xb3, 0x33, 0x10, 0x38, 0x66, 0x55, 0x99, 0xba, 0xcf, 0xeb, 0x69, 0x8d, 0xf8, 0xa9, 0xf9, 0x4c, - 0xe3, 0xa6, 0xad, 0x38, 0x3f, 0xb4, 0xdd, 0xa3, 0xf6, 0xaf, 0xe6, 0x75, 0xfb, 0x19, 0xbd, 0xa6, - 0x12, 0xeb, 0x9f, 0x24, 0x0a, 0x04, 0xd9, 0x1f, 0x36, 0x5e, 0x91, 0x9c, 0xa6, 0xae, 0xed, 0x5b, - 0x93, 0x6e, 0x34, 0xa0, 0x72, 0x7e, 0xf0, 0xe6, 0xec, 0xfe, 0x69, 0x3b, 0xfb, 0x71, 0xb5, 0xf5, - 0xac, 0xcd, 0xd6, 0xb3, 0x6e, 0xb7, 0x9e, 0x75, 0xb1, 0xf3, 0x5a, 0x9b, 0x9d, 0xd7, 0xba, 0xde, - 0x79, 0xad, 0x93, 0x8f, 0x0b, 0xaa, 0x96, 0x55, 0x1c, 0x24, 0xac, 0x08, 0x7f, 0x99, 0xab, 0x9f, - 0x2f, 0x09, 0x2d, 0xc3, 0xfd, 0xa6, 0x9c, 0x1f, 0xef, 0x8a, 0x5a, 0x73, 0x90, 0x71, 0xc7, 0x5c, - 0xfe, 0xa7, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x67, 0x2b, 0x61, 0x4d, 0x02, 0x00, 0x00, -} - -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.IsCollateralRatioValid { - i-- - if m.IsCollateralRatioValid { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x48 - } - if m.PriceUpperBound != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.PriceUpperBound)) - i-- - dAtA[i] = 0x40 - } - if m.PriceLowerBound != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.PriceLowerBound)) - i-- - dAtA[i] = 0x38 - } - if m.AdjustmentStep != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.AdjustmentStep)) - i-- - dAtA[i] = 0x30 - } - if len(m.DistrEpochIdentifier) > 0 { - i -= len(m.DistrEpochIdentifier) - copy(dAtA[i:], m.DistrEpochIdentifier) - i = encodeVarintParams(dAtA, i, uint64(len(m.DistrEpochIdentifier))) - i-- - dAtA[i] = 0x2a - } - if m.BonusRateRecoll != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.BonusRateRecoll)) - i-- - dAtA[i] = 0x20 - } - if m.EfFeeRatio != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.EfFeeRatio)) - i-- - dAtA[i] = 0x18 - } - if m.FeeRatio != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.FeeRatio)) - i-- - dAtA[i] = 0x10 - } - if m.CollRatio != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.CollRatio)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CollRatio != 0 { - n += 1 + sovParams(uint64(m.CollRatio)) - } - if m.FeeRatio != 0 { - n += 1 + sovParams(uint64(m.FeeRatio)) - } - if m.EfFeeRatio != 0 { - n += 1 + sovParams(uint64(m.EfFeeRatio)) - } - if m.BonusRateRecoll != 0 { - n += 1 + sovParams(uint64(m.BonusRateRecoll)) - } - l = len(m.DistrEpochIdentifier) - if l > 0 { - n += 1 + l + sovParams(uint64(l)) - } - if m.AdjustmentStep != 0 { - n += 1 + sovParams(uint64(m.AdjustmentStep)) - } - if m.PriceLowerBound != 0 { - n += 1 + sovParams(uint64(m.PriceLowerBound)) - } - if m.PriceUpperBound != 0 { - n += 1 + sovParams(uint64(m.PriceUpperBound)) - } - if m.IsCollateralRatioValid { - n += 2 - } - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CollRatio", wireType) - } - m.CollRatio = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CollRatio |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field FeeRatio", wireType) - } - m.FeeRatio = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.FeeRatio |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EfFeeRatio", wireType) - } - m.EfFeeRatio = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EfFeeRatio |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field BonusRateRecoll", wireType) - } - m.BonusRateRecoll = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.BonusRateRecoll |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DistrEpochIdentifier", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DistrEpochIdentifier = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AdjustmentStep", wireType) - } - m.AdjustmentStep = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.AdjustmentStep |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceLowerBound", wireType) - } - m.PriceLowerBound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PriceLowerBound |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PriceUpperBound", wireType) - } - m.PriceUpperBound = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PriceUpperBound |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 9: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsCollateralRatioValid", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsCollateralRatioValid = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/stablecoin/types/query.pb.go b/x/stablecoin/types/query.pb.go deleted file mode 100644 index bdba4d595..000000000 --- a/x/stablecoin/types/query.pb.go +++ /dev/null @@ -1,2225 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/stablecoin/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -// QueryModuleAccountBalances is the request type for the balance of the -// x/stablecoin module account. -type QueryModuleAccountBalances struct { -} - -func (m *QueryModuleAccountBalances) Reset() { *m = QueryModuleAccountBalances{} } -func (m *QueryModuleAccountBalances) String() string { return proto.CompactTextString(m) } -func (*QueryModuleAccountBalances) ProtoMessage() {} -func (*QueryModuleAccountBalances) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{2} -} -func (m *QueryModuleAccountBalances) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryModuleAccountBalances) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryModuleAccountBalances.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryModuleAccountBalances) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryModuleAccountBalances.Merge(m, src) -} -func (m *QueryModuleAccountBalances) XXX_Size() int { - return m.Size() -} -func (m *QueryModuleAccountBalances) XXX_DiscardUnknown() { - xxx_messageInfo_QueryModuleAccountBalances.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryModuleAccountBalances proto.InternalMessageInfo - -type QueryModuleAccountBalancesResponse struct { - // ModuleAccountBalances is the balance of all coins in the x/stablecoin - // module. - ModuleAccountBalances github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=module_account_balances,json=moduleAccountBalances,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"module_account_balances" yaml:"coins"` -} - -func (m *QueryModuleAccountBalancesResponse) Reset() { *m = QueryModuleAccountBalancesResponse{} } -func (m *QueryModuleAccountBalancesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryModuleAccountBalancesResponse) ProtoMessage() {} -func (*QueryModuleAccountBalancesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{3} -} -func (m *QueryModuleAccountBalancesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryModuleAccountBalancesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryModuleAccountBalancesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryModuleAccountBalancesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryModuleAccountBalancesResponse.Merge(m, src) -} -func (m *QueryModuleAccountBalancesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryModuleAccountBalancesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryModuleAccountBalancesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryModuleAccountBalancesResponse proto.InternalMessageInfo - -func (m *QueryModuleAccountBalancesResponse) GetModuleAccountBalances() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.ModuleAccountBalances - } - return nil -} - -// QueryCirculatingSupplies is the request type for the circulating supply of -// both NIBI and NUSD. -type QueryCirculatingSupplies struct { -} - -func (m *QueryCirculatingSupplies) Reset() { *m = QueryCirculatingSupplies{} } -func (m *QueryCirculatingSupplies) String() string { return proto.CompactTextString(m) } -func (*QueryCirculatingSupplies) ProtoMessage() {} -func (*QueryCirculatingSupplies) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{4} -} -func (m *QueryCirculatingSupplies) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryCirculatingSupplies) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryCirculatingSupplies.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryCirculatingSupplies) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryCirculatingSupplies.Merge(m, src) -} -func (m *QueryCirculatingSupplies) XXX_Size() int { - return m.Size() -} -func (m *QueryCirculatingSupplies) XXX_DiscardUnknown() { - xxx_messageInfo_QueryCirculatingSupplies.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryCirculatingSupplies proto.InternalMessageInfo - -type QueryCirculatingSuppliesResponse struct { - Nibi types.Coin `protobuf:"bytes,1,opt,name=nibi,proto3" json:"nibi"` - Nusd types.Coin `protobuf:"bytes,2,opt,name=nusd,proto3" json:"nusd"` -} - -func (m *QueryCirculatingSuppliesResponse) Reset() { *m = QueryCirculatingSuppliesResponse{} } -func (m *QueryCirculatingSuppliesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryCirculatingSuppliesResponse) ProtoMessage() {} -func (*QueryCirculatingSuppliesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{5} -} -func (m *QueryCirculatingSuppliesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryCirculatingSuppliesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryCirculatingSuppliesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryCirculatingSuppliesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryCirculatingSuppliesResponse.Merge(m, src) -} -func (m *QueryCirculatingSuppliesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryCirculatingSuppliesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryCirculatingSuppliesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryCirculatingSuppliesResponse proto.InternalMessageInfo - -func (m *QueryCirculatingSuppliesResponse) GetNibi() types.Coin { - if m != nil { - return m.Nibi - } - return types.Coin{} -} - -func (m *QueryCirculatingSuppliesResponse) GetNusd() types.Coin { - if m != nil { - return m.Nusd - } - return types.Coin{} -} - -// QueryGovToMintStable is the request type for the Query/GovToMintStable RPC -// method -type QueryGovToMintStable struct { - Collateral types.Coin `protobuf:"bytes,1,opt,name=collateral,proto3" json:"collateral"` -} - -func (m *QueryGovToMintStable) Reset() { *m = QueryGovToMintStable{} } -func (m *QueryGovToMintStable) String() string { return proto.CompactTextString(m) } -func (*QueryGovToMintStable) ProtoMessage() {} -func (*QueryGovToMintStable) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{6} -} -func (m *QueryGovToMintStable) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryGovToMintStable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryGovToMintStable.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryGovToMintStable) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryGovToMintStable.Merge(m, src) -} -func (m *QueryGovToMintStable) XXX_Size() int { - return m.Size() -} -func (m *QueryGovToMintStable) XXX_DiscardUnknown() { - xxx_messageInfo_QueryGovToMintStable.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryGovToMintStable proto.InternalMessageInfo - -func (m *QueryGovToMintStable) GetCollateral() types.Coin { - if m != nil { - return m.Collateral - } - return types.Coin{} -} - -// QueryGovToMintStableResponse is the response type for 'QueryGovToMintStable' -type QueryGovToMintStableResponse struct { - Gov types.Coin `protobuf:"bytes,1,opt,name=gov,proto3" json:"gov"` -} - -func (m *QueryGovToMintStableResponse) Reset() { *m = QueryGovToMintStableResponse{} } -func (m *QueryGovToMintStableResponse) String() string { return proto.CompactTextString(m) } -func (*QueryGovToMintStableResponse) ProtoMessage() {} -func (*QueryGovToMintStableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{7} -} -func (m *QueryGovToMintStableResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryGovToMintStableResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryGovToMintStableResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryGovToMintStableResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryGovToMintStableResponse.Merge(m, src) -} -func (m *QueryGovToMintStableResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryGovToMintStableResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryGovToMintStableResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryGovToMintStableResponse proto.InternalMessageInfo - -func (m *QueryGovToMintStableResponse) GetGov() types.Coin { - if m != nil { - return m.Gov - } - return types.Coin{} -} - -type LiquidityRatioInfo struct { - LiquidityRatio github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=liquidity_ratio,json=liquidityRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"liquidity_ratio"` - UpperBand github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=upper_band,json=upperBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"upper_band"` - LowerBand github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=lower_band,json=lowerBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"lower_band"` -} - -func (m *LiquidityRatioInfo) Reset() { *m = LiquidityRatioInfo{} } -func (m *LiquidityRatioInfo) String() string { return proto.CompactTextString(m) } -func (*LiquidityRatioInfo) ProtoMessage() {} -func (*LiquidityRatioInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{8} -} -func (m *LiquidityRatioInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *LiquidityRatioInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_LiquidityRatioInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *LiquidityRatioInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_LiquidityRatioInfo.Merge(m, src) -} -func (m *LiquidityRatioInfo) XXX_Size() int { - return m.Size() -} -func (m *LiquidityRatioInfo) XXX_DiscardUnknown() { - xxx_messageInfo_LiquidityRatioInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_LiquidityRatioInfo proto.InternalMessageInfo - -type QueryLiquidityRatioInfoRequest struct { -} - -func (m *QueryLiquidityRatioInfoRequest) Reset() { *m = QueryLiquidityRatioInfoRequest{} } -func (m *QueryLiquidityRatioInfoRequest) String() string { return proto.CompactTextString(m) } -func (*QueryLiquidityRatioInfoRequest) ProtoMessage() {} -func (*QueryLiquidityRatioInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{9} -} -func (m *QueryLiquidityRatioInfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryLiquidityRatioInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryLiquidityRatioInfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryLiquidityRatioInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryLiquidityRatioInfoRequest.Merge(m, src) -} -func (m *QueryLiquidityRatioInfoRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryLiquidityRatioInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryLiquidityRatioInfoRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryLiquidityRatioInfoRequest proto.InternalMessageInfo - -type QueryLiquidityRatioInfoResponse struct { - Info LiquidityRatioInfo `protobuf:"bytes,1,opt,name=info,proto3" json:"info"` -} - -func (m *QueryLiquidityRatioInfoResponse) Reset() { *m = QueryLiquidityRatioInfoResponse{} } -func (m *QueryLiquidityRatioInfoResponse) String() string { return proto.CompactTextString(m) } -func (*QueryLiquidityRatioInfoResponse) ProtoMessage() {} -func (*QueryLiquidityRatioInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_cd427158b4504e94, []int{10} -} -func (m *QueryLiquidityRatioInfoResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryLiquidityRatioInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryLiquidityRatioInfoResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryLiquidityRatioInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryLiquidityRatioInfoResponse.Merge(m, src) -} -func (m *QueryLiquidityRatioInfoResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryLiquidityRatioInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryLiquidityRatioInfoResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryLiquidityRatioInfoResponse proto.InternalMessageInfo - -func (m *QueryLiquidityRatioInfoResponse) GetInfo() LiquidityRatioInfo { - if m != nil { - return m.Info - } - return LiquidityRatioInfo{} -} - -func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "nibiru.stablecoin.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "nibiru.stablecoin.v1.QueryParamsResponse") - proto.RegisterType((*QueryModuleAccountBalances)(nil), "nibiru.stablecoin.v1.QueryModuleAccountBalances") - proto.RegisterType((*QueryModuleAccountBalancesResponse)(nil), "nibiru.stablecoin.v1.QueryModuleAccountBalancesResponse") - proto.RegisterType((*QueryCirculatingSupplies)(nil), "nibiru.stablecoin.v1.QueryCirculatingSupplies") - proto.RegisterType((*QueryCirculatingSuppliesResponse)(nil), "nibiru.stablecoin.v1.QueryCirculatingSuppliesResponse") - proto.RegisterType((*QueryGovToMintStable)(nil), "nibiru.stablecoin.v1.QueryGovToMintStable") - proto.RegisterType((*QueryGovToMintStableResponse)(nil), "nibiru.stablecoin.v1.QueryGovToMintStableResponse") - proto.RegisterType((*LiquidityRatioInfo)(nil), "nibiru.stablecoin.v1.LiquidityRatioInfo") - proto.RegisterType((*QueryLiquidityRatioInfoRequest)(nil), "nibiru.stablecoin.v1.QueryLiquidityRatioInfoRequest") - proto.RegisterType((*QueryLiquidityRatioInfoResponse)(nil), "nibiru.stablecoin.v1.QueryLiquidityRatioInfoResponse") -} - -func init() { proto.RegisterFile("nibiru/stablecoin/v1/query.proto", fileDescriptor_cd427158b4504e94) } - -var fileDescriptor_cd427158b4504e94 = []byte{ - // 744 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x6e, 0xd3, 0x4a, - 0x18, 0x8d, 0xfb, 0x27, 0x75, 0x7a, 0x75, 0xaf, 0x34, 0x4d, 0x75, 0x83, 0x15, 0x39, 0xc1, 0x42, - 0x90, 0x82, 0xb0, 0x9b, 0x16, 0x10, 0xea, 0x06, 0x70, 0x91, 0x10, 0x88, 0x22, 0x9a, 0x22, 0x55, - 0x62, 0x13, 0x8d, 0x9d, 0xa9, 0x3b, 0xc2, 0x99, 0x71, 0x3d, 0x76, 0x20, 0x5b, 0x58, 0xc2, 0x02, - 0xa9, 0x6f, 0x81, 0x10, 0x0b, 0x16, 0x2c, 0x78, 0x82, 0x2e, 0x2b, 0xb1, 0x41, 0x2c, 0x0a, 0x6a, - 0x79, 0x02, 0x9e, 0x00, 0xcd, 0xd8, 0x4e, 0x53, 0x3a, 0x89, 0x12, 0x56, 0x89, 0x66, 0xce, 0x39, - 0xdf, 0x99, 0x33, 0xf3, 0x7d, 0x06, 0x55, 0x4a, 0x5c, 0x12, 0x25, 0x36, 0x8f, 0x91, 0x1b, 0x60, - 0x8f, 0x11, 0x6a, 0x77, 0xea, 0xf6, 0x6e, 0x82, 0xa3, 0xae, 0x15, 0x46, 0x2c, 0x66, 0xb0, 0x98, - 0x22, 0xac, 0x13, 0x84, 0xd5, 0xa9, 0xeb, 0x45, 0x9f, 0xf9, 0x4c, 0x02, 0x6c, 0xf1, 0x2f, 0xc5, - 0xea, 0x65, 0x9f, 0x31, 0x3f, 0xc0, 0x36, 0x0a, 0x89, 0x8d, 0x28, 0x65, 0x31, 0x8a, 0x09, 0xa3, - 0x3c, 0xdb, 0xbd, 0xec, 0x31, 0xde, 0x66, 0xdc, 0x76, 0x11, 0xc7, 0x69, 0x09, 0xbb, 0x53, 0x77, - 0x71, 0x8c, 0xea, 0x76, 0x88, 0x7c, 0x42, 0x25, 0x38, 0xc3, 0x1a, 0xfd, 0xd8, 0x1c, 0x25, 0x8b, - 0xa7, 0xfb, 0xe7, 0x95, 0xbe, 0x43, 0x14, 0xa1, 0x76, 0x56, 0xce, 0x2c, 0x02, 0xb8, 0x21, 0x8a, - 0x3c, 0x96, 0x8b, 0x0d, 0xbc, 0x9b, 0x60, 0x1e, 0x9b, 0x1b, 0x60, 0xfe, 0xd4, 0x2a, 0x0f, 0x19, - 0xe5, 0x18, 0xae, 0x82, 0x99, 0x94, 0x5c, 0xd2, 0xaa, 0x5a, 0x6d, 0x6e, 0xb9, 0x6c, 0xa9, 0x8e, - 0x6d, 0xa5, 0x2c, 0x67, 0x6a, 0xff, 0xb0, 0x52, 0x68, 0x64, 0x0c, 0xb3, 0x0c, 0x74, 0x29, 0xb9, - 0xce, 0x5a, 0x49, 0x80, 0xef, 0x78, 0x1e, 0x4b, 0x68, 0xec, 0xa0, 0x00, 0x51, 0x0f, 0x73, 0xf3, - 0xb3, 0x06, 0xcc, 0xc1, 0xdb, 0x3d, 0x03, 0x7b, 0x1a, 0xf8, 0xbf, 0x2d, 0x11, 0x4d, 0x94, 0x42, - 0x9a, 0x6e, 0x86, 0x29, 0x69, 0xd5, 0xc9, 0xda, 0xdc, 0xf2, 0x39, 0x2b, 0xcd, 0xc4, 0x12, 0x99, - 0x58, 0x59, 0x26, 0xd6, 0x1a, 0x23, 0xd4, 0xb9, 0x2d, 0xfc, 0xfc, 0x3a, 0xac, 0xfc, 0xd3, 0x45, - 0xed, 0x60, 0xd5, 0x14, 0x6e, 0xb9, 0xf9, 0xee, 0x7b, 0xa5, 0xe6, 0x93, 0x78, 0x27, 0x71, 0x2d, - 0x8f, 0xb5, 0xed, 0x2c, 0xd0, 0xf4, 0xe7, 0x2a, 0x6f, 0x3d, 0xb3, 0xe3, 0x6e, 0x88, 0xb9, 0x14, - 0xe0, 0x8d, 0x85, 0xb6, 0xd2, 0xbc, 0x0e, 0x4a, 0xd2, 0xfb, 0x1a, 0x89, 0xbc, 0x24, 0x40, 0x31, - 0xa1, 0xfe, 0x66, 0x12, 0x86, 0x01, 0xc1, 0xdc, 0x7c, 0xa3, 0x81, 0xea, 0xa0, 0xcd, 0xde, 0xb1, - 0x56, 0xc0, 0x94, 0x08, 0x32, 0x4b, 0x75, 0xc8, 0x11, 0xd2, 0x48, 0x25, 0x58, 0x92, 0x12, 0xde, - 0x2a, 0x4d, 0x8c, 0x4a, 0x4a, 0x78, 0xcb, 0xdc, 0x02, 0x45, 0xe9, 0xe6, 0x1e, 0xeb, 0x3c, 0x61, - 0xeb, 0x84, 0xc6, 0x9b, 0xf2, 0xe6, 0xe0, 0x2d, 0x00, 0x3c, 0x16, 0x04, 0x28, 0xc6, 0x11, 0x0a, - 0x46, 0xf5, 0xd1, 0x47, 0x31, 0x37, 0x40, 0x59, 0x25, 0xdc, 0x3b, 0x62, 0x1d, 0x4c, 0xfa, 0xac, - 0x33, 0xaa, 0xb2, 0xc0, 0x9a, 0xaf, 0x27, 0x00, 0x7c, 0x48, 0x76, 0x13, 0xd2, 0x22, 0x71, 0xb7, - 0x21, 0xde, 0xfd, 0x7d, 0xba, 0xcd, 0xe0, 0x16, 0xf8, 0x2f, 0xc8, 0x57, 0x9b, 0x91, 0x58, 0x96, - 0xaa, 0xb3, 0x8e, 0x25, 0xa8, 0xdf, 0x0e, 0x2b, 0x17, 0x47, 0xb8, 0xcf, 0xbb, 0xd8, 0x6b, 0xfc, - 0x1b, 0x9c, 0x12, 0x87, 0xeb, 0x00, 0x24, 0x61, 0x88, 0xa3, 0xa6, 0x8b, 0x68, 0x1a, 0xeb, 0xf8, - 0x9a, 0xb3, 0x52, 0xc1, 0x41, 0xb4, 0x25, 0xe4, 0x02, 0xf6, 0x3c, 0x97, 0x9b, 0xfc, 0x3b, 0x39, - 0xa9, 0x20, 0xe4, 0xcc, 0x2a, 0x30, 0x64, 0xc0, 0x67, 0x13, 0xc9, 0x9b, 0x16, 0x83, 0xca, 0x40, - 0x44, 0x76, 0x0b, 0x0e, 0x98, 0x22, 0x74, 0x9b, 0x65, 0xd7, 0x50, 0x53, 0xb7, 0xef, 0x59, 0x7e, - 0xfe, 0x84, 0x04, 0x77, 0xf9, 0xfd, 0x34, 0x98, 0x96, 0x75, 0xe0, 0x2b, 0x0d, 0xcc, 0xa4, 0xbd, - 0x0e, 0x07, 0x48, 0x9d, 0x1d, 0x2d, 0xfa, 0xe2, 0x08, 0xc8, 0xd4, 0xad, 0x79, 0xe1, 0xe5, 0x97, - 0x9f, 0x7b, 0x13, 0x06, 0x2c, 0xdb, 0x43, 0xe6, 0x18, 0xfc, 0xa4, 0x81, 0x05, 0xe5, 0xd4, 0x80, - 0x4b, 0x43, 0x4a, 0x29, 0x19, 0xfa, 0xcd, 0x71, 0x19, 0x3d, 0xaf, 0x75, 0xe9, 0xf5, 0x0a, 0x5c, - 0x54, 0x78, 0x55, 0x4f, 0x2c, 0xf8, 0x41, 0x03, 0xf3, 0x8a, 0xa9, 0x00, 0xad, 0x21, 0x26, 0x14, - 0x78, 0xfd, 0xc6, 0x78, 0xf8, 0x9e, 0x65, 0x5b, 0x5a, 0x5e, 0x84, 0x97, 0x14, 0x96, 0xbd, 0x13, - 0x5e, 0x93, 0xe7, 0xc6, 0x3e, 0x6a, 0xca, 0x86, 0xbc, 0x36, 0xa4, 0xfe, 0xc0, 0xd7, 0xaa, 0x5f, - 0x1f, 0x93, 0x35, 0x82, 0xe9, 0x3f, 0xc6, 0x42, 0x53, 0x3c, 0x57, 0xe7, 0xc1, 0xfe, 0x91, 0xa1, - 0x1d, 0x1c, 0x19, 0xda, 0x8f, 0x23, 0x43, 0x7b, 0x7b, 0x6c, 0x14, 0x0e, 0x8e, 0x8d, 0xc2, 0xd7, - 0x63, 0xa3, 0xf0, 0x74, 0xa9, 0xaf, 0x09, 0x1f, 0x49, 0xb1, 0xb5, 0x1d, 0x44, 0x68, 0x2e, 0xfc, - 0xa2, 0x5f, 0x5a, 0xb6, 0xa4, 0x3b, 0x23, 0xbf, 0x99, 0x2b, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, - 0xec, 0x4c, 0xa2, 0xce, 0x10, 0x08, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Parameters queries the parameters of the x/stablecoin module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) - // ModuleAccountBalances queries the account balance of x/stablecoin. - ModuleAccountBalances(ctx context.Context, in *QueryModuleAccountBalances, opts ...grpc.CallOption) (*QueryModuleAccountBalancesResponse, error) - CirculatingSupplies(ctx context.Context, in *QueryCirculatingSupplies, opts ...grpc.CallOption) (*QueryCirculatingSuppliesResponse, error) - LiquidityRatioInfo(ctx context.Context, in *QueryLiquidityRatioInfoRequest, opts ...grpc.CallOption) (*QueryLiquidityRatioInfoResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) ModuleAccountBalances(ctx context.Context, in *QueryModuleAccountBalances, opts ...grpc.CallOption) (*QueryModuleAccountBalancesResponse, error) { - out := new(QueryModuleAccountBalancesResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Query/ModuleAccountBalances", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) CirculatingSupplies(ctx context.Context, in *QueryCirculatingSupplies, opts ...grpc.CallOption) (*QueryCirculatingSuppliesResponse, error) { - out := new(QueryCirculatingSuppliesResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Query/CirculatingSupplies", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) LiquidityRatioInfo(ctx context.Context, in *QueryLiquidityRatioInfoRequest, opts ...grpc.CallOption) (*QueryLiquidityRatioInfoResponse, error) { - out := new(QueryLiquidityRatioInfoResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Query/LiquidityRatioInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Parameters queries the parameters of the x/stablecoin module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) - // ModuleAccountBalances queries the account balance of x/stablecoin. - ModuleAccountBalances(context.Context, *QueryModuleAccountBalances) (*QueryModuleAccountBalancesResponse, error) - CirculatingSupplies(context.Context, *QueryCirculatingSupplies) (*QueryCirculatingSuppliesResponse, error) - LiquidityRatioInfo(context.Context, *QueryLiquidityRatioInfoRequest) (*QueryLiquidityRatioInfoResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} -func (*UnimplementedQueryServer) ModuleAccountBalances(ctx context.Context, req *QueryModuleAccountBalances) (*QueryModuleAccountBalancesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModuleAccountBalances not implemented") -} -func (*UnimplementedQueryServer) CirculatingSupplies(ctx context.Context, req *QueryCirculatingSupplies) (*QueryCirculatingSuppliesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CirculatingSupplies not implemented") -} -func (*UnimplementedQueryServer) LiquidityRatioInfo(ctx context.Context, req *QueryLiquidityRatioInfoRequest) (*QueryLiquidityRatioInfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LiquidityRatioInfo not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_ModuleAccountBalances_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryModuleAccountBalances) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).ModuleAccountBalances(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Query/ModuleAccountBalances", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).ModuleAccountBalances(ctx, req.(*QueryModuleAccountBalances)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_CirculatingSupplies_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryCirculatingSupplies) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).CirculatingSupplies(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Query/CirculatingSupplies", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).CirculatingSupplies(ctx, req.(*QueryCirculatingSupplies)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_LiquidityRatioInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryLiquidityRatioInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).LiquidityRatioInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Query/LiquidityRatioInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).LiquidityRatioInfo(ctx, req.(*QueryLiquidityRatioInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.stablecoin.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - { - MethodName: "ModuleAccountBalances", - Handler: _Query_ModuleAccountBalances_Handler, - }, - { - MethodName: "CirculatingSupplies", - Handler: _Query_CirculatingSupplies_Handler, - }, - { - MethodName: "LiquidityRatioInfo", - Handler: _Query_LiquidityRatioInfo_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/stablecoin/v1/query.proto", -} - -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryModuleAccountBalances) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryModuleAccountBalances) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryModuleAccountBalances) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryModuleAccountBalancesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryModuleAccountBalancesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryModuleAccountBalancesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ModuleAccountBalances) > 0 { - for iNdEx := len(m.ModuleAccountBalances) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.ModuleAccountBalances[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryCirculatingSupplies) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryCirculatingSupplies) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryCirculatingSupplies) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryCirculatingSuppliesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryCirculatingSuppliesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryCirculatingSuppliesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Nusd.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Nibi.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryGovToMintStable) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryGovToMintStable) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryGovToMintStable) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Collateral.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryGovToMintStableResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryGovToMintStableResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryGovToMintStableResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Gov.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *LiquidityRatioInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *LiquidityRatioInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *LiquidityRatioInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.LowerBand.Size() - i -= size - if _, err := m.LowerBand.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.UpperBand.Size() - i -= size - if _, err := m.UpperBand.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.LiquidityRatio.Size() - i -= size - if _, err := m.LiquidityRatio.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryLiquidityRatioInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryLiquidityRatioInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryLiquidityRatioInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryLiquidityRatioInfoResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryLiquidityRatioInfoResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryLiquidityRatioInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Info.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryModuleAccountBalances) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryModuleAccountBalancesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.ModuleAccountBalances) > 0 { - for _, e := range m.ModuleAccountBalances { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryCirculatingSupplies) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryCirculatingSuppliesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Nibi.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.Nusd.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryGovToMintStable) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Collateral.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryGovToMintStableResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Gov.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *LiquidityRatioInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.LiquidityRatio.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.UpperBand.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.LowerBand.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryLiquidityRatioInfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryLiquidityRatioInfoResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Info.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryModuleAccountBalances) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryModuleAccountBalances: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryModuleAccountBalances: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryModuleAccountBalancesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryModuleAccountBalancesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryModuleAccountBalancesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ModuleAccountBalances", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ModuleAccountBalances = append(m.ModuleAccountBalances, types.Coin{}) - if err := m.ModuleAccountBalances[len(m.ModuleAccountBalances)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryCirculatingSupplies) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryCirculatingSupplies: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryCirculatingSupplies: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryCirculatingSuppliesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryCirculatingSuppliesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryCirculatingSuppliesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Nibi", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Nibi.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Nusd", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Nusd.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryGovToMintStable) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryGovToMintStable: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryGovToMintStable: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Collateral", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Collateral.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryGovToMintStableResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryGovToMintStableResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryGovToMintStableResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Gov", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Gov.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *LiquidityRatioInfo) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: LiquidityRatioInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: LiquidityRatioInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LiquidityRatio", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LiquidityRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpperBand", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UpperBand.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LowerBand", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.LowerBand.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryLiquidityRatioInfoRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryLiquidityRatioInfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryLiquidityRatioInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryLiquidityRatioInfoResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryLiquidityRatioInfoResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryLiquidityRatioInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Info.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/stablecoin/types/query.pb.gw.go b/x/stablecoin/types/query.pb.gw.go deleted file mode 100644 index 8f967bbc3..000000000 --- a/x/stablecoin/types/query.pb.gw.go +++ /dev/null @@ -1,348 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/stablecoin/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_ModuleAccountBalances_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryModuleAccountBalances - var metadata runtime.ServerMetadata - - msg, err := client.ModuleAccountBalances(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_ModuleAccountBalances_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryModuleAccountBalances - var metadata runtime.ServerMetadata - - msg, err := server.ModuleAccountBalances(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_CirculatingSupplies_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCirculatingSupplies - var metadata runtime.ServerMetadata - - msg, err := client.CirculatingSupplies(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_CirculatingSupplies_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCirculatingSupplies - var metadata runtime.ServerMetadata - - msg, err := server.CirculatingSupplies(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_LiquidityRatioInfo_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryLiquidityRatioInfoRequest - var metadata runtime.ServerMetadata - - msg, err := client.LiquidityRatioInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_LiquidityRatioInfo_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryLiquidityRatioInfoRequest - var metadata runtime.ServerMetadata - - msg, err := server.LiquidityRatioInfo(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ModuleAccountBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_ModuleAccountBalances_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ModuleAccountBalances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_CirculatingSupplies_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_CirculatingSupplies_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CirculatingSupplies_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_LiquidityRatioInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_LiquidityRatioInfo_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_LiquidityRatioInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_ModuleAccountBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_ModuleAccountBalances_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_ModuleAccountBalances_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_CirculatingSupplies_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_CirculatingSupplies_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CirculatingSupplies_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_LiquidityRatioInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_LiquidityRatioInfo_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_LiquidityRatioInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "stablecoin", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_ModuleAccountBalances_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "module_account_balance"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_CirculatingSupplies_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "circulating_supplies"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_LiquidityRatioInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "liquidity_ratio_info"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage - - forward_Query_ModuleAccountBalances_0 = runtime.ForwardResponseMessage - - forward_Query_CirculatingSupplies_0 = runtime.ForwardResponseMessage - - forward_Query_LiquidityRatioInfo_0 = runtime.ForwardResponseMessage -) diff --git a/x/stablecoin/types/tx.pb.go b/x/stablecoin/types/tx.pb.go deleted file mode 100644 index 598f15437..000000000 --- a/x/stablecoin/types/tx.pb.go +++ /dev/null @@ -1,2228 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/stablecoin/v1/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// MsgMintStable: Msg to mint NUSD. A user deposits NIBI and collateral and gets -// NUSD in return. The amount of NUSD received depends on the current price set -// by the oracle library and the current collateral ratio for the protocol. -type MsgMintStable struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Stable types.Coin `protobuf:"bytes,2,opt,name=stable,proto3" json:"stable"` -} - -func (m *MsgMintStable) Reset() { *m = MsgMintStable{} } -func (m *MsgMintStable) String() string { return proto.CompactTextString(m) } -func (*MsgMintStable) ProtoMessage() {} -func (*MsgMintStable) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{0} -} -func (m *MsgMintStable) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMintStable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMintStable.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMintStable) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMintStable.Merge(m, src) -} -func (m *MsgMintStable) XXX_Size() int { - return m.Size() -} -func (m *MsgMintStable) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMintStable.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMintStable proto.InternalMessageInfo - -func (m *MsgMintStable) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *MsgMintStable) GetStable() types.Coin { - if m != nil { - return m.Stable - } - return types.Coin{} -} - -// MsgMintStableResponse specifies the amount of NUSD token the user will -// receive after their mint transaction -type MsgMintStableResponse struct { - Stable types.Coin `protobuf:"bytes,1,opt,name=stable,proto3" json:"stable"` - UsedCoins github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=used_coins,json=usedCoins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"used_coins"` - FeesPayed github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=fees_payed,json=feesPayed,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"fees_payed"` -} - -func (m *MsgMintStableResponse) Reset() { *m = MsgMintStableResponse{} } -func (m *MsgMintStableResponse) String() string { return proto.CompactTextString(m) } -func (*MsgMintStableResponse) ProtoMessage() {} -func (*MsgMintStableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{1} -} -func (m *MsgMintStableResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgMintStableResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgMintStableResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgMintStableResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgMintStableResponse.Merge(m, src) -} -func (m *MsgMintStableResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgMintStableResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgMintStableResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgMintStableResponse proto.InternalMessageInfo - -func (m *MsgMintStableResponse) GetStable() types.Coin { - if m != nil { - return m.Stable - } - return types.Coin{} -} - -func (m *MsgMintStableResponse) GetUsedCoins() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.UsedCoins - } - return nil -} - -func (m *MsgMintStableResponse) GetFeesPayed() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.FeesPayed - } - return nil -} - -// MsgBurnStable allows users to burn NUSD in exchange for NIBI and collateral. -// The amount of NIBI and Collateral received depends on the current price set by -// the x/oracle library and the current collateral ratio. -type MsgBurnStable struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Stable types.Coin `protobuf:"bytes,2,opt,name=stable,proto3" json:"stable"` -} - -func (m *MsgBurnStable) Reset() { *m = MsgBurnStable{} } -func (m *MsgBurnStable) String() string { return proto.CompactTextString(m) } -func (*MsgBurnStable) ProtoMessage() {} -func (*MsgBurnStable) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{2} -} -func (m *MsgBurnStable) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBurnStable) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBurnStable.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBurnStable) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBurnStable.Merge(m, src) -} -func (m *MsgBurnStable) XXX_Size() int { - return m.Size() -} -func (m *MsgBurnStable) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBurnStable.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBurnStable proto.InternalMessageInfo - -func (m *MsgBurnStable) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *MsgBurnStable) GetStable() types.Coin { - if m != nil { - return m.Stable - } - return types.Coin{} -} - -// MsgBurnStableResponse specifies the amount of collateral and governance -// token the user will receive after their burn transaction. -type MsgBurnStableResponse struct { - Collateral types.Coin `protobuf:"bytes,1,opt,name=collateral,proto3" json:"collateral"` - Gov types.Coin `protobuf:"bytes,2,opt,name=gov,proto3" json:"gov"` - FeesPayed github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=fees_payed,json=feesPayed,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"fees_payed"` -} - -func (m *MsgBurnStableResponse) Reset() { *m = MsgBurnStableResponse{} } -func (m *MsgBurnStableResponse) String() string { return proto.CompactTextString(m) } -func (*MsgBurnStableResponse) ProtoMessage() {} -func (*MsgBurnStableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{3} -} -func (m *MsgBurnStableResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBurnStableResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBurnStableResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBurnStableResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBurnStableResponse.Merge(m, src) -} -func (m *MsgBurnStableResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgBurnStableResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBurnStableResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBurnStableResponse proto.InternalMessageInfo - -func (m *MsgBurnStableResponse) GetCollateral() types.Coin { - if m != nil { - return m.Collateral - } - return types.Coin{} -} - -func (m *MsgBurnStableResponse) GetGov() types.Coin { - if m != nil { - return m.Gov - } - return types.Coin{} -} - -func (m *MsgBurnStableResponse) GetFeesPayed() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.FeesPayed - } - return nil -} - -// MsgRecollateralize -type MsgRecollateralize struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - Coll types.Coin `protobuf:"bytes,2,opt,name=coll,proto3" json:"coll"` -} - -func (m *MsgRecollateralize) Reset() { *m = MsgRecollateralize{} } -func (m *MsgRecollateralize) String() string { return proto.CompactTextString(m) } -func (*MsgRecollateralize) ProtoMessage() {} -func (*MsgRecollateralize) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{4} -} -func (m *MsgRecollateralize) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRecollateralize) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRecollateralize.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRecollateralize) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRecollateralize.Merge(m, src) -} -func (m *MsgRecollateralize) XXX_Size() int { - return m.Size() -} -func (m *MsgRecollateralize) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRecollateralize.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRecollateralize proto.InternalMessageInfo - -func (m *MsgRecollateralize) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *MsgRecollateralize) GetColl() types.Coin { - if m != nil { - return m.Coll - } - return types.Coin{} -} - -// MsgRecollateralizeResponse is the output of a successful 'Recollateralize' -type MsgRecollateralizeResponse struct { - // Gov (sdk.Coin): Tokens rewarded to the caller in exchange for her - // collateral. - Gov types.Coin `protobuf:"bytes,1,opt,name=gov,proto3" json:"gov"` -} - -func (m *MsgRecollateralizeResponse) Reset() { *m = MsgRecollateralizeResponse{} } -func (m *MsgRecollateralizeResponse) String() string { return proto.CompactTextString(m) } -func (*MsgRecollateralizeResponse) ProtoMessage() {} -func (*MsgRecollateralizeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{5} -} -func (m *MsgRecollateralizeResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgRecollateralizeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgRecollateralizeResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgRecollateralizeResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgRecollateralizeResponse.Merge(m, src) -} -func (m *MsgRecollateralizeResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgRecollateralizeResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgRecollateralizeResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgRecollateralizeResponse proto.InternalMessageInfo - -func (m *MsgRecollateralizeResponse) GetGov() types.Coin { - if m != nil { - return m.Gov - } - return types.Coin{} -} - -// MsgBuyback -type MsgBuyback struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - // Gov (sdk.Coin): Tokens the caller wants to sell to the protocol in exchange - // for collateral. - Gov types.Coin `protobuf:"bytes,2,opt,name=gov,proto3" json:"gov"` -} - -func (m *MsgBuyback) Reset() { *m = MsgBuyback{} } -func (m *MsgBuyback) String() string { return proto.CompactTextString(m) } -func (*MsgBuyback) ProtoMessage() {} -func (*MsgBuyback) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{6} -} -func (m *MsgBuyback) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBuyback) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBuyback.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBuyback) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBuyback.Merge(m, src) -} -func (m *MsgBuyback) XXX_Size() int { - return m.Size() -} -func (m *MsgBuyback) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBuyback.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBuyback proto.InternalMessageInfo - -func (m *MsgBuyback) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *MsgBuyback) GetGov() types.Coin { - if m != nil { - return m.Gov - } - return types.Coin{} -} - -// MsgBuybackResponse is the output of a successful 'Buyback' -type MsgBuybackResponse struct { - // Coll (sdk.Coin): Tokens sold to the caller in exchange for her collateral. - Coll types.Coin `protobuf:"bytes,1,opt,name=coll,proto3" json:"coll"` -} - -func (m *MsgBuybackResponse) Reset() { *m = MsgBuybackResponse{} } -func (m *MsgBuybackResponse) String() string { return proto.CompactTextString(m) } -func (*MsgBuybackResponse) ProtoMessage() {} -func (*MsgBuybackResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7c52aa4b3b498950, []int{7} -} -func (m *MsgBuybackResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBuybackResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBuybackResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBuybackResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBuybackResponse.Merge(m, src) -} -func (m *MsgBuybackResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgBuybackResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBuybackResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBuybackResponse proto.InternalMessageInfo - -func (m *MsgBuybackResponse) GetColl() types.Coin { - if m != nil { - return m.Coll - } - return types.Coin{} -} - -func init() { - proto.RegisterType((*MsgMintStable)(nil), "nibiru.stablecoin.v1.MsgMintStable") - proto.RegisterType((*MsgMintStableResponse)(nil), "nibiru.stablecoin.v1.MsgMintStableResponse") - proto.RegisterType((*MsgBurnStable)(nil), "nibiru.stablecoin.v1.MsgBurnStable") - proto.RegisterType((*MsgBurnStableResponse)(nil), "nibiru.stablecoin.v1.MsgBurnStableResponse") - proto.RegisterType((*MsgRecollateralize)(nil), "nibiru.stablecoin.v1.MsgRecollateralize") - proto.RegisterType((*MsgRecollateralizeResponse)(nil), "nibiru.stablecoin.v1.MsgRecollateralizeResponse") - proto.RegisterType((*MsgBuyback)(nil), "nibiru.stablecoin.v1.MsgBuyback") - proto.RegisterType((*MsgBuybackResponse)(nil), "nibiru.stablecoin.v1.MsgBuybackResponse") -} - -func init() { proto.RegisterFile("nibiru/stablecoin/v1/tx.proto", fileDescriptor_7c52aa4b3b498950) } - -var fileDescriptor_7c52aa4b3b498950 = []byte{ - // 580 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x95, 0x31, 0x6f, 0x13, 0x31, - 0x14, 0xc7, 0xe3, 0x24, 0x6a, 0xd5, 0x87, 0x10, 0xd2, 0xa9, 0x48, 0xe9, 0x51, 0xae, 0xe1, 0x58, - 0x22, 0xa1, 0xda, 0x49, 0x3b, 0x30, 0x22, 0xa5, 0x13, 0x48, 0x01, 0x14, 0x26, 0x58, 0x2a, 0xdf, - 0xc5, 0x5c, 0x4d, 0x13, 0x3b, 0x3a, 0x3b, 0x51, 0xc3, 0xd8, 0x4f, 0x50, 0x89, 0x99, 0x1d, 0xf1, - 0x49, 0x3a, 0x56, 0x62, 0x61, 0x02, 0x94, 0xf0, 0x1d, 0x58, 0x91, 0x9d, 0x4b, 0x72, 0x6d, 0xda, - 0xe3, 0x32, 0x94, 0x29, 0x4e, 0xfc, 0x7f, 0xef, 0xfd, 0xde, 0xff, 0xd9, 0x0e, 0x3c, 0x14, 0x3c, - 0xe0, 0xf1, 0x80, 0x28, 0x4d, 0x83, 0x2e, 0x0b, 0x25, 0x17, 0x64, 0xd8, 0x20, 0xfa, 0x04, 0xf7, - 0x63, 0xa9, 0xa5, 0xb3, 0x39, 0xdd, 0xc6, 0x8b, 0x6d, 0x3c, 0x6c, 0xb8, 0x5e, 0x28, 0x55, 0x4f, - 0x2a, 0x12, 0x50, 0xc5, 0xc8, 0xb0, 0x11, 0x30, 0x4d, 0x1b, 0xc4, 0x6e, 0xda, 0x28, 0x77, 0x33, - 0x92, 0x91, 0xb4, 0x4b, 0x62, 0x56, 0xc9, 0xaf, 0xdb, 0x91, 0x94, 0x51, 0x97, 0x11, 0xda, 0xe7, - 0x84, 0x0a, 0x21, 0x35, 0xd5, 0x5c, 0x0a, 0x35, 0xdd, 0xf5, 0x03, 0xb8, 0xdb, 0x52, 0x51, 0x8b, - 0x0b, 0xfd, 0xc6, 0xd6, 0x72, 0x2a, 0xb0, 0x1e, 0xc6, 0x8c, 0x6a, 0x19, 0x57, 0x50, 0x15, 0xd5, - 0x36, 0xda, 0xb3, 0xaf, 0xce, 0x53, 0x58, 0x9b, 0xf2, 0x54, 0x8a, 0x55, 0x54, 0xbb, 0xb3, 0xb7, - 0x85, 0xa7, 0x3c, 0xd8, 0xf0, 0xe0, 0x84, 0x07, 0x1f, 0x48, 0x2e, 0x9a, 0xe5, 0xf3, 0x1f, 0x3b, - 0x85, 0x76, 0x22, 0xf7, 0xbf, 0x14, 0xe1, 0xfe, 0xa5, 0x22, 0x6d, 0xa6, 0xfa, 0x52, 0x28, 0x96, - 0x4a, 0x89, 0x56, 0x4a, 0xe9, 0x7c, 0x00, 0x18, 0x28, 0xd6, 0x39, 0x34, 0xdd, 0xab, 0x4a, 0xb1, - 0x5a, 0xca, 0x0e, 0xae, 0x9b, 0xe0, 0xaf, 0x3f, 0x77, 0x6a, 0x11, 0xd7, 0x47, 0x83, 0x00, 0x87, - 0xb2, 0x47, 0x12, 0x33, 0xa7, 0x1f, 0xbb, 0xaa, 0x73, 0x4c, 0xf4, 0xa8, 0xcf, 0x94, 0x0d, 0x50, - 0xed, 0x0d, 0x93, 0xde, 0x2e, 0x4d, 0xad, 0xf7, 0x8c, 0xa9, 0xc3, 0x3e, 0x1d, 0xb1, 0x4e, 0xa5, - 0x74, 0x0b, 0xb5, 0x4c, 0xfa, 0xd7, 0x26, 0x7b, 0x32, 0x8e, 0xe6, 0x20, 0x16, 0xb7, 0x37, 0x8e, - 0x3f, 0xc8, 0x8e, 0x63, 0x51, 0x64, 0x3e, 0x8e, 0x67, 0x00, 0xa1, 0xec, 0x76, 0xa9, 0x66, 0x31, - 0xed, 0xe6, 0x1d, 0x49, 0x2a, 0xc4, 0x69, 0x40, 0x29, 0x92, 0xc3, 0xbc, 0x40, 0x46, 0xfb, 0x5f, - 0xdd, 0x0d, 0xc1, 0x69, 0xa9, 0xa8, 0xcd, 0x16, 0xc4, 0xfc, 0x63, 0x96, 0xc5, 0xfb, 0x50, 0x36, - 0xd2, 0xbc, 0xfd, 0x58, 0xb1, 0xff, 0x0a, 0xdc, 0xe5, 0x22, 0x73, 0x8b, 0x13, 0x87, 0x50, 0x7e, - 0x87, 0xfc, 0xb7, 0x00, 0x76, 0x5c, 0xa3, 0x80, 0x86, 0xc7, 0x19, 0xb4, 0xab, 0x9b, 0xef, 0x3f, - 0xb7, 0x86, 0x24, 0xa9, 0xe7, 0x8c, 0xb3, 0xb6, 0xd1, 0x0a, 0x6d, 0xef, 0x7d, 0x2e, 0x43, 0xa9, - 0xa5, 0x22, 0xe7, 0x14, 0x01, 0xa4, 0x9e, 0x93, 0xc7, 0xf8, 0xba, 0xa7, 0x0c, 0x5f, 0x7a, 0x0e, - 0xdc, 0x27, 0x39, 0x44, 0x33, 0x3a, 0xdf, 0x3f, 0xfd, 0xf6, 0xfb, 0x53, 0x71, 0xdb, 0x77, 0xc9, - 0xf2, 0x1b, 0xda, 0xe3, 0x42, 0xef, 0xaa, 0xd0, 0x42, 0xa4, 0x2e, 0xd1, 0xcd, 0x10, 0x0b, 0x51, - 0x06, 0xc4, 0xf2, 0x4d, 0xc9, 0x84, 0x08, 0x06, 0xb1, 0x30, 0x10, 0x67, 0x08, 0xee, 0x5d, 0x3d, - 0x6b, 0xb5, 0x1b, 0x8b, 0x5c, 0x51, 0xba, 0xf5, 0xbc, 0xca, 0x39, 0xd3, 0x23, 0xcb, 0xf4, 0xc0, - 0xdf, 0xba, 0x86, 0x29, 0xb6, 0x31, 0xce, 0x08, 0xd6, 0x67, 0xe7, 0xa8, 0x9a, 0xd1, 0xae, 0x55, - 0xb8, 0xb5, 0x7f, 0x29, 0x72, 0xba, 0x61, 0xb5, 0xcd, 0x17, 0xe7, 0x63, 0x0f, 0x5d, 0x8c, 0x3d, - 0xf4, 0x6b, 0xec, 0xa1, 0xb3, 0x89, 0x57, 0xb8, 0x98, 0x78, 0x85, 0xef, 0x13, 0xaf, 0xf0, 0xae, - 0x9e, 0xba, 0xca, 0x2f, 0x6d, 0xfc, 0xc1, 0x11, 0xe5, 0x62, 0x96, 0xeb, 0x24, 0x9d, 0xcd, 0x5e, - 0xec, 0x60, 0xcd, 0xfe, 0x77, 0xed, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xa1, 0x81, 0x2d, 0x97, - 0x46, 0x07, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // MintStable defines a method for trading a mixture of GOV and COLL to mint - // an equivalent value of stablecoins. - MintStable(ctx context.Context, in *MsgMintStable, opts ...grpc.CallOption) (*MsgMintStableResponse, error) - // BurnStable defines a method for redeeming/burning stablecoins to receive an - // equivalent value as a mixture of governance and collateral tokens. - BurnStable(ctx context.Context, in *MsgBurnStable, opts ...grpc.CallOption) (*MsgBurnStableResponse, error) - // Recollateralize defines a method for manually adding collateral to the - // protocol in exchange for an equivalent stablecoin value in governance tokens - // plus a small bonus. - Recollateralize(ctx context.Context, in *MsgRecollateralize, opts ...grpc.CallOption) (*MsgRecollateralizeResponse, error) - // Buyback defines a method for manually adding NIBI to the protocol - // in exchange for an equivalent stablecoin value in collateral, effectively - // executing a share buyback for Nibiru Chain. The NIBI purchased by the protocol - // is then burned, distributing value to all NIBI hodlers. - Buyback(ctx context.Context, in *MsgBuyback, opts ...grpc.CallOption) (*MsgBuybackResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) MintStable(ctx context.Context, in *MsgMintStable, opts ...grpc.CallOption) (*MsgMintStableResponse, error) { - out := new(MsgMintStableResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Msg/MintStable", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) BurnStable(ctx context.Context, in *MsgBurnStable, opts ...grpc.CallOption) (*MsgBurnStableResponse, error) { - out := new(MsgBurnStableResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Msg/BurnStable", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) Recollateralize(ctx context.Context, in *MsgRecollateralize, opts ...grpc.CallOption) (*MsgRecollateralizeResponse, error) { - out := new(MsgRecollateralizeResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Msg/Recollateralize", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) Buyback(ctx context.Context, in *MsgBuyback, opts ...grpc.CallOption) (*MsgBuybackResponse, error) { - out := new(MsgBuybackResponse) - err := c.cc.Invoke(ctx, "/nibiru.stablecoin.v1.Msg/Buyback", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // MintStable defines a method for trading a mixture of GOV and COLL to mint - // an equivalent value of stablecoins. - MintStable(context.Context, *MsgMintStable) (*MsgMintStableResponse, error) - // BurnStable defines a method for redeeming/burning stablecoins to receive an - // equivalent value as a mixture of governance and collateral tokens. - BurnStable(context.Context, *MsgBurnStable) (*MsgBurnStableResponse, error) - // Recollateralize defines a method for manually adding collateral to the - // protocol in exchange for an equivalent stablecoin value in governance tokens - // plus a small bonus. - Recollateralize(context.Context, *MsgRecollateralize) (*MsgRecollateralizeResponse, error) - // Buyback defines a method for manually adding NIBI to the protocol - // in exchange for an equivalent stablecoin value in collateral, effectively - // executing a share buyback for Nibiru Chain. The NIBI purchased by the protocol - // is then burned, distributing value to all NIBI hodlers. - Buyback(context.Context, *MsgBuyback) (*MsgBuybackResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) MintStable(ctx context.Context, req *MsgMintStable) (*MsgMintStableResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method MintStable not implemented") -} -func (*UnimplementedMsgServer) BurnStable(ctx context.Context, req *MsgBurnStable) (*MsgBurnStableResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method BurnStable not implemented") -} -func (*UnimplementedMsgServer) Recollateralize(ctx context.Context, req *MsgRecollateralize) (*MsgRecollateralizeResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Recollateralize not implemented") -} -func (*UnimplementedMsgServer) Buyback(ctx context.Context, req *MsgBuyback) (*MsgBuybackResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Buyback not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_MintStable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgMintStable) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).MintStable(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Msg/MintStable", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).MintStable(ctx, req.(*MsgMintStable)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_BurnStable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgBurnStable) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).BurnStable(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Msg/BurnStable", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).BurnStable(ctx, req.(*MsgBurnStable)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_Recollateralize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRecollateralize) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).Recollateralize(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Msg/Recollateralize", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).Recollateralize(ctx, req.(*MsgRecollateralize)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_Buyback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgBuyback) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).Buyback(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.stablecoin.v1.Msg/Buyback", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).Buyback(ctx, req.(*MsgBuyback)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.stablecoin.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "MintStable", - Handler: _Msg_MintStable_Handler, - }, - { - MethodName: "BurnStable", - Handler: _Msg_BurnStable_Handler, - }, - { - MethodName: "Recollateralize", - Handler: _Msg_Recollateralize_Handler, - }, - { - MethodName: "Buyback", - Handler: _Msg_Buyback_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/stablecoin/v1/tx.proto", -} - -func (m *MsgMintStable) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMintStable) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMintStable) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Stable.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgMintStableResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgMintStableResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgMintStableResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.FeesPayed) > 0 { - for iNdEx := len(m.FeesPayed) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FeesPayed[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.UsedCoins) > 0 { - for iNdEx := len(m.UsedCoins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.UsedCoins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Stable.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgBurnStable) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBurnStable) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBurnStable) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Stable.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgBurnStableResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBurnStableResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBurnStableResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.FeesPayed) > 0 { - for iNdEx := len(m.FeesPayed) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FeesPayed[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - { - size, err := m.Gov.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Collateral.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgRecollateralize) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRecollateralize) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRecollateralize) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Coll.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgRecollateralizeResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgRecollateralizeResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgRecollateralizeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Gov.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *MsgBuyback) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBuyback) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBuyback) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Gov.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgBuybackResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBuybackResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBuybackResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Coll.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgMintStable) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Stable.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgMintStableResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Stable.Size() - n += 1 + l + sovTx(uint64(l)) - if len(m.UsedCoins) > 0 { - for _, e := range m.UsedCoins { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - if len(m.FeesPayed) > 0 { - for _, e := range m.FeesPayed { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgBurnStable) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Stable.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgBurnStableResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Collateral.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Gov.Size() - n += 1 + l + sovTx(uint64(l)) - if len(m.FeesPayed) > 0 { - for _, e := range m.FeesPayed { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgRecollateralize) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Coll.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgRecollateralizeResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Gov.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgBuyback) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Gov.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgBuybackResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Coll.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgMintStable) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMintStable: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMintStable: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stable", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Stable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgMintStableResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgMintStableResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgMintStableResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stable", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Stable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UsedCoins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UsedCoins = append(m.UsedCoins, types.Coin{}) - if err := m.UsedCoins[len(m.UsedCoins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeesPayed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FeesPayed = append(m.FeesPayed, types.Coin{}) - if err := m.FeesPayed[len(m.FeesPayed)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgBurnStable) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBurnStable: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBurnStable: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Stable", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Stable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgBurnStableResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBurnStableResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBurnStableResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Collateral", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Collateral.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Gov", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Gov.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FeesPayed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FeesPayed = append(m.FeesPayed, types.Coin{}) - if err := m.FeesPayed[len(m.FeesPayed)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgRecollateralize) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRecollateralize: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRecollateralize: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Coll", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Coll.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgRecollateralizeResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgRecollateralizeResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgRecollateralizeResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Gov", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Gov.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgBuyback) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBuyback: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBuyback: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Gov", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Gov.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgBuybackResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBuybackResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBuybackResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Coll", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Coll.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/stablecoin/types/tx.pb.gw.go b/x/stablecoin/types/tx.pb.gw.go deleted file mode 100644 index c4534226b..000000000 --- a/x/stablecoin/types/tx.pb.gw.go +++ /dev/null @@ -1,420 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/stablecoin/v1/tx.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -var ( - filter_Msg_MintStable_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_MintStable_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgMintStable - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_MintStable_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.MintStable(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_MintStable_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgMintStable - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_MintStable_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.MintStable(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_BurnStable_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_BurnStable_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBurnStable - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_BurnStable_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.BurnStable(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_BurnStable_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBurnStable - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_BurnStable_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.BurnStable(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_Recollateralize_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_Recollateralize_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgRecollateralize - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Recollateralize_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Recollateralize(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_Recollateralize_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgRecollateralize - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Recollateralize_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Recollateralize(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_Buyback_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_Buyback_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBuyback - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Buyback_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Buyback(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_Buyback_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBuyback - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Buyback_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Buyback(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". -// UnaryRPC :call MsgServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMsgHandlerFromEndpoint instead. -func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MsgServer) error { - - mux.Handle("POST", pattern_Msg_MintStable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_MintStable_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_MintStable_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_BurnStable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_BurnStable_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_BurnStable_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_Recollateralize_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_Recollateralize_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Recollateralize_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_Buyback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_Buyback_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Buyback_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterMsgHandlerFromEndpoint is same as RegisterMsgHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterMsgHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterMsgHandler(ctx, mux, conn) -} - -// RegisterMsgHandler registers the http handlers for service Msg to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterMsgHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterMsgHandlerClient(ctx, mux, NewMsgClient(conn)) -} - -// RegisterMsgHandlerClient registers the http handlers for service Msg -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MsgClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MsgClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "MsgClient" to call the correct interceptors. -func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MsgClient) error { - - mux.Handle("POST", pattern_Msg_MintStable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_MintStable_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_MintStable_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_BurnStable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_BurnStable_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_BurnStable_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_Recollateralize_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_Recollateralize_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Recollateralize_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_Buyback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_Buyback_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Buyback_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Msg_MintStable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "mint-sc"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_BurnStable_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "burn-sc"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_Recollateralize_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "recoll"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_Buyback_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "stablecoin", "buyback"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Msg_MintStable_0 = runtime.ForwardResponseMessage - - forward_Msg_BurnStable_0 = runtime.ForwardResponseMessage - - forward_Msg_Recollateralize_0 = runtime.ForwardResponseMessage - - forward_Msg_Buyback_0 = runtime.ForwardResponseMessage -) From d713f41dfe17d6d29451ade4d2f0e6d950ce7c59 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 16 Oct 2023 14:24:21 -0500 Subject: [PATCH 04/99] chore(spot): remove spot --- app/encoding.go | 3 +- app/keepers.go | 18 - proto/nibiru/spot/v1/event.proto | 86 - proto/nibiru/spot/v1/genesis.proto | 18 - proto/nibiru/spot/v1/params.proto | 27 - proto/nibiru/spot/v1/pool.proto | 97 - proto/nibiru/spot/v1/query.proto | 282 - proto/nibiru/spot/v1/tx.proto | 120 - x/common/testutil/mock/dex_pool.go | 53 - x/spot/README.md | 374 -- x/spot/client/cli/flags.go | 86 - x/spot/client/cli/query.go | 194 - x/spot/client/cli/tx.go | 334 -- x/spot/client/testutil/cli_test.go | 46 - x/spot/client/testutil/suite.go | 800 --- x/spot/client/testutil/test_helpers.go | 182 - x/spot/genesis.go | 27 - x/spot/genesis_test.go | 53 - x/spot/keeper/balances.go | 35 - x/spot/keeper/balances_test.go | 77 - x/spot/keeper/grpc_query.go | 334 -- x/spot/keeper/grpc_query_test.go | 807 --- x/spot/keeper/keeper.go | 611 --- x/spot/keeper/keeper_test.go | 873 ---- x/spot/keeper/liquidity.go | 156 - x/spot/keeper/liquidity_test.go | 127 - x/spot/keeper/msg_server.go | 166 - x/spot/keeper/msg_server_test.go | 1254 ----- x/spot/keeper/params.go | 18 - x/spot/keeper/params_test.go | 19 - x/spot/keeper/swap.go | 121 - x/spot/keeper/swap_test.go | 399 -- x/spot/math/constant_function.go | 40 - x/spot/math/constant_function_test.go | 59 - x/spot/module.go | 157 - x/spot/module_simulation.go | 33 - x/spot/simulation/operations.go | 441 -- x/spot/types/codec.go | 30 - x/spot/types/constants.go | 37 - x/spot/types/errors.go | 42 - x/spot/types/event.pb.go | 1816 ------- x/spot/types/expected_keepers.go | 53 - x/spot/types/genesis.go | 15 - x/spot/types/genesis.pb.go | 387 -- x/spot/types/genesis_test.go | 37 - x/spot/types/keys.go | 54 - x/spot/types/message.go | 226 - x/spot/types/message_test.go | 350 -- x/spot/types/misc/stabletests.csv | 200 - x/spot/types/params.go | 98 - x/spot/types/params.pb.go | 434 -- x/spot/types/pool.go | 504 -- x/spot/types/pool.pb.go | 1123 ---- x/spot/types/pool_asset.go | 50 - x/spot/types/pool_asset_test.go | 118 - x/spot/types/pool_test.go | 987 ---- x/spot/types/price.go | 22 - x/spot/types/price_test.go | 104 - x/spot/types/query.pb.go | 6584 ------------------------ x/spot/types/query.pb.gw.go | 1614 ------ x/spot/types/shares.go | 242 - x/spot/types/shares_test.go | 499 -- x/spot/types/swap.go | 193 - x/spot/types/swap_test.go | 362 -- x/spot/types/tx.pb.go | 2363 --------- x/spot/types/tx.pb.gw.go | 528 -- x/spot/types/utils.go | 74 - x/spot/types/utils_test.go | 250 - 68 files changed, 2 insertions(+), 27921 deletions(-) delete mode 100644 proto/nibiru/spot/v1/event.proto delete mode 100644 proto/nibiru/spot/v1/genesis.proto delete mode 100644 proto/nibiru/spot/v1/params.proto delete mode 100644 proto/nibiru/spot/v1/pool.proto delete mode 100644 proto/nibiru/spot/v1/query.proto delete mode 100644 proto/nibiru/spot/v1/tx.proto delete mode 100644 x/common/testutil/mock/dex_pool.go delete mode 100644 x/spot/README.md delete mode 100644 x/spot/client/cli/flags.go delete mode 100644 x/spot/client/cli/query.go delete mode 100644 x/spot/client/cli/tx.go delete mode 100644 x/spot/client/testutil/cli_test.go delete mode 100644 x/spot/client/testutil/suite.go delete mode 100644 x/spot/client/testutil/test_helpers.go delete mode 100644 x/spot/genesis.go delete mode 100644 x/spot/genesis_test.go delete mode 100644 x/spot/keeper/balances.go delete mode 100644 x/spot/keeper/balances_test.go delete mode 100644 x/spot/keeper/grpc_query.go delete mode 100644 x/spot/keeper/grpc_query_test.go delete mode 100644 x/spot/keeper/keeper.go delete mode 100644 x/spot/keeper/keeper_test.go delete mode 100644 x/spot/keeper/liquidity.go delete mode 100644 x/spot/keeper/liquidity_test.go delete mode 100644 x/spot/keeper/msg_server.go delete mode 100644 x/spot/keeper/msg_server_test.go delete mode 100644 x/spot/keeper/params.go delete mode 100644 x/spot/keeper/params_test.go delete mode 100644 x/spot/keeper/swap.go delete mode 100644 x/spot/keeper/swap_test.go delete mode 100644 x/spot/math/constant_function.go delete mode 100644 x/spot/math/constant_function_test.go delete mode 100644 x/spot/module.go delete mode 100644 x/spot/module_simulation.go delete mode 100644 x/spot/simulation/operations.go delete mode 100644 x/spot/types/codec.go delete mode 100644 x/spot/types/constants.go delete mode 100644 x/spot/types/errors.go delete mode 100644 x/spot/types/event.pb.go delete mode 100644 x/spot/types/expected_keepers.go delete mode 100644 x/spot/types/genesis.go delete mode 100644 x/spot/types/genesis.pb.go delete mode 100644 x/spot/types/genesis_test.go delete mode 100644 x/spot/types/keys.go delete mode 100644 x/spot/types/message.go delete mode 100644 x/spot/types/message_test.go delete mode 100644 x/spot/types/misc/stabletests.csv delete mode 100644 x/spot/types/params.go delete mode 100644 x/spot/types/params.pb.go delete mode 100644 x/spot/types/pool.go delete mode 100644 x/spot/types/pool.pb.go delete mode 100644 x/spot/types/pool_asset.go delete mode 100644 x/spot/types/pool_asset_test.go delete mode 100644 x/spot/types/pool_test.go delete mode 100644 x/spot/types/price.go delete mode 100644 x/spot/types/price_test.go delete mode 100644 x/spot/types/query.pb.go delete mode 100644 x/spot/types/query.pb.gw.go delete mode 100644 x/spot/types/shares.go delete mode 100644 x/spot/types/shares_test.go delete mode 100644 x/spot/types/swap.go delete mode 100644 x/spot/types/swap_test.go delete mode 100644 x/spot/types/tx.pb.go delete mode 100644 x/spot/types/tx.pb.gw.go delete mode 100644 x/spot/types/utils.go delete mode 100644 x/spot/types/utils_test.go diff --git a/app/encoding.go b/app/encoding.go index b71f4e4c2..2a975476a 100644 --- a/app/encoding.go +++ b/app/encoding.go @@ -1,8 +1,9 @@ package app import ( - "github.com/NibiruChain/nibiru/app/codec" "github.com/cosmos/cosmos-sdk/std" + + "github.com/NibiruChain/nibiru/app/codec" ) type EncodingConfig = codec.EncodingConfig diff --git a/app/keepers.go b/app/keepers.go index 8e36e9669..05059a189 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -107,15 +107,9 @@ import ( oracle "github.com/NibiruChain/nibiru/x/oracle" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" - - "github.com/NibiruChain/nibiru/x/spot" - spotkeeper "github.com/NibiruChain/nibiru/x/spot/keeper" - spottypes "github.com/NibiruChain/nibiru/x/spot/types" - "github.com/NibiruChain/nibiru/x/sudo" "github.com/NibiruChain/nibiru/x/sudo/keeper" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" - tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory" tokenfactorykeeper "github.com/NibiruChain/nibiru/x/tokenfactory/keeper" tokenfactorytypes "github.com/NibiruChain/nibiru/x/tokenfactory/types" @@ -166,7 +160,6 @@ type AppKeepers struct { // Nibiru keepers // --------------- EpochsKeeper epochskeeper.Keeper - SpotKeeper spotkeeper.Keeper OracleKeeper oraclekeeper.Keeper InflationKeeper inflationkeeper.Keeper SudoKeeper keeper.Keeper @@ -205,7 +198,6 @@ func initStoreKeys() ( ibcexported.StoreKey, // nibiru x/ keys - spottypes.StoreKey, oracletypes.StoreKey, epochstypes.StoreKey, inflationtypes.StoreKey, @@ -343,11 +335,6 @@ func (app *NibiruApp) InitKeepers( ) // ---------------------------------- Nibiru Chain x/ keepers - - app.SpotKeeper = spotkeeper.NewKeeper( - appCodec, keys[spottypes.StoreKey], app.GetSubspace(spottypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.DistrKeeper) - app.OracleKeeper = oraclekeeper.NewKeeper(appCodec, keys[oracletypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, distrtypes.ModuleName, ) @@ -575,7 +562,6 @@ func (app *NibiruApp) initAppModules( authzmodule.NewAppModule(appCodec, app.authzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), // Nibiru modules - spot.NewAppModule(appCodec, app.SpotKeeper, app.AccountKeeper, app.BankKeeper), oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.stakingKeeper), @@ -644,7 +630,6 @@ func orderedModuleNames() []string { // -------------------------------------------------------------------- // Native x/ Modules epochstypes.ModuleName, - spottypes.ModuleName, oracletypes.ModuleName, inflationtypes.ModuleName, sudotypes.ModuleName, @@ -758,7 +743,6 @@ func ModuleBasicManager() module.BasicManager { ibctransfer.AppModuleBasic{}, ibctm.AppModuleBasic{}, // native x/ - spot.AppModuleBasic{}, oracle.AppModuleBasic{}, epochs.AppModuleBasic{}, inflation.AppModuleBasic{}, @@ -779,7 +763,6 @@ func ModuleAccPerms() map[string][]string { stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, - spottypes.ModuleName: {authtypes.Minter, authtypes.Burner}, oracletypes.ModuleName: {}, ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, ibcfeetypes.ModuleName: {}, @@ -807,7 +790,6 @@ func initParamsKeeper( paramsKeeper.Subspace(govtypes.ModuleName) paramsKeeper.Subspace(crisistypes.ModuleName) // Nibiru core params keepers | x/ - paramsKeeper.Subspace(spottypes.ModuleName) paramsKeeper.Subspace(epochstypes.ModuleName) paramsKeeper.Subspace(inflationtypes.ModuleName) // ibc params keepers diff --git a/proto/nibiru/spot/v1/event.proto b/proto/nibiru/spot/v1/event.proto deleted file mode 100644 index 3e4788d9a..000000000 --- a/proto/nibiru/spot/v1/event.proto +++ /dev/null @@ -1,86 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "nibiru/spot/v1/pool.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -message EventPoolCreated { - // the address of the user who created the pool - string creator = 1; - - // the create pool fee - repeated cosmos.base.v1beta1.Coin fees = 2 [ (gogoproto.nullable) = false ]; - - // the final state of the pool - nibiru.spot.v1.Pool final_pool = 4 [ (gogoproto.nullable) = false ]; - - // the amount of pool shares that the user received - cosmos.base.v1beta1.Coin final_user_pool_shares = 5 - [ (gogoproto.nullable) = false ]; -} - -message EventPoolJoined { - // the address of the user who joined the pool - string address = 1; - - // the amount of tokens that the user deposited - repeated cosmos.base.v1beta1.Coin tokens_in = 2 - [ (gogoproto.nullable) = false ]; - - // the amount of pool shares that the user received - cosmos.base.v1beta1.Coin pool_shares_out = 3 [ (gogoproto.nullable) = false ]; - - // the amount of tokens remaining for the user - repeated cosmos.base.v1beta1.Coin rem_coins = 4 - [ (gogoproto.nullable) = false ]; - - // the final state of the pool - nibiru.spot.v1.Pool final_pool = 5 [ (gogoproto.nullable) = false ]; - - // the final amount of user pool shares - cosmos.base.v1beta1.Coin final_user_pool_shares = 6 - [ (gogoproto.nullable) = false ]; -} - -message EventPoolExited { - // the address of the user who exited the pool - string address = 1; - - // the amount of pool shares that the user exited with - cosmos.base.v1beta1.Coin pool_shares_in = 2 [ (gogoproto.nullable) = false ]; - - // the amount of tokens returned to the user - repeated cosmos.base.v1beta1.Coin tokens_out = 3 - [ (gogoproto.nullable) = false ]; - - // the amount of fees collected by the pool - repeated cosmos.base.v1beta1.Coin fees = 4 [ (gogoproto.nullable) = false ]; - - // the final state of the pool - nibiru.spot.v1.Pool final_pool = 5 [ (gogoproto.nullable) = false ]; - - // the final amount of user pool shares - cosmos.base.v1beta1.Coin final_user_pool_shares = 6 - [ (gogoproto.nullable) = false ]; -} - -message EventAssetsSwapped { - // the address of the user who swapped tokens - string address = 1; - - // the amount of tokens that the user deposited - cosmos.base.v1beta1.Coin token_in = 2 [ (gogoproto.nullable) = false ]; - - // the amount of tokens that the user received - cosmos.base.v1beta1.Coin token_out = 3 [ (gogoproto.nullable) = false ]; - - // the amount of fees collected by the pool - cosmos.base.v1beta1.Coin fee = 4 [ (gogoproto.nullable) = false ]; - - // the final state of the pool - nibiru.spot.v1.Pool final_pool = 5 [ (gogoproto.nullable) = false ]; -} diff --git a/proto/nibiru/spot/v1/genesis.proto b/proto/nibiru/spot/v1/genesis.proto deleted file mode 100644 index 0d2e222ee..000000000 --- a/proto/nibiru/spot/v1/genesis.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "nibiru/spot/v1/params.proto"; -import "nibiru/spot/v1/pool.proto"; -import "gogoproto/gogo.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -// GenesisState defines the spot module's genesis state. -message GenesisState { - // params defines all the parameters of the module. - nibiru.spot.v1.Params params = 1 [ (gogoproto.nullable) = false ]; - - // pools defines all the pools of the module. - repeated nibiru.spot.v1.Pool pools = 2 [ (gogoproto.nullable) = false ]; -} diff --git a/proto/nibiru/spot/v1/params.proto b/proto/nibiru/spot/v1/params.proto deleted file mode 100644 index d16d71e85..000000000 --- a/proto/nibiru/spot/v1/params.proto +++ /dev/null @@ -1,27 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos_proto/cosmos.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -// Params defines the parameters for the module. -message Params { - option (gogoproto.goproto_stringer) = false; - - // The start pool number, i.e. the first pool number that isn't taken yet. - uint64 starting_pool_number = 1; - - // The cost of creating a pool, taken from the pool creator's account. - repeated cosmos.base.v1beta1.Coin pool_creation_fee = 2 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"pool_creation_fee\"", - (gogoproto.nullable) = false - ]; - - // The assets that can be used to create liquidity pools - repeated string whitelisted_asset = 3; -} diff --git a/proto/nibiru/spot/v1/pool.proto b/proto/nibiru/spot/v1/pool.proto deleted file mode 100644 index d0e67f52d..000000000 --- a/proto/nibiru/spot/v1/pool.proto +++ /dev/null @@ -1,97 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "cosmos_proto/cosmos.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -// Configuration parameters for the pool. -message PoolParams { - string swap_fee = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"swap_fee\"", - (gogoproto.nullable) = false - ]; - - string exit_fee = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.moretags) = "yaml:\"exit_fee\"", - (gogoproto.nullable) = false - ]; - - // Amplification Parameter (A): Larger value of A make the curve better - // resemble a straight line in the center (when pool is near balance). Highly - // volatile assets should use a lower value, while assets that are closer - // together may be best with a higher value. This is only used if the - // pool_type is set to 1 (stableswap) - string A = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"amplification\"", - (gogoproto.nullable) = false - ]; - - nibiru.spot.v1.PoolType pool_type = 4 - [ (gogoproto.moretags) = "yaml:\"pool_type\"" ]; -} - -// - `balancer`: Balancer are pools defined by the equation xy=k, extended by -// the weighs introduced by Balancer. -// - `stableswap`: Stableswap pools are defined by a combination of -// constant-product and constant-sum pool -enum PoolType { - BALANCER = 0; - STABLESWAP = 1; -} - -// Which assets the pool contains. -message PoolAsset { - // Coins we are talking about, - // the denomination must be unique amongst all PoolAssets for this pool. - cosmos.base.v1beta1.Coin token = 1 - [ (gogoproto.moretags) = "yaml:\"token\"", (gogoproto.nullable) = false ]; - // Weight that is not normalized. This weight must be less than 2^50 - string weight = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"weight\"", - (gogoproto.nullable) = false - ]; -} - -message Pool { - option (gogoproto.goproto_getters) = false; - - // The pool id. - uint64 id = 1; - - // The pool account address. - string address = 2 [ (gogoproto.moretags) = "yaml:\"address\"" ]; - - // Fees and other pool-specific parameters. - nibiru.spot.v1.PoolParams pool_params = 3 [ - (gogoproto.moretags) = "yaml:\"pool_params\"", - (gogoproto.nullable) = false - ]; - - // These are assumed to be sorted by denomiation. - // They contain the pool asset and the information about the weight - repeated PoolAsset pool_assets = 4 [ - (gogoproto.moretags) = "yaml:\"pool_assets\"", - (gogoproto.nullable) = false - ]; - - // sum of all non-normalized pool weights - string total_weight = 5 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"total_weight\"", - (gogoproto.nullable) = false - ]; - - // sum of all LP tokens sent out - cosmos.base.v1beta1.Coin total_shares = 6 [ - (gogoproto.moretags) = "yaml:\"total_shares\"", - (gogoproto.nullable) = false - ]; -} diff --git a/proto/nibiru/spot/v1/query.proto b/proto/nibiru/spot/v1/query.proto deleted file mode 100644 index 0bc6ad052..000000000 --- a/proto/nibiru/spot/v1/query.proto +++ /dev/null @@ -1,282 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; -import "cosmos/base/query/v1beta1/pagination.proto"; -import "nibiru/spot/v1/params.proto"; -import "nibiru/spot/v1/pool.proto"; -import "cosmos/base/v1beta1/coin.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -// Query defines the gRPC querier service. -service Query { - // Parameters of the spot module. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/nibiru/spot/params"; - } - - // Next available pool id number. - rpc PoolNumber(QueryPoolNumberRequest) returns (QueryPoolNumberResponse) { - option (google.api.http).get = "/nibiru/spot/pool_number"; - } - - // Fetch a pool by id. - rpc Pool(QueryPoolRequest) returns (QueryPoolResponse) { - option (google.api.http).get = "/nibiru/spot/pool"; - } - - // Returns all pools. - rpc Pools(QueryPoolsRequest) returns (QueryPoolsResponse) { - option (google.api.http).get = "/nibiru/spot/pools"; - } - - // Parameters of a single pool. - rpc PoolParams(QueryPoolParamsRequest) returns (QueryPoolParamsResponse) { - option (google.api.http).get = "/nibiru/spot/pools/{pool_id}/params"; - } - - // Number of pools. - rpc NumPools(QueryNumPoolsRequest) returns (QueryNumPoolsResponse) { - option (google.api.http).get = "/nibiru/spot/num_pools"; - } - - // Total liquidity across all pools. - rpc TotalLiquidity(QueryTotalLiquidityRequest) - returns (QueryTotalLiquidityResponse) { - option (google.api.http).get = "/nibiru/spot/total_liquidity"; - } - - // Total liquidity in a single pool. - rpc TotalPoolLiquidity(QueryTotalPoolLiquidityRequest) - returns (QueryTotalPoolLiquidityResponse) { - option (google.api.http).get = - "/nibiru/spot/pools/{pool_id}/total_pool_liquidity"; - } - - // Total shares in a single pool. - rpc TotalShares(QueryTotalSharesRequest) returns (QueryTotalSharesResponse) { - option (google.api.http).get = "/nibiru/spot/pools/{pool_id}/total_shares"; - } - - // Instantaneous price of an asset in a pool. - rpc SpotPrice(QuerySpotPriceRequest) returns (QuerySpotPriceResponse) { - option (google.api.http).get = "/nibiru/spot/pools/{pool_id}/prices"; - } - - // Estimates the amount of assets returned given an exact amount of tokens to - // swap. - rpc EstimateSwapExactAmountIn(QuerySwapExactAmountInRequest) - returns (QuerySwapExactAmountInResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/swap_exact_amount_in"; - } - - // Estimates the amount of tokens required to return the exact amount of - // assets requested. - rpc EstimateSwapExactAmountOut(QuerySwapExactAmountOutRequest) - returns (QuerySwapExactAmountOutResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/swap_exact_amount_out"; - } - - // Estimates the amount of pool shares returned given an amount of tokens to - // join. - rpc EstimateJoinExactAmountIn(QueryJoinExactAmountInRequest) - returns (QueryJoinExactAmountInResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/join_exact_amount_in"; - } - - // Estimates the amount of tokens required to obtain an exact amount of pool - // shares. - rpc EstimateJoinExactAmountOut(QueryJoinExactAmountOutRequest) - returns (QueryJoinExactAmountOutResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/join_exact_amount_out"; - } - - // Estimates the amount of tokens returned to the user given an exact amount - // of pool shares. - rpc EstimateExitExactAmountIn(QueryExitExactAmountInRequest) - returns (QueryExitExactAmountInResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/exit_exact_amount_in"; - } - - // Estimates the amount of pool shares required to extract an exact amount of - // tokens from the pool. - rpc EstimateExitExactAmountOut(QueryExitExactAmountOutRequest) - returns (QueryExitExactAmountOutResponse) { - option (google.api.http).get = - "/nibiru/spot/{pool_id}/estimate/exit_exact_amount_out"; - } -} - -// QueryParamsRequest is request type for the Query/Params RPC method. -message QueryParamsRequest {} -// QueryParamsResponse is response type for the Query/Params RPC method. -message QueryParamsResponse { - // params holds all the parameters of this module. - nibiru.spot.v1.Params params = 1 [ (gogoproto.nullable) = false ]; -} - -message QueryPoolNumberRequest {} -message QueryPoolNumberResponse { uint64 pool_id = 1; } - -message QueryPoolRequest { uint64 pool_id = 1; } -message QueryPoolResponse { nibiru.spot.v1.Pool pool = 1; } - -message QueryPoolsRequest { - // pagination defines an optional pagination for the request. - cosmos.base.query.v1beta1.PageRequest pagination = 1; -} -message QueryPoolsResponse { - repeated nibiru.spot.v1.Pool pools = 1; - - // pagination defines the pagination in the response. - cosmos.base.query.v1beta1.PageResponse pagination = 2; -} - -message QueryPoolParamsRequest { uint64 pool_id = 1; } -message QueryPoolParamsResponse { nibiru.spot.v1.PoolParams pool_params = 1; } - -message QueryNumPoolsRequest {} -message QueryNumPoolsResponse { uint64 num_pools = 1; } - -// -------------------------------------------- -// Query total liquidity the protocol -message QueryTotalLiquidityRequest {} -message QueryTotalLiquidityResponse { - repeated cosmos.base.v1beta1.Coin liquidity = 1 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"liquidity\"", - (gogoproto.nullable) = false - ]; -} - -// -------------------------------------------- -// Query total liquidity for a pool -message QueryTotalPoolLiquidityRequest { uint64 pool_id = 1; } - -message QueryTotalPoolLiquidityResponse { - repeated cosmos.base.v1beta1.Coin liquidity = 1 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"liquidity\"", - (gogoproto.nullable) = false - ]; -} - -message QueryTotalSharesRequest { uint64 pool_id = 1; } -message QueryTotalSharesResponse { - // sum of all LP tokens sent out - cosmos.base.v1beta1.Coin total_shares = 1 [ - (gogoproto.moretags) = "yaml:\"total_shares\"", - (gogoproto.nullable) = false - ]; -} - -// Returns the amount of tokenInDenom to produce 1 tokenOutDenom -// For example, if the price of NIBI = 9.123 NUSD, then setting -// tokenInDenom=NUSD and tokenOutDenom=NIBI would give "9.123". -message QuerySpotPriceRequest { - uint64 pool_id = 1; - // the denomination of the token you are giving into the pool - string token_in_denom = 2; - // the denomination of the token you are taking out of the pool - string token_out_denom = 3; -} -message QuerySpotPriceResponse { string spot_price = 1; } - -// Given an exact amount of tokens in and a target tokenOutDenom, calculates -// the expected amount of tokens out received from a swap. -message QuerySwapExactAmountInRequest { - uint64 pool_id = 1; - cosmos.base.v1beta1.Coin token_in = 2 [ - (gogoproto.moretags) = "yaml:\"token_in\"", - (gogoproto.nullable) = false - ]; - string token_out_denom = 3; -} -message QuerySwapExactAmountInResponse { - cosmos.base.v1beta1.Coin token_out = 2 [ - (gogoproto.moretags) = "yaml:\"token_out\"", - (gogoproto.nullable) = false - ]; - cosmos.base.v1beta1.Coin fee = 3 - [ (gogoproto.moretags) = "yaml:\"fee\"", (gogoproto.nullable) = false ]; -} - -// Given an exact amount of tokens out and a target tokenInDenom, calculates -// the expected amount of tokens in required to do the swap. -message QuerySwapExactAmountOutRequest { - uint64 pool_id = 1; - cosmos.base.v1beta1.Coin token_out = 2 [ - (gogoproto.moretags) = "yaml:\"token_out\"", - (gogoproto.nullable) = false - ]; - string token_in_denom = 3; -} -message QuerySwapExactAmountOutResponse { - cosmos.base.v1beta1.Coin token_in = 2 [ - (gogoproto.moretags) = "yaml:\"token_in\"", - (gogoproto.nullable) = false - ]; -} - -message QueryJoinExactAmountInRequest { - uint64 pool_id = 1; - repeated cosmos.base.v1beta1.Coin tokens_in = 2 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"tokens_in\"", - (gogoproto.nullable) = false - ]; -} -message QueryJoinExactAmountInResponse { - - // amount of pool shares returned to user after join - string pool_shares_out = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"pool_shares_out\"", - (gogoproto.nullable) = false - ]; - - // coins remaining after pool join - repeated cosmos.base.v1beta1.Coin rem_coins = 2 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"rem_coins\"", - (gogoproto.nullable) = false - ]; -} - -message QueryJoinExactAmountOutRequest { uint64 pool_id = 1; } -message QueryJoinExactAmountOutResponse {} - -message QueryExitExactAmountInRequest { - uint64 pool_id = 1; - // amount of pool shares to return to pool - string pool_shares_in = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.moretags) = "yaml:\"pool_shares_in\"", - (gogoproto.nullable) = false - ]; -} -message QueryExitExactAmountInResponse { - // coins obtained after exiting - repeated cosmos.base.v1beta1.Coin tokens_out = 1 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"tokens_out\"", - (gogoproto.nullable) = false - ]; - - repeated cosmos.base.v1beta1.Coin fees = 2 [ - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", - (gogoproto.moretags) = "yaml:\"fees\"", - (gogoproto.nullable) = false - ]; -} - -message QueryExitExactAmountOutRequest { uint64 pool_id = 1; } -message QueryExitExactAmountOutResponse {} diff --git a/proto/nibiru/spot/v1/tx.proto b/proto/nibiru/spot/v1/tx.proto deleted file mode 100644 index 8e9a3fc1c..000000000 --- a/proto/nibiru/spot/v1/tx.proto +++ /dev/null @@ -1,120 +0,0 @@ -syntax = "proto3"; - -package nibiru.spot.v1; - -import "nibiru/spot/v1/pool.proto"; -import "gogoproto/gogo.proto"; -import "cosmos/base/v1beta1/coin.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/spot/types"; - -// Msg defines the Msg service. -service Msg { - // Used to create a pool. - rpc CreatePool(MsgCreatePool) returns (MsgCreatePoolResponse) { - option (google.api.http).post = "/nibiru/spot/pool"; - } - - // Join a pool as a liquidity provider. - rpc JoinPool(MsgJoinPool) returns (MsgJoinPoolResponse) { - option (google.api.http).post = "/nibiru/spot/{pool_id}/join"; - } - - // Exit a pool position by returning LP shares - rpc ExitPool(MsgExitPool) returns (MsgExitPoolResponse) { - option (google.api.http).post = "/nibiru/spot/{pool_id}/exit"; - } - - // Swap assets in a pool - rpc SwapAssets(MsgSwapAssets) returns (MsgSwapAssetsResponse) { - option (google.api.http).post = "/nibiru/spot/{pool_id}/swap"; - } -} - -message MsgCreatePool { - string creator = 1; - - nibiru.spot.v1.PoolParams pool_params = 2 - [ (gogoproto.moretags) = "yaml:\"pool_params\"" ]; - - repeated nibiru.spot.v1.PoolAsset pool_assets = 3 - [ (gogoproto.nullable) = false ]; -} - -message MsgCreatePoolResponse { uint64 pool_id = 1; } - -/* -Message to join a pool (identified by poolId) with a set of tokens to deposit. -*/ -message MsgJoinPool { - string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; - - uint64 pool_id = 2 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; - - repeated cosmos.base.v1beta1.Coin tokens_in = 3 [ - (gogoproto.moretags) = "yaml:\"tokens_in\"", - (gogoproto.nullable) = false - ]; - - bool use_all_coins = 4 [ (gogoproto.moretags) = "yaml:\"use_all_coins\"" ]; -} - -/* -Response when a user joins a pool. -*/ -message MsgJoinPoolResponse { - // the final state of the pool after a join - nibiru.spot.v1.Pool pool = 1; - - // sum of LP tokens minted from the join - cosmos.base.v1beta1.Coin num_pool_shares_out = 2 [ - (gogoproto.moretags) = "yaml:\"num_pool_shares_out\"", - (gogoproto.nullable) = false - ]; - - // remaining tokens from attempting to join the pool - repeated cosmos.base.v1beta1.Coin remaining_coins = 3 [ - (gogoproto.moretags) = "yaml:\"tokens_in\"", - (gogoproto.nullable) = false - ]; -} - -message MsgExitPool { - string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; - - uint64 pool_id = 2 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; - - cosmos.base.v1beta1.Coin pool_shares = 3 [ - (gogoproto.moretags) = "yaml:\"pool_shares\"", - (gogoproto.nullable) = false - ]; -} - -message MsgExitPoolResponse { - repeated cosmos.base.v1beta1.Coin tokens_out = 3 [ - (gogoproto.moretags) = "yaml:\"tokens_out\"", - (gogoproto.nullable) = false - ]; -} - -message MsgSwapAssets { - string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; - - uint64 pool_id = 2 [ (gogoproto.moretags) = "yaml:\"pool_id\"" ]; - - cosmos.base.v1beta1.Coin token_in = 3 [ - (gogoproto.moretags) = "yaml:\"token_in\"", - (gogoproto.nullable) = false - ]; - - string token_out_denom = 4 - [ (gogoproto.moretags) = "yaml:\"token_out_denom\"" ]; -} - -message MsgSwapAssetsResponse { - cosmos.base.v1beta1.Coin token_out = 3 [ - (gogoproto.moretags) = "yaml:\"token_out\"", - (gogoproto.nullable) = false - ]; -} diff --git a/x/common/testutil/mock/dex_pool.go b/x/common/testutil/mock/dex_pool.go deleted file mode 100644 index 4b8deaf6d..000000000 --- a/x/common/testutil/mock/dex_pool.go +++ /dev/null @@ -1,53 +0,0 @@ -package mock - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// helper function to create dummy test pools -func SpotPool(poolId uint64, assets sdk.Coins, shares int64) types.Pool { - poolAssets := make([]types.PoolAsset, len(assets)) - for i, asset := range assets { - poolAssets[i] = types.PoolAsset{ - Token: asset, - Weight: sdk.OneInt(), - } - } - return types.Pool{ - Id: poolId, - PoolParams: types.PoolParams{ - SwapFee: sdk.SmallestDec(), - ExitFee: sdk.SmallestDec(), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: poolAssets, - TotalShares: sdk.NewInt64Coin(types.GetPoolShareBaseDenom(poolId), shares), - TotalWeight: sdk.NewInt(2), - } -} - -// helper function to create dummy test pools -func SpotStablePool(poolId uint64, assets sdk.Coins, shares int64) types.Pool { - poolAssets := make([]types.PoolAsset, len(assets)) - for i, asset := range assets { - poolAssets[i] = types.PoolAsset{ - Token: asset, - Weight: sdk.OneInt(), - } - } - return types.Pool{ - Id: poolId, - PoolParams: types.PoolParams{ - SwapFee: sdk.ZeroDec(), - ExitFee: sdk.ZeroDec(), - PoolType: types.PoolType_STABLESWAP, - A: sdk.NewInt(100), - }, - PoolAssets: poolAssets, - TotalShares: sdk.NewInt64Coin(types.GetPoolShareBaseDenom(poolId), shares), - TotalWeight: sdk.NewInt(2), - } -} diff --git a/x/spot/README.md b/x/spot/README.md deleted file mode 100644 index 6960e412d..000000000 --- a/x/spot/README.md +++ /dev/null @@ -1,374 +0,0 @@ -# Spot Module - -The x/spot module is responsible for creating, joining, and exiting liquidity pools. It also allows users to swap between two assets in an existing pool. It's a fully functional AMM. - -- [Spot Module](#spot-module) -- [Concepts](#concepts) - - [Pool](#pool) - - [Creation of Pool](#creation-of-pool) - - [Joining Pool](#joining-pool) - - [Exiting Pool](#exiting-pool) - - [Swap](#swap) - - [Spot Price](#spot-price) -- [State](#state) - - [Next Pool Number](#next-pool-number) - - [Pools](#pools) - - [Total Liquidity](#total-liquidity) -- [Messages](#messages) - - [MsgCreatePool](#msgcreatepool) - - [MsgCreatePoolResponse](#msgcreatepoolresponse) - - [MsgJoinPool](#msgjoinpool) - - [MsgJoinPoolResponse](#msgjoinpoolresponse) -- [CLI](#cli) - - [Query](#query) - - [params](#params) - - [get-pool-number](#get-pool-number) - - [get-pool](#get-pool) - - [total-liquidity](#total-liquidity-1) - - [pool-liquidity](#pool-liquidity) - - [Transactions](#transactions) - - [create-pool](#create-pool) - - [join-pool](#join-pool) -- [GRPC and REST](#grpc-and-rest) -- [Parameters](#parameters) - - [StartingPoolNumber](#startingpoolnumber) - - [PoolCreationFee](#poolcreationfee) -- [Events](#events) -- [Hooks](#hooks) - - [Begin Block](#begin-block) - - [End Block](#end-block) -- [Future Improvements](#future-improvements) -- [Acceptance Tests](#acceptance-tests) - -# Concepts - -The `x/spot` module is responsible for for creating, joining, and exiting -liquidity pools that are dictated by an AMM for swaps. - -## Pool - -### Creation of Pool - -When a pool is created, a fixed amount of 100 LP shares is minted and sent to the pool creator. The base pool share denom is in the format of nibiru/pool/{poolId} and is displayed in the format of NIBIRU-POOL-{poolId} to the user. One NIBIRU-POOL-{poolId} token is equivalent to 10^18 nibiru/pool/{poolId} tokens. - -Pool assets are sorted in alphabetical order by defualt. - -### Joining Pool - -When joining a pool, users provide the tokens they are willing to deposit. The application will try to deposit as many tokens as it can while maintaining equal weight ratios across the pool's assets. Usually this means one asset acts as a limiting factor and all other tokens are deposited in proportion to the limited token. - -For example, assume there is a 50/50 pool with 100 `tokenA` and 100 `tokenB`. A user wishes to LP 10 `tokenA` and 5 `tokenB` into the pool. Because `tokenB` is the limiting factor, all of `tokenB` will be deposited and only 5 of `tokenA` will be deposited. The user will be left with 5 `tokenA` and receive LP shares for the liquidity they provided. - -### Exiting Pool - -When exiting the pool, the user also provides the number of LP shares they are returning to the pool, and will receive assets in proportion to the LP shares returned. However, unlike joining a pool, exiting a pool requires the user to pay the exit fee, which is set as the param of the pool. The share of the user gets burnt. - -For example, assume there is a 50/50 pool with 50 `tokenA` and 150 `tokenB` and 200 total LP shares minted. A user wishes to return 20 LP shares to the pool and withdraw their liquidity. Because 20/200 = 10%, the user will receive 5 `tokenA` and 15 `tokenB` from the pool, minus exit fees. - -## Swap - -During the process of swapping a specific asset, the token user is putting into the pool is justified as `tokenIn`, while the token that would be omitted after the swap is justified as `tokenOut` throughout the module. - -Given a tokenIn, the following calculations are done to calculate how much tokens are to be swapped and ommitted from the pool. - -- `tokenBalanceOut * [ 1 - { tokenBalanceIn / (tokenBalanceIn+(1-swapFee) * tokenAmountIn)}^(tokenWeightIn/tokenWeightOut)]` - -The whole process is also able vice versa, the case where user provides tokenOut. The calculation for the amount of token that the user should be putting in is done through the following formula. - -- `tokenBalanceIn * [{tokenBalanceOut / (tokenBalanceOut - tokenAmountOut)}^(tokenWeightOut/tokenWeightIn)-1] / tokenAmountIn` - -### Spot Price - -Meanwhile, calculation of the spot price with a swap fee is done using the following formula - -- `spotPrice / (1-swapFee)` - -where spotPrice is - -- `(tokenBalanceIn / tokenWeightIn) / (tokenBalanceOut / tokenWeightOut)` -# State - -## Next Pool Number - -The spot module stores a monotonically increasing counter denoting the next available integer pool number. Pool numbers start at 1 and increase every time a pool is created. The `Keeper.GetNextPoolNumberAndIncrement` function always fetches the next availble pool number and increments the stored value by 1. - -## Pools - -Serialized protobufs representing pools are stored in the state, with the key 0x02 | poolId. See the [pool proto file](../../../proto/spot/v1/pool.proto) for what fields a pool has. - -## Total Liquidity - -The spot module also stores the total liquidity in the module's account, which is the sum of all assets aggregated across all pools. The total liquidity is updated every time a pool's liquidity is updated (either through creation, joining, exiting, or swaps). - -The total liquidity is stored with key 0x03 | denom. -# Messages - -## MsgCreatePool - -Message to create a pool. Requires parameters specifying swap fee & exit fee, as well as the initial assets to deposit into the pool. The initial assets also determine the target weight of the pool (e.g. 50/50). - -For now we only support two-asset pools, but could expand to >2 assets in the future. - -### MsgCreatePoolResponse - -Contains the poolId. - -## MsgJoinPool - -Message to join a pool. Users specify the poolId they wish to join and the assets they wish to deposit. The number of distinct assets provided by the user must match the number of distinct assets in the pool, or else the message will error. - -### MsgJoinPoolResponse - -Contains the updated pool liquidity, the number of LP shares minted and transferred to the user, and the remaining coins that could not be deposited due to a ratio mismatch (see [Concepts](01_concepts.md)). - -# CLI - -A user can query and interact with the `spot` module using the CLI. - -## Query - -The `query` commands allow users to query `spot` state. - -```bash -nibid query spot --help -``` - -### params - -The `params` command allows users to query genesis parameters for the spot module. - -```bash -nibid query spot params [flags] -``` - -Example: - -```bash -nibid query spot params -``` - -Example Output: - -```bash -params: - pool_creation_fee: - - amount: "1000000000" - denom: unibi - startingPoolNumber: "1" -``` - -### get-pool-number - -The `get-pool-number` command allows users to query the next available pool id number. - -```bash -nibid query spot get-pool-number [flags] -``` - -Example: - -```bash -nibid query spot get-pool-number -``` - -Example Output: - -```bash -poolId: "1" -``` - -### get-pool - -The `get-pool` command allows users to query a pool by id number. - -```bash -nibid query spot get-pool [pool-id] [flags] -``` - -Example: - -```bash -nibid query spot get-pool 1 -``` - -Example Output: - -```bash -pool: - address: nibi1w00c7pqkr5z7ptewg5z87j2ncvxd88w43ug679 - id: "1" - poolAssets: - - token: - amount: "100" - denom: stake - weight: "1073741824" - - token: - amount: "100" - denom: validatortoken - weight: "1073741824" - poolParams: - exitFee: "0.010000000000000000" - swapFee: "0.010000000000000000" - totalShares: - amount: "100000000000000000000" - denom: nibiru/pool/1 - totalWeight: "2147483648" -``` - -### total-liquidity - -The `total-liquidity` command allows users to query the total amount of liquidity in the spot. - -```bash -nibid query spot total-liquidity [flags] -``` - -Example: - -```bash -nibid query spot total-liquidity -``` - -Example Output: - -```bash -liquidity: -- amount: "100" - denom: stake -- amount: "100" - denom: validatortoken -``` - -### pool-liquidity - -The `pool-liquidity` command allows users to query the total amount of liquidity in the spot. - -```bash -nibid query spot pool-liquidity [pool-id] [flags] -``` - -Example: - -```bash -nibid query spot pool-liquidity 1 -``` - -Example Output: - -```bash -liquidity: -- amount: "100" - denom: stake -- amount: "100" - denom: validatortoken -``` - -## Transactions - -The `tx` commands allow users to interact with the `spot` module. - -```bash -nibid tx spot --help -``` - -### create-pool - -The `create-pool` command allows users to create pools. - -```bash -nibid tx spot create-pool [flags] -``` - -Example: - -```bash -nibid tx spot create-pool --pool-file ./new-pool.json -``` - -Where the pool file JSON has format: - -```json -{ - "weights": "1stake,1validatortoken", - "initial-deposit": "100stake,100validatortoken", - "swap-fee": "0.01", - "exit-fee": "0.01" -} -``` - -### join-pool - -The `join-pool` command allows users to join pools with liquidty. - -```bash -nibid tx spot join-pool [flags] -``` - -Example: - -```bash -nibid tx spot join-pool --pool-id 1 --tokens-in 1validatortoken,1stake -``` - -# GRPC and REST - -(): Add gRPC and REST docs. - -# Parameters - -The spot module contains the following parameters: - -| Key | Type | Example | -| ------------------ | --------- | ------------ | -| StartingPoolNumber | uint64 | 1 | -| PoolCreationFee | sdk.Coins | 1000000ubini | - -## StartingPoolNumber - -The initial pool number to start creating pools at. - -## PoolCreationFee - -The amount of coins taken as a fee for creating a pool, from the pool creator's address. -# Events - -| Event Type | Attribute Key | Attribute Value | Attribute Type | -|----------------|-----------------|----------------------------------------------|----------------| -| pool_joined | sender | sender's address | string | -| pool_joined | pool_id | the numeric pool identifier | uint64 | -| pool_joined | tokens_in | the tokens sent by the user | sdk.Coins | -| pool_joined | pool_shares_out | the number of LP tokens returned to the user | sdk.Coin | -| pool_joined | rem_coins | the tokens remaining after joining the pool | sdk.Coins | -| pool_created | sender | sender's address | string | -| pool_created | pool_id | pool identifier | uint64 | -| pool_exited | sender | sender's address | string | -| pool_exited | pool_id | pool identifier | uint64 | -| pool_exited | num_shares_in | number of LP tokens in | sdk.Coin | -| pool_exited | tokens_out | tokens returned to the user | sdk.Coins | -| assets_swapped | sender | sender's address | string | -| assets_swapped | pool_id | pool identifier | uint64 | -| assets_swapped | token_in | token to swap in | sdk.Coin | -| assets_swapped | token_out | token returned to user | sdk.Coin | -# Hooks - -As of this time, there are no hooks into the x/spot module. - -## Begin Block - -Nothing happens in begin block yet. - -## End Block - -Nothing happens in end block yet. - -# Future Improvements - -- Constant product solver for pools with different weights () -- Safe shutdown where the pools freeze and swaps are not possible, but liquidity providers can still redeem their LP shares. - -# Acceptance Tests - -1. create pool -2. join pool -3. swap assets against pool -4. exit pool diff --git a/x/spot/client/cli/flags.go b/x/spot/client/cli/flags.go deleted file mode 100644 index deb5939c9..000000000 --- a/x/spot/client/cli/flags.go +++ /dev/null @@ -1,86 +0,0 @@ -package cli - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - flag "github.com/spf13/pflag" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -const ( - // FlagPoolFile Will be parsed to string. - FlagPoolFile = "pool-file" - - // FlagPoolId Will be parsed to uint64. - FlagPoolId = "pool-id" - - // FlagUseAllCoins Will be parsed to uint64. - FlagUseAllCoins = "use-all-coins" - - // FlagTokensIn Will be parsed to []sdk.Coin. - FlagTokensIn = "tokens-in" - - // FlagPoolSharesOut Will be parsed to sdk.Coin. - FlagPoolSharesOut = "pool-shares-out" - - // FlagTokenIn Will be parsed to sdk.Coin. - FlagTokenIn = "token-in" - - // FlagTokenOutDenom Will be parsed to string. - FlagTokenOutDenom = "token-out-denom" -) - -type createPoolInputs struct { - Weights string `json:"weights"` - InitialDeposit string `json:"initial-deposit"` - SwapFee string `json:"swap-fee"` - ExitFee string `json:"exit-fee"` - PoolType string `json:"pool-type"` - Amplification string `json:"amplification"` -} - -func FlagSetCreatePool() *flag.FlagSet { - fs := flag.NewFlagSet("create-pool", flag.PanicOnError) - - fs.String(FlagPoolFile, "", "Pool json file path") - return fs -} - -func FlagSetJoinPool() *flag.FlagSet { - fs := flag.NewFlagSet("join-pool", flag.PanicOnError) - - fs.Uint64(FlagPoolId, 0, "The id of pool") - fs.StringArray(FlagTokensIn, []string{""}, "Amount of each denom to send into the pool (specify multiple denoms with: --tokens-in=1uusdc --tokens-in=1unusd)") - fs.Bool(FlagUseAllCoins, false, "Whether to use all the tokens in tokens-in to maximize shares out with a swap first") - return fs -} - -func FlagSetExitPool() *flag.FlagSet { - fs := flag.NewFlagSet("exit-pool", flag.ContinueOnError) - - fs.Uint64(FlagPoolId, 0, "The pool id to withdraw from.") - fs.String(FlagPoolSharesOut, "", "The amount of pool share tokens to burn.") - return fs -} - -func FlagSetSwapAssets() *flag.FlagSet { - fs := flag.NewFlagSet("swap-assets", flag.ContinueOnError) - - fs.Uint64(FlagPoolId, 0, "The pool id to withdraw from.") - fs.String(FlagTokenIn, "", "The amount of tokens to swap in.") - fs.String(FlagTokenOutDenom, "", "The denom of the token to extract.") - return fs -} - -func (cpi createPoolInputs) AmplificationInt() (sdkmath.Int, error) { - amplificationInt, ok := sdk.NewIntFromString(cpi.Amplification) - if !ok { - return sdkmath.Int{}, fmt.Errorf( - "%w: %v", types.ErrAmplificationIntable, cpi.Amplification) - } - return amplificationInt, nil -} diff --git a/x/spot/client/cli/query.go b/x/spot/client/cli/query.go deleted file mode 100644 index f5616bc8a..000000000 --- a/x/spot/client/cli/query.go +++ /dev/null @@ -1,194 +0,0 @@ -package cli - -import ( - "context" - "fmt" - "strconv" - "strings" - - "github.com/cosmos/cosmos-sdk/client" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/spot/types" - - "github.com/cosmos/cosmos-sdk/client/flags" -) - -var _ = strconv.Itoa(0) - -// GetQueryCmd returns the cli query commands for this module -func GetQueryCmd() *cobra.Command { - // Group spot queries under a subcommand - spotQueryCmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf( - "Querying commands for the %s module", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - spotQueryCmd.AddCommand( - CmdQueryParams(), - CmdGetPoolNumber(), - CmdGetPool(), - CmdTotalLiquidity(), - CmdTotalPoolLiquidity(), - ) - - return spotQueryCmd -} - -func CmdGetPoolNumber() *cobra.Command { - cmd := &cobra.Command{ - Use: "get-pool-number", - Short: "Returns the next available pool ID", - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - params := &types.QueryPoolNumberRequest{} - - res, err := queryClient.PoolNumber(cmd.Context(), params) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdGetPool() *cobra.Command { - cmd := &cobra.Command{ - Use: "pool [pool-id]", - Short: "Get a pool by its ID", - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - poolId, _ := sdk.NewIntFromString(args[0]) - - queryClient := types.NewQueryClient(clientCtx) - - params := &types.QueryPoolRequest{ - PoolId: poolId.Uint64(), - } - - res, err := queryClient.Pool(cmd.Context(), params) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdQueryParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "shows the parameters of the module", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.Params(context.Background(), &types.QueryParamsRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdTotalLiquidity() *cobra.Command { - cmd := &cobra.Command{ - Use: "total-liquidity", - Short: "Show liquidity of protocol", - Long: strings.TrimSpace( - fmt.Sprintf(`Query total-liquidity. -Example: -$ %s query spot total-liquidity -`, version.AppName, - ), - ), - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - - res, err := queryClient.TotalLiquidity(context.Background(), &types.QueryTotalLiquidityRequest{}) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -func CmdTotalPoolLiquidity() *cobra.Command { - cmd := &cobra.Command{ - Use: "pool-liquidity [pool-id]", - Short: "Show liquidity of pool", - Long: strings.TrimSpace( - fmt.Sprintf(`Query total-liquidity. -Example: -$ %s query spot pool-liquidity 1 -`, version.AppName, - ), - ), - Args: cobra.ExactArgs(1), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx := client.GetClientContextFromCmd(cmd) - - queryClient := types.NewQueryClient(clientCtx) - poolId, _ := sdk.NewIntFromString(args[0]) - - res, err := queryClient.TotalPoolLiquidity( - context.Background(), - &types.QueryTotalPoolLiquidityRequest{PoolId: poolId.Uint64()}, - ) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/spot/client/cli/tx.go b/x/spot/client/cli/tx.go deleted file mode 100644 index 9879e15c3..000000000 --- a/x/spot/client/cli/tx.go +++ /dev/null @@ -1,334 +0,0 @@ -package cli - -import ( - "encoding/json" - "fmt" - "os" - "strings" - - sdkmath "cosmossdk.io/math" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/version" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// GetTxCmd returns the transaction commands for this module -func GetTxCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: types.ModuleName, - Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - CmdCreatePool(), - CmdJoinPool(), - CmdExitPool(), - CmdSwapAssets(), - ) - - return cmd -} - -func CmdSwapAssets() *cobra.Command { - cmd := &cobra.Command{ - Use: "swap-assets", - Short: "swap assets by specifying tokens in and a token out denom", - Long: strings.TrimSpace( - fmt.Sprintf(` -Example: -$ %s tx spot swap-assets --pool-id 1 --tokens-in 100stake --token-out-denom validatortoken --from validator -`, - version.AppName, - ), - ), - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - flagSet := cmd.Flags() - - poolId, err := flagSet.GetUint64(FlagPoolId) - if err != nil { - return err - } - - tokenInStr, err := cmd.Flags().GetString(FlagTokenIn) - if err != nil { - return err - } - - tokenIn, err := sdk.ParseCoinNormalized(tokenInStr) - if err != nil { - return err - } - - tokenOutDenom, err := cmd.Flags().GetString(FlagTokenOutDenom) - if err != nil { - return err - } - - msg := types.NewMsgSwapAssets( - clientCtx.GetFromAddress().String(), - poolId, - tokenIn, - tokenOutDenom, - ) - if err := msg.ValidateBasic(); err != nil { - return err - } - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - cmd.Flags().AddFlagSet(FlagSetSwapAssets()) - flags.AddTxFlagsToCmd(cmd) - - _ = cmd.MarkFlagRequired(FlagPoolId) - _ = cmd.MarkFlagRequired(FlagTokenIn) - _ = cmd.MarkFlagRequired(FlagTokenOutDenom) - - return cmd -} - -func CmdJoinPool() *cobra.Command { - cmd := &cobra.Command{ - Use: "join-pool", - Short: "join a new pool and provide the liquidity to it", - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) error { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - flagSet := cmd.Flags() - - poolId, err := flagSet.GetUint64(FlagPoolId) - if err != nil { - return err - } - - tokensInStrs, err := flagSet.GetStringArray(FlagTokensIn) - if err != nil { - return err - } - - tokensIn := sdk.Coins{} - for i := 0; i < len(tokensInStrs); i++ { - parsed, err := sdk.ParseCoinsNormalized(tokensInStrs[i]) - if err != nil { - return err - } - tokensIn = tokensIn.Add(parsed...) - } - - useAllCoins, err := flagSet.GetBool(FlagUseAllCoins) - if err != nil { - return err - } - - msg := types.NewMsgJoinPool( - /*sender=*/ clientCtx.GetFromAddress().String(), - poolId, - tokensIn, - useAllCoins, - ) - - return tx.GenerateOrBroadcastTxCLI(clientCtx, flagSet, msg) - }, - } - - cmd.Flags().AddFlagSet(FlagSetJoinPool()) - flags.AddTxFlagsToCmd(cmd) - - _ = cmd.MarkFlagRequired(FlagPoolId) - _ = cmd.MarkFlagRequired(FlagTokensIn) - _ = cmd.MarkFlagRequired(FlagUseAllCoins) - - return cmd -} - -func CmdExitPool() *cobra.Command { - cmd := &cobra.Command{ - Use: "exit-pool", - Short: "exit a pool by burning pool share tokens", - Long: strings.TrimSpace( - fmt.Sprintf(` -Example: -$ %s tx spot exit-pool --pool-id 1 --pool-shares-out 100nibiru/pool/1 --from validator -`, - version.AppName, - ), - ), - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - flagSet := cmd.Flags() - - poolId, err := flagSet.GetUint64(FlagPoolId) - if err != nil { - return err - } - - poolSharesOut, err := cmd.Flags().GetString(FlagPoolSharesOut) - if err != nil { - return err - } - - parsedPoolSharesOut, err := sdk.ParseCoinNormalized(poolSharesOut) - if err != nil { - return err - } - - msg := types.NewMsgExitPool( - clientCtx.GetFromAddress().String(), - poolId, - parsedPoolSharesOut, - ) - - if err := msg.ValidateBasic(); err != nil { - return err - } - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - cmd.Flags().AddFlagSet(FlagSetExitPool()) - flags.AddTxFlagsToCmd(cmd) - - _ = cmd.MarkFlagRequired(FlagPoolId) - _ = cmd.MarkFlagRequired(FlagPoolSharesOut) - - return cmd -} - -func CmdCreatePool() *cobra.Command { - cmd := &cobra.Command{ - Use: "create-pool [flags]", - Short: "create a new pool and provide the liquidity to it", - Long: strings.TrimSpace( - fmt.Sprintf(`create a new pool and provide the liquidity to it. -Pool initialization parameters must be provided through a pool JSON file. - -Example: -$ %s tx spot create-pool --pool-file="path/to/pool.json" --from validator - -Where pool.json contains: -{ - "weights": "1unusd,1uusdc", - "initial-deposit": "100unusd,100uusdc", - "swap-fee": "0.01", - "exit-fee": "0.01", - "pool-type": "balancer", // 'balancer' or 'stableswap' - "amplification": "10" // Amplification parameter for the stableswap pool -} -`, - version.AppName, - ), - ), - Args: cobra.ExactArgs(0), - RunE: func(cmd *cobra.Command, args []string) (err error) { - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - - poolFile, err := cmd.Flags().GetString(FlagPoolFile) - if err != nil { - return err - } - if poolFile == "" { - return types.ErrMissingPoolFileFlag - } - - contents, err := os.ReadFile(poolFile) - if err != nil { - return err - } - - // make exception if unknown field exists - pool := &createPoolInputs{} - if err = json.Unmarshal(contents, pool); err != nil { - return err - } - - initialDepositCoins, err := sdk.ParseCoinsNormalized(pool.InitialDeposit) - if err != nil { - return err - } - - poolWeights, err := sdk.ParseDecCoins(pool.Weights) - if err != nil { - return err - } - - if len(initialDepositCoins) != len(poolWeights) { - return types.ErrInvalidCreatePoolArgs - } - - poolAssets := make([]types.PoolAsset, len(poolWeights)) - for i := 0; i < len(poolWeights); i++ { - if poolWeights[i].Denom != initialDepositCoins[i].Denom { - return types.ErrInvalidCreatePoolArgs - } - - poolAssets[i] = types.PoolAsset{ - Token: initialDepositCoins[i], - Weight: poolWeights[i].Amount.RoundInt(), - } - } - - var poolType types.PoolType - if pool.PoolType == "balancer" { - poolType = types.PoolType_BALANCER - } else if pool.PoolType == "stableswap" { - poolType = types.PoolType_STABLESWAP - } else { - return types.ErrInvalidCreatePoolArgs - } - - var amplification sdkmath.Int - if poolType == types.PoolType_STABLESWAP { - amplification, err = pool.AmplificationInt() - if err != nil { - return err - } - } - - msg := types.NewMsgCreatePool( - /*sender=*/ clientCtx.GetFromAddress().String(), - poolAssets, - &types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr(pool.SwapFee), - ExitFee: sdk.MustNewDecFromStr(pool.ExitFee), - PoolType: poolType, - A: amplification, - }, - ) - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - cmd.Flags().AddFlagSet(FlagSetCreatePool()) - flags.AddTxFlagsToCmd(cmd) - - _ = cmd.MarkFlagRequired(FlagPoolFile) - - return cmd -} diff --git a/x/spot/client/testutil/cli_test.go b/x/spot/client/testutil/cli_test.go deleted file mode 100644 index a642f1182..000000000 --- a/x/spot/client/testutil/cli_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package testutil - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/denoms" - testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" - genesis "github.com/NibiruChain/nibiru/x/common/testutil/genesis" -) - -func TestIntegrationTestSuite(t *testing.T) { - coinsFromGenesis := []string{ - denoms.NIBI, - denoms.NUSD, - denoms.USDC, - "coin-1", - "coin-2", - "coin-3", - "coin-4", - "coin-5", - } - - app.SetPrefixes(app.AccountAddressPrefix) - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) - - genesisState = WhitelistGenesisAssets( - genesisState, - coinsFromGenesis, - ) - - homeDir := t.TempDir() - cfg := testutilcli.BuildNetworkConfig(genesisState) - cfg.StartingTokens = sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 2e12), // for pool creation fee and more for tx fees - ) - - for _, coin := range coinsFromGenesis { - cfg.StartingTokens = cfg.StartingTokens.Add(sdk.NewInt64Coin(coin, 40000)) - } - - suite.Run(t, NewIntegrationTestSuite(homeDir, cfg)) -} diff --git a/x/spot/client/testutil/suite.go b/x/spot/client/testutil/suite.go deleted file mode 100644 index decff8fc0..000000000 --- a/x/spot/client/testutil/suite.go +++ /dev/null @@ -1,800 +0,0 @@ -package testutil - -import ( - "fmt" - "testing" - - sdkmath "cosmossdk.io/math" - - tmcli "github.com/cometbft/cometbft/libs/cli" - sdktestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - sdk "github.com/cosmos/cosmos-sdk/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - "github.com/stretchr/testify/suite" - - testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" - "github.com/NibiruChain/nibiru/x/spot/client/cli" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -type IntegrationTestSuite struct { - suite.Suite - - homeDir string - cfg testutilcli.Config - network *testutilcli.Network -} - -func NewIntegrationTestSuite(homeDir string, cfg testutilcli.Config) *IntegrationTestSuite { - return &IntegrationTestSuite{homeDir: homeDir, cfg: cfg} -} - -func (s *IntegrationTestSuite) SetupSuite() { - /* Make test skip if -short is not used: - All tests: `go test ./...` - Unit tests only: `go test ./... -short` - Integration tests only: `go test ./... -run Integration` - https://stackoverflow.com/a/41407042/13305627 */ - if testing.Short() { - s.T().Skip("skipping integration test suite") - } - - s.T().Log("setting up integration test suite") - - network, err := testutilcli.New( - s.T(), - s.homeDir, - s.cfg, - ) - s.Require().NoError(err) - - s.network = network - _, err = s.network.WaitForHeight(1) - s.NoError(err) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestCreatePoolCmd() { - val := s.network.Validators[0] - - tc := []struct { - name string - tokenWeights string - initialDeposit string - poolType string - amplification string - - expectedErr error - expectedCode uint32 - }{ - { - name: "create pool with insufficient funds", - tokenWeights: fmt.Sprintf("1%s, 1%s", "coin-1", "coin-2"), - initialDeposit: fmt.Sprintf("1000000000%s,10000000000%s", "coin-1", "coin-2"), - poolType: "balancer", - amplification: "0", - expectedCode: 5, // bankKeeper code for insufficient funds - }, - { - name: "create pool with invalid weights", - tokenWeights: fmt.Sprintf("0%s, 1%s", "coin-1", "coin-2"), - initialDeposit: fmt.Sprintf("10000%s,10000%s", "coin-1", "coin-2"), - poolType: "balancer", - amplification: "0", - expectedErr: types.ErrInvalidCreatePoolArgs, - }, - { - name: "create pool with deposit not matching weights", - tokenWeights: fmt.Sprintf("1%s, 1%s", "coin-1", "coin-2"), - initialDeposit: "1000foo,10000uusdc", - poolType: "balancer", - amplification: "0", - expectedErr: types.ErrInvalidCreatePoolArgs, - }, - { - name: "create a stableswap pool, amplification parameter below 1", - tokenWeights: fmt.Sprintf("1%s, 1%s", "coin-1", "coin-2"), - initialDeposit: fmt.Sprintf("1000%s,10000%s", "coin-1", "coin-2"), - amplification: "0", - poolType: "stableswap", - expectedErr: types.ErrAmplificationTooLow, - }, - { - name: "happy path - balancer", - tokenWeights: "1unibi,1uusdc", - initialDeposit: "100unibi,100uusdc", - poolType: "balancer", - amplification: "0", - }, - { - name: "happy path - stable", - tokenWeights: "1unusd,1uusdc", - initialDeposit: "100unusd,100uusdc", - poolType: "stableswap", - amplification: "4", - }, - } - - for _, tc := range tc { - tc := tc - - s.Run(tc.name, func() { - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - val.Address, - tc.tokenWeights, - tc.initialDeposit, - "0.003", - "0.003", - tc.poolType, - tc.amplification, - ) - - if tc.expectedErr != nil { - s.Require().ErrorIs(err, tc.expectedErr, out.String()) - } else { - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - txResp := sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &txResp) - resp, err := testutilcli.QueryTx(val.ClientCtx, txResp.TxHash) - s.Require().NoError(err) - - s.Assert().Equal(tc.expectedCode, resp.Code, string(val.ClientCtx.Codec.MustMarshalJSON(resp))) - } - }) - } -} - -func (s *IntegrationTestSuite) TestNewJoinPoolCmd() { - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("5%s,5%s", "coin-2", "coin-3"), - /*tokenWeights=*/ fmt.Sprintf("100%s,100%s", "coin-2", "coin-3"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "balancer", - /*amplification=*/ "0", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoError(err, out.String()) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoError(err) - - testCases := []struct { - name string - poolId uint64 - tokensIn string - expectErr bool - expectedCode uint32 - }{ - { - name: "join pool with insufficient balance", - poolId: poolID, - tokensIn: fmt.Sprintf("1000000000%s,10000000000%s", "coin-2", "coin-3"), - expectErr: false, - expectedCode: 5, // bankKeeper code for insufficient funds - }, - { - name: "join pool with wrong tokens", - poolId: poolID, - tokensIn: fmt.Sprintf("1000000000%s,10000000000%s", "coin-1", "coin-3"), - expectErr: false, - expectedCode: 13, // bankKeeper code for insufficient funds - }, - { - name: "join pool with sufficient balance", - poolId: poolID, - tokensIn: fmt.Sprintf("100%s,100%s", "coin-2", "coin-3"), - expectErr: false, - expectedCode: 0, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - ctx := val.ClientCtx - - out, err := ExecMsgJoinPool(ctx, tc.poolId, val.Address, tc.tokensIn, "false") - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - resp := &sdk.TxResponse{} - ctx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - - resp, err = testutilcli.QueryTx(ctx, resp.TxHash) - s.Require().NoError(err, out.String()) - s.Require().Equal(tc.expectedCode, resp.Code, out.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestNewJoinStablePoolCmd() { - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("5%s,5%s", "coin-1", "coin-3"), - /*tokenWeights=*/ fmt.Sprintf("100%s,100%s", "coin-1", "coin-3"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "stableswap", - /*amplification=*/ "10", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoError(err) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoError(err, out.String()) - - testCases := []struct { - name string - poolId uint64 - tokensIn string - expectErr bool - expectedCode uint32 - }{ - { - name: "join pool with insufficient balance", - poolId: poolID, - tokensIn: fmt.Sprintf("1000000000%s,10000000000%s", "coin-1", "coin-3"), - expectErr: false, - expectedCode: 5, // bankKeeper code for insufficient funds - }, - { - name: "join pool with sufficient balance", - poolId: poolID, - tokensIn: fmt.Sprintf("100%s,50%s", "coin-1", "coin-3"), - expectErr: false, - expectedCode: 0, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - ctx := val.ClientCtx - - out, err := ExecMsgJoinPool(ctx, tc.poolId, val.Address, tc.tokensIn, "false") - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - resp := &sdk.TxResponse{} - ctx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(ctx, resp.TxHash) - s.Require().NoError(err, out.String()) - - s.Require().Equal(tc.expectedCode, resp.Code, out.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestNewExitPoolCmd() { - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("1%s,1%s", "coin-3", "coin-4"), - /*initialDeposit=*/ fmt.Sprintf("100%s,100%s", "coin-3", "coin-4"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "balancer", - /*amplification=*/ "0", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoError(err) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoError(err, out.String()) - - testCases := []struct { - name string - poolId uint64 - poolSharesOut string - - expectErr bool - expectedCode uint32 - - expectedCoin3 sdkmath.Int - expectedCoin4 sdkmath.Int - }{ - { - name: "exit pool from invalid pool", - poolId: 100, - poolSharesOut: "100nibiru/pool/100", - expectErr: false, - expectedCode: 1, // spot.types.ErrNonExistingPool - expectedCoin3: sdk.ZeroInt(), - expectedCoin4: sdk.ZeroInt(), - }, - { - name: "exit pool for too many shares", - poolId: poolID, - poolSharesOut: fmt.Sprintf("1001000000000000000000nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 1, - expectedCoin3: sdk.ZeroInt(), - expectedCoin4: sdk.ZeroInt(), - }, - { - name: "exit pool for zero shares", - poolId: poolID, - poolSharesOut: fmt.Sprintf("0nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 1, - expectedCoin3: sdk.ZeroInt(), - expectedCoin4: sdk.ZeroInt(), - }, - { // Looks with a bug - name: "exit pool with sufficient balance", - poolId: poolID, - poolSharesOut: fmt.Sprintf("100000000000000000000nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 0, - expectedCoin3: sdk.NewInt(99), // Received coin-3 minus 1 exit pool fee - expectedCoin4: sdk.NewInt(99), // Received coin-4 minus 1 exit pool fee - }, - } - - for _, tc := range testCases { - tc := tc - ctx := val.ClientCtx - - s.Run(tc.name, func() { - // Get original balance - resp, err := sdktestutil.QueryBalancesExec(ctx, val.Address) - s.Require().NoError(err) - var originalBalance banktypes.QueryAllBalancesResponse - ctx.Codec.MustUnmarshalJSON(resp.Bytes(), &originalBalance) - - out, err := ExecMsgExitPool(ctx, tc.poolId, val.Address, tc.poolSharesOut) - - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - ctx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(ctx, resp.TxHash) - s.Require().NoError(err, out.String()) - s.Require().Equal(tc.expectedCode, resp.Code, out.String()) - - // Ensure balance is ok - out, err = sdktestutil.QueryBalancesExec(ctx, val.Address) - s.Require().NoError(err) - var finalBalance banktypes.QueryAllBalancesResponse - ctx.Codec.MustUnmarshalJSON(out.Bytes(), &finalBalance) - - s.Assert().Equal( - originalBalance.Balances.AmountOf("coin-3").Add(tc.expectedCoin3), - finalBalance.Balances.AmountOf("coin-3"), - ) - s.Assert().Equal( - originalBalance.Balances.AmountOf("coin-4").Add(tc.expectedCoin4), - finalBalance.Balances.AmountOf("coin-4"), - ) - } - }) - } -} - -func (s *IntegrationTestSuite) TestNewExitStablePoolCmd() { - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("1%s,1%s", "coin-3", "coin-5"), - /*tokenWeights=*/ fmt.Sprintf("100%s,100%s", "coin-3", "coin-5"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "stableswap", - /*amplification=*/ "4242", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoErrorf(err, "cmd output: %s", out) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoErrorf(err, "cmd output: %s", out) - - testCases := []struct { - name string - poolId uint64 - poolSharesOut string - expectErr bool - expectedCode uint32 - expectedCoin3 sdkmath.Int - expectedCoin5 sdkmath.Int - }{ - { - name: "exit pool from invalid pool", - poolId: 100, - poolSharesOut: "100nibiru/pool/100", - expectErr: false, - expectedCode: 1, // spot.types.ErrNonExistingPool - expectedCoin3: sdk.ZeroInt(), - expectedCoin5: sdk.ZeroInt(), - }, - { - name: "exit pool for too many shares", - poolId: poolID, - poolSharesOut: fmt.Sprintf("1001000000000000000000nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 1, - expectedCoin3: sdk.ZeroInt(), - expectedCoin5: sdk.ZeroInt(), - }, - { - name: "exit pool for zero shares", - poolId: poolID, - poolSharesOut: fmt.Sprintf("0nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 1, - expectedCoin3: sdk.ZeroInt(), - expectedCoin5: sdk.ZeroInt(), - }, - { // Looks with a bug - name: "exit pool with sufficient balance", - poolId: poolID, - poolSharesOut: fmt.Sprintf("100000000000000000000nibiru/pool/%d", poolID), - expectErr: false, - expectedCode: 0, - expectedCoin3: sdk.NewInt(99), // Received coin-3 minus 1 exit pool fee - expectedCoin5: sdk.NewInt(99), // Received coin-5 minus 1 exit pool fee - }, - } - - for _, tc := range testCases { - tc := tc - ctx := val.ClientCtx - - s.Run(tc.name, func() { - // Get original balance - resp, err := sdktestutil.QueryBalancesExec(ctx, val.Address) - s.Require().NoError(err) - var originalBalance banktypes.QueryAllBalancesResponse - ctx.Codec.MustUnmarshalJSON(resp.Bytes(), &originalBalance) - - out, err := ExecMsgExitPool(ctx, tc.poolId, val.Address, tc.poolSharesOut) - - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - ctx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(ctx, resp.TxHash) - s.Require().NoError(err) - - s.Require().Equal(tc.expectedCode, resp.Code, out.String()) - - // Ensure balance is ok - out, err := sdktestutil.QueryBalancesExec(ctx, val.Address) - s.Require().NoError(err) - var finalBalance banktypes.QueryAllBalancesResponse - ctx.Codec.MustUnmarshalJSON(out.Bytes(), &finalBalance) - - s.Assert().Equal( - originalBalance.Balances.AmountOf("coin-3").Add(tc.expectedCoin3), - finalBalance.Balances.AmountOf("coin-3"), - ) - s.Assert().Equal( - originalBalance.Balances.AmountOf("coin-5").Add(tc.expectedCoin5), - finalBalance.Balances.AmountOf("coin-5"), - ) - } - }) - } -} - -func (s *IntegrationTestSuite) TestGetCmdTotalLiquidity() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expectErr bool - }{ - { - "query total liquidity", // nibid query spot total-liquidity - []string{ - fmt.Sprintf("--%s=%s", tmcli.OutputFlag, "json"), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.CmdTotalLiquidity() - clientCtx := val.ClientCtx - - out, err := sdktestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - resp := types.QueryTotalLiquidityResponse{} - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &resp), out.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestSwapAssets() { - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("1%s,1%s", "coin-4", "coin-5"), - /*tokenWeights=*/ fmt.Sprintf("100%s,100%s", "coin-4", "coin-5"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "balancer", - /*amplification=*/ "0", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoError(err) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoError(err, out.String()) - - testCases := []struct { - name string - poolId uint64 - tokenIn string - tokenOutDenom string - expectedCode uint32 - expectErr bool - }{ - { - name: "zero pool id", - poolId: 0, - tokenIn: "50unibi", - tokenOutDenom: "uusdc", - expectErr: true, - }, - { - name: "invalid token in", - poolId: poolID, - tokenIn: "0coin-4", - tokenOutDenom: "uusdc", - expectErr: true, - }, - { - name: "invalid token out denom", - poolId: poolID, - tokenIn: "50coin-4", - tokenOutDenom: "", - expectErr: true, - }, - { - name: "pool not found", - poolId: 1000000, - tokenIn: "50unibi", - tokenOutDenom: "uusdc", - expectedCode: types.ErrPoolNotFound.ABCICode(), - expectErr: false, - }, - { - name: "token in denom not found", - poolId: poolID, - tokenIn: "50foo", - tokenOutDenom: "coin-5", - expectedCode: types.ErrTokenDenomNotFound.ABCICode(), - expectErr: false, - }, - { - name: "token out denom not found", - poolId: poolID, - tokenIn: "50coin-4", - tokenOutDenom: "foo", - expectedCode: types.ErrTokenDenomNotFound.ABCICode(), - expectErr: false, - }, - { - name: "successful swap", - poolId: poolID, - tokenIn: "50coin-4", - tokenOutDenom: "coin-5", - expectedCode: 0, - expectErr: false, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - out, err := ExecMsgSwapAssets(val.ClientCtx, tc.poolId, val.Address, tc.tokenIn, tc.tokenOutDenom) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(val.ClientCtx, resp.TxHash) - s.Require().NoError(err) - - s.Assert().Equal(tc.expectedCode, resp.Code, out.String()) - } - }) - } -} - -func (s *IntegrationTestSuite) TestSwapStableAssets() { - s.Require().NoError(s.network.WaitForNextBlock()) - val := s.network.Validators[0] - - // create a new pool - out, err := ExecMsgCreatePool( - s.T(), - val.ClientCtx, - /*owner-*/ val.Address, - /*tokenWeights=*/ fmt.Sprintf("1%s,1%s", "coin-1", "coin-5"), - /*initialDeposit=*/ fmt.Sprintf("100%s,100%s", "coin-1", "coin-5"), - /*swapFee=*/ "0.01", - /*exitFee=*/ "0.01", - /*poolType=*/ "stableswap", - /*amplification=*/ "42", - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(s.network.Validators[0].ClientCtx, resp.TxHash) - s.Require().NoError(err) - - poolID, err := ExtractPoolIDFromCreatePoolResponse(val.ClientCtx.Codec, resp) - s.Require().NoError(err, out.String()) - - testCases := []struct { - name string - poolId uint64 - tokenIn string - tokenOutDenom string - expectedCode uint32 - expectErr bool - }{ - { - name: "zero pool id", - poolId: 0, - tokenIn: "50unibi", - tokenOutDenom: "uusdc", - expectErr: true, - }, - { - name: "invalid token in", - poolId: poolID, - tokenIn: "0coin-1", - tokenOutDenom: "uusdc", - expectErr: true, - }, - { - name: "invalid token out denom", - poolId: poolID, - tokenIn: "50coin-1", - tokenOutDenom: "", - expectErr: true, - }, - { - name: "pool not found", - poolId: 1000000, - tokenIn: "50unibi", - tokenOutDenom: "uusdc", - expectedCode: types.ErrPoolNotFound.ABCICode(), - expectErr: false, - }, - { - name: "token in denom not found", - poolId: poolID, - tokenIn: "50foo", - tokenOutDenom: "coin-5", - expectedCode: types.ErrTokenDenomNotFound.ABCICode(), - expectErr: false, - }, - { - name: "token out denom not found", - poolId: poolID, - tokenIn: "50coin-1", - tokenOutDenom: "foo", - expectedCode: types.ErrTokenDenomNotFound.ABCICode(), - expectErr: false, - }, - { - name: "successful swap", - poolId: poolID, - tokenIn: "50coin-1", - tokenOutDenom: "coin-5", - expectedCode: 0, - expectErr: false, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - out, err := ExecMsgSwapAssets(val.ClientCtx, tc.poolId, val.Address, tc.tokenIn, tc.tokenOutDenom) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), resp) - resp, err = testutilcli.QueryTx(val.ClientCtx, resp.TxHash) - s.Require().NoError(err) - - s.Assert().Equal(tc.expectedCode, resp.Code, out.String()) - } - }) - } -} diff --git a/x/spot/client/testutil/test_helpers.go b/x/spot/client/testutil/test_helpers.go deleted file mode 100644 index af093b723..000000000 --- a/x/spot/client/testutil/test_helpers.go +++ /dev/null @@ -1,182 +0,0 @@ -package testutil - -import ( - "encoding/hex" - "fmt" - "testing" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/testutil" - sdktestutil "github.com/cosmos/cosmos-sdk/testutil/cli" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/spot/client/cli" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// commonArgs is args for CLI test commands. -var commonArgs = []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(denoms.NIBI, sdk.NewInt(10))).String()), -} - -// ExecMsgCreatePool broadcast a pool creation message. -func ExecMsgCreatePool( - t *testing.T, - clientCtx client.Context, - owner fmt.Stringer, - tokenWeights string, - initialDeposit string, - swapFee string, - exitFee string, - poolType string, - amplification string, - extraArgs ...string, -) (testutil.BufferWriter, error) { - args := []string{} - - jsonFile := testutil.WriteToNewTempFile(t, - fmt.Sprintf(` - { - "weights": "%s", - "initial-deposit": "%s", - "swap-fee": "%s", - "exit-fee": "%s", - "pool-type": "%s", - "amplification": "%s" - } - `, - tokenWeights, - initialDeposit, - swapFee, - exitFee, - poolType, - amplification, - ), - ) - - args = append(args, - fmt.Sprintf("--%s=%s", cli.FlagPoolFile, jsonFile.Name()), - fmt.Sprintf("--%s=%s", flags.FlagFrom, owner.String()), - fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), - ) - - args = append(args, commonArgs...) - args = append(args, extraArgs...) - - return sdktestutil.ExecTestCLICmd(clientCtx, cli.CmdCreatePool(), args) -} - -// ExecMsgJoinPool broadcast a join pool message. -func ExecMsgJoinPool( - clientCtx client.Context, - poolId uint64, - sender fmt.Stringer, - tokensIn string, - useAllCoins string, - extraArgs ...string, -) (testutil.BufferWriter, error) { - args := []string{ - fmt.Sprintf("--%s=%d", cli.FlagPoolId, poolId), - fmt.Sprintf("--%s=%s", cli.FlagTokensIn, tokensIn), - fmt.Sprintf("--%s=%s", cli.FlagUseAllCoins, useAllCoins), - fmt.Sprintf("--%s=%s", flags.FlagFrom, sender.String()), - fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), - } - - args = append(args, commonArgs...) - args = append(args, extraArgs...) - - return sdktestutil.ExecTestCLICmd(clientCtx, cli.CmdJoinPool(), args) -} - -// ExecMsgExitPool broadcast an exit pool message. -func ExecMsgExitPool( - clientCtx client.Context, - poolId uint64, - sender fmt.Stringer, - poolSharesOut string, - extraArgs ...string, -) (testutil.BufferWriter, error) { - args := []string{ - fmt.Sprintf("--%s=%d", cli.FlagPoolId, poolId), - fmt.Sprintf("--%s=%s", cli.FlagPoolSharesOut, poolSharesOut), - fmt.Sprintf("--%s=%s", flags.FlagFrom, sender.String()), - fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), - } - - args = append(args, commonArgs...) - args = append(args, extraArgs...) - - return sdktestutil.ExecTestCLICmd(clientCtx, cli.CmdExitPool(), args) -} - -// ExecMsgSwapAssets broadcast a swap assets message. -func ExecMsgSwapAssets( - clientCtx client.Context, - poolId uint64, - sender fmt.Stringer, - tokenIn string, - tokenOutDenom string, - extraArgs ...string, -) (testutil.BufferWriter, error) { - args := []string{ - fmt.Sprintf("--%s=%d", cli.FlagPoolId, poolId), - fmt.Sprintf("--%s=%s", cli.FlagTokenIn, tokenIn), - fmt.Sprintf("--%s=%s", cli.FlagTokenOutDenom, tokenOutDenom), - fmt.Sprintf("--%s=%s", flags.FlagFrom, sender.String()), - fmt.Sprintf("--%s=%d", flags.FlagGas, 300_000), - } - - args = append(args, commonArgs...) - args = append(args, extraArgs...) - - return sdktestutil.ExecTestCLICmd(clientCtx, cli.CmdSwapAssets(), args) -} - -// WhitelistGenesisAssets given a testapp.GenesisState includes the whitelisted assets into spot Whitelisted assets. -func WhitelistGenesisAssets(state app.GenesisState, assets []string) app.GenesisState { - encConfig := app.MakeEncodingConfig() - - jsonState := state[types.ModuleName] - - var genesis types.GenesisState - encConfig.Marshaler.MustUnmarshalJSON(jsonState, &genesis) - genesis.Params.WhitelistedAsset = assets - - json, _ := encConfig.Marshaler.MarshalJSON(&genesis) - state[types.ModuleName] = json - - return state -} - -// ExtractPoolIDFromCreatePoolResponse extracts the created PoolID from a MsgCreatePool command. -func ExtractPoolIDFromCreatePoolResponse(codec codec.Codec, resp *sdk.TxResponse) (uint64, error) { - decodedResult, err := hex.DecodeString(resp.Data) - if err != nil { - return 0, err - } - - respData := sdk.TxMsgData{} - err = codec.Unmarshal(decodedResult, &respData) - if err != nil { - return 0, err - } - - if len(respData.MsgResponses) < 1 { - return 0, fmt.Errorf("invalid response") - } - - var createPoolResponse types.MsgCreatePoolResponse - err = codec.Unmarshal(respData.MsgResponses[0].Value, &createPoolResponse) - if err != nil { - return 0, err - } - - return createPoolResponse.PoolId, nil -} diff --git a/x/spot/genesis.go b/x/spot/genesis.go deleted file mode 100644 index 4decad06e..000000000 --- a/x/spot/genesis.go +++ /dev/null @@ -1,27 +0,0 @@ -package spot - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/keeper" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// InitGenesis initializes the spot module's state from a provided genesis state. -func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - k.SetParams(ctx, genState.Params) - k.SetNextPoolNumber(ctx, uint64(genState.Params.StartingPoolNumber)) - - for _, pool := range genState.Pools { - k.SetPool(ctx, pool) - } -} - -// ExportGenesis returns the spot module's exported genesis. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - genesis := types.DefaultGenesis() - genesis.Params = k.GetParams(ctx) - genesis.Pools = k.FetchAllPools(ctx) - - return genesis -} diff --git a/x/spot/genesis_test.go b/x/spot/genesis_test.go deleted file mode 100644 index 1cd5207e8..000000000 --- a/x/spot/genesis_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package spot_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/spot" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestGenesis(t *testing.T) { - genesisState := types.GenesisState{ - Params: types.DefaultParams(), - Pools: []types.Pool{ - { - Id: 1, - Address: "addr1", - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.01"), - ExitFee: sdk.MustNewDecFromStr("0.01"), - A: sdk.ZeroInt(), - PoolType: types.PoolType_BALANCER, - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewCoin("token1", sdk.NewInt(100)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("token2", sdk.NewInt(100)), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewCoin("nibiru/pool/1", sdk.NewInt(100)), - }, - }, - } - - app, ctx := testapp.NewNibiruTestAppAndContext() - spot.InitGenesis(ctx, app.SpotKeeper, genesisState) - got := spot.ExportGenesis(ctx, app.SpotKeeper) - require.NotNil(t, got) - - testutil.Fill(&genesisState) - testutil.Fill(got) - - require.Equal(t, genesisState, *got) -} diff --git a/x/spot/keeper/balances.go b/x/spot/keeper/balances.go deleted file mode 100644 index dffc68520..000000000 --- a/x/spot/keeper/balances.go +++ /dev/null @@ -1,35 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -/* -Checks if account has enough balance to spend coins. - -args: - - ctx: cosmos-sdk context - - coinsToSpend: the coins that the account wishes to spend - - account: the address of the account spending the coins - -ret: - - error: an error if insufficient balance -*/ -func (k Keeper) CheckEnoughBalances( - ctx sdk.Context, - coinsToSpend sdk.Coins, - account sdk.AccAddress, -) error { - accCoins := k.bankKeeper.SpendableCoins(ctx, account) - - if accCoins.IsAllGTE(coinsToSpend) { - return nil - } - - return sdkerrors.ErrInsufficientFunds.Wrapf( - "acc %s does not have enough to spend %s", - account.String(), - coinsToSpend.String(), - ) -} diff --git a/x/spot/keeper/balances_test.go b/x/spot/keeper/balances_test.go deleted file mode 100644 index c7df38110..000000000 --- a/x/spot/keeper/balances_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package keeper_test - -import ( - "testing" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/stretchr/testify/require" -) - -func TestCheckBalances(t *testing.T) { - tests := []struct { - name string - - // test setup - userInitialFunds sdk.Coins - coinsToSpend sdk.Coins - - // expected results - expectedError error - }{ - { - name: "has enough funds", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - coinsToSpend: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedError: nil, - }, - { - name: "not enough user funds", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - coinsToSpend: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedError: sdkerrors.ErrInsufficientFunds, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // fund user account - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, sender, tc.userInitialFunds)) - - // swap assets - err := app.SpotKeeper.CheckEnoughBalances(ctx, tc.coinsToSpend, sender) - - if tc.expectedError != nil { - require.ErrorIs(t, err, tc.expectedError) - } else { - require.NoError(t, err) - } - - // check user's final funds did not change - require.Equal(t, - tc.userInitialFunds, - app.BankKeeper.GetAllBalances(ctx, sender), - ) - }) - } -} diff --git a/x/spot/keeper/grpc_query.go b/x/spot/keeper/grpc_query.go deleted file mode 100644 index b692f2c49..000000000 --- a/x/spot/keeper/grpc_query.go +++ /dev/null @@ -1,334 +0,0 @@ -package keeper - -import ( - "context" - "fmt" - - "github.com/cosmos/cosmos-sdk/store/prefix" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - gogotypes "github.com/cosmos/gogoproto/types" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -type queryServer struct { - Keeper -} - -func NewQuerier(k Keeper) queryServer { - return queryServer{Keeper: k} -} - -var _ types.QueryServer = queryServer{} - -/* -Handler for the QueryParamsRequest query. - -args - - ctx: the cosmos-sdk context - req: a QueryParamsRequest proto object - -ret - - QueryParamsResponse: the QueryParamsResponse proto object response, containing the params - error: an error if any occurred -*/ -func (k queryServer) Params(c context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - ctx := sdk.UnwrapSDKContext(c) - - return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil -} - -/* -Handler for the QueryPoolRequest query. - -args - - ctx: the cosmos-sdk context - req: a QueryPoolRequest proto object - -ret - - QueryPoolResponse: the QueryPoolResponse proto object response, containing the pool - error: an error if any occurred -*/ -func (k queryServer) Pool(goCtx context.Context, req *types.QueryPoolRequest) (*types.QueryPoolResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - - pool, err := k.FetchPool(sdk.UnwrapSDKContext(goCtx), req.PoolId) - if err != nil { - return nil, err - } - - return &types.QueryPoolResponse{ - Pool: &pool, - }, nil -} - -/* -Handler for the QueryPoolNumberRequest query. - -args - - ctx: the cosmos-sdk context - req: a QueryPoolNumberRequest proto object - -ret - - QueryPoolNumberResponse: the QueryPoolNumberResponse proto object response, containing the next pool id number - error: an error if any occurred -*/ -func (k queryServer) PoolNumber(goCtx context.Context, req *types.QueryPoolNumberRequest) (*types.QueryPoolNumberResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - var poolNumber uint64 - - bz := ctx.KVStore(k.storeKey).Get(types.KeyNextGlobalPoolNumber) - if bz == nil { - return nil, fmt.Errorf("pool number has not been initialized -- Should have been done in InitGenesis") - } else { - val := gogotypes.UInt64Value{} - k.cdc.MustUnmarshal(bz, &val) - poolNumber = val.GetValue() - } - - return &types.QueryPoolNumberResponse{ - PoolId: poolNumber, - }, nil -} - -func (k queryServer) Pools(goCtx context.Context, req *types.QueryPoolsRequest) ( - *types.QueryPoolsResponse, error, -) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - store := ctx.KVStore(k.Keeper.storeKey) - poolStore := prefix.NewStore(store, types.KeyPrefixPools) - - pools := []*types.Pool{} - pageRes, err := query.Paginate( - poolStore, - req.Pagination, - func(key []byte, value []byte) error { - var pool types.Pool - err := k.Keeper.cdc.Unmarshal(value, &pool) - if err != nil { - return err - } - pools = append(pools, &pool) - return nil - }, - ) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - return &types.QueryPoolsResponse{ - Pools: pools, - Pagination: pageRes, - }, nil -} - -// Parameters of a single pool. -func (k queryServer) PoolParams(goCtx context.Context, req *types.QueryPoolParamsRequest) ( - resp *types.QueryPoolParamsResponse, err error, -) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "invalid request") - } - - ctx := sdk.UnwrapSDKContext(goCtx) - - pool, err := k.FetchPool(ctx, req.PoolId) - if err != nil { - return nil, err - } - - return &types.QueryPoolParamsResponse{ - PoolParams: &pool.PoolParams, - }, nil -} - -// Number of pools. -func (k queryServer) NumPools(ctx context.Context, _ *types.QueryNumPoolsRequest) ( - *types.QueryNumPoolsResponse, error, -) { - nextPoolNumber, err := k.GetNextPoolNumber(sdk.UnwrapSDKContext(ctx)) - if err != nil { - return nil, err - } - return &types.QueryNumPoolsResponse{ - // next pool number is the id of the next pool, - // so we have one less than that in number of pools (id starts at 1) - NumPools: nextPoolNumber - 1, - }, nil -} - -// Total liquidity across all pools. -func (k queryServer) TotalLiquidity(ctx context.Context, req *types.QueryTotalLiquidityRequest) (*types.QueryTotalLiquidityResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - sdkCtx := sdk.UnwrapSDKContext(ctx) - - return &types.QueryTotalLiquidityResponse{ - Liquidity: k.Keeper.GetTotalLiquidity(sdkCtx), - }, nil -} - -// Total liquidity in a single pool. -func (k queryServer) TotalPoolLiquidity(ctx context.Context, req *types.QueryTotalPoolLiquidityRequest) (*types.QueryTotalPoolLiquidityResponse, error) { - if req == nil { - return nil, status.Error(codes.InvalidArgument, "empty request") - } - - sdkCtx := sdk.UnwrapSDKContext(ctx) - pool, err := k.FetchPool(sdkCtx, req.PoolId) - if err != nil { - return &types.QueryTotalPoolLiquidityResponse{}, err - } - return &types.QueryTotalPoolLiquidityResponse{ - Liquidity: k.bankKeeper.GetAllBalances(sdkCtx, pool.GetAddress()), - }, nil -} - -// Total shares in a single pool. -func (k queryServer) TotalShares(ctx context.Context, req *types.QueryTotalSharesRequest) ( - *types.QueryTotalSharesResponse, error, -) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - - return &types.QueryTotalSharesResponse{ - TotalShares: pool.TotalShares, - }, nil -} - -// Instantaneous price of an asset in a pool. -func (k queryServer) SpotPrice(ctx context.Context, req *types.QuerySpotPriceRequest) ( - *types.QuerySpotPriceResponse, error, -) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - - price, err := pool.CalcSpotPrice(req.TokenInDenom, req.TokenOutDenom) - if err != nil { - return nil, err - } - - return &types.QuerySpotPriceResponse{ - SpotPrice: price.String(), - }, nil -} - -// Estimates the amount of assets returned given an exact amount of tokens to -// swap. -func (k queryServer) EstimateSwapExactAmountIn( - ctx context.Context, req *types.QuerySwapExactAmountInRequest, -) (*types.QuerySwapExactAmountInResponse, error) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - - tokenOut, fee, err := pool.CalcOutAmtGivenIn(req.TokenIn, req.TokenOutDenom, false) - if err != nil { - return nil, err - } - - return &types.QuerySwapExactAmountInResponse{ - TokenOut: tokenOut, - Fee: fee, - }, nil -} - -// Estimates the amount of tokens required to return the exact amount of -// assets requested. -func (k queryServer) EstimateSwapExactAmountOut( - ctx context.Context, req *types.QuerySwapExactAmountOutRequest, -) (*types.QuerySwapExactAmountOutResponse, error) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - - tokenIn, err := pool.CalcInAmtGivenOut(req.TokenOut, req.TokenInDenom) - if err != nil { - return nil, err - } - - return &types.QuerySwapExactAmountOutResponse{ - TokenIn: tokenIn, - }, nil -} - -// Estimates the amount of pool shares returned given an amount of tokens to -// join. -func (k queryServer) EstimateJoinExactAmountIn( - ctx context.Context, req *types.QueryJoinExactAmountInRequest, -) (*types.QueryJoinExactAmountInResponse, error) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - numShares, remCoins, err := pool.AddTokensToPool(req.TokensIn) - if err != nil { - return nil, err - } - return &types.QueryJoinExactAmountInResponse{ - PoolSharesOut: numShares, - RemCoins: remCoins, - }, nil -} - -// Estimates the amount of tokens required to obtain an exact amount of pool -// shares. -func (k queryServer) EstimateJoinExactAmountOut(context.Context, *types.QueryJoinExactAmountOutRequest) (*types.QueryJoinExactAmountOutResponse, error) { - return nil, status.Error(codes.Unimplemented, "Not Implemented") -} - -// Estimates the amount of tokens returned to the user given an exact amount -// of pool shares. -func (k queryServer) EstimateExitExactAmountIn( - ctx context.Context, req *types.QueryExitExactAmountInRequest, -) (*types.QueryExitExactAmountInResponse, error) { - pool, err := k.FetchPool(sdk.UnwrapSDKContext(ctx), req.PoolId) - if err != nil { - return nil, err - } - tokensOut, fees, err := pool.ExitPool(req.PoolSharesIn) - if err != nil { - return nil, err - } - return &types.QueryExitExactAmountInResponse{ - TokensOut: tokensOut, - Fees: fees, - }, nil -} - -// Estimates the amount of pool shares required to extract an exact amount of -// tokens from the pool. -func (k queryServer) EstimateExitExactAmountOut(context.Context, *types.QueryExitExactAmountOutRequest) (*types.QueryExitExactAmountOutResponse, error) { - return nil, status.Error(codes.Unimplemented, "Not Implemented") -} diff --git a/x/spot/keeper/grpc_query_test.go b/x/spot/keeper/grpc_query_test.go deleted file mode 100644 index 53ecfe90a..000000000 --- a/x/spot/keeper/grpc_query_test.go +++ /dev/null @@ -1,807 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/query" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/spot/keeper" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestParamsQuery(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - params := types.DefaultParams() - app.SpotKeeper.SetParams(ctx, params) - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - response, err := queryServer.Params(sdk.WrapSDKContext(ctx), &types.QueryParamsRequest{}) - require.NoError(t, err) - require.Equal(t, &types.QueryParamsResponse{Params: params}, response) -} - -func TestQueryPoolHappyPath(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - }{ - { - name: "correct fetch pool", - existingPool: types.Pool{ - Id: 1, - Address: testutil.AccAddress().String(), - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 200), - }, - }, - { - name: "correct fetch pool", - existingPool: types.Pool{ - Id: 1, - Address: testutil.AccAddress().String(), - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_STABLESWAP, - A: sdk.OneInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 200), - }, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.Pool(sdk.WrapSDKContext(ctx), &types.QueryPoolRequest{ - PoolId: 1, - }) - require.NoError(t, err) - require.Equal(t, tc.existingPool, *resp.Pool) - }) - } -} - -func TestQueryPoolFail(t *testing.T) { - tests := []struct { - name string - }{ - { - name: "invalid request", - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - queryServer := keeper.NewQuerier(app.SpotKeeper) - resp, err := queryServer.Pool(sdk.WrapSDKContext(ctx), nil) - require.Error(t, err) - require.Nil(t, resp) - }) - } -} - -func TestQueryPools(t *testing.T) { - tests := []struct { - name string - existingPools []types.Pool - pagination query.PageRequest - expectedPools []types.Pool - }{ - { - name: "successful query single pool", - existingPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - }, - expectedPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - }, - }, - { - name: "successful query multiple pools", - existingPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - mock.SpotPool( - /*poolId=*/ 2, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("baz", 100), - ), - /*shares=*/ 100, - ), - }, - expectedPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - mock.SpotPool( - /*poolId=*/ 2, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("baz", 100), - ), - /*shares=*/ 100, - ), - }, - }, - { - name: "query pools with pagination", - existingPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - mock.SpotPool( - /*poolId=*/ 2, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("baz", 100), - ), - /*shares=*/ 100, - ), - }, - pagination: query.PageRequest{ - Limit: 1, - }, - expectedPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin("bar", 100), - ), - /*shares=*/ 100, - ), - }, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - for _, existingPool := range tc.existingPools { - app.SpotKeeper.SetPool(ctx, existingPool) - } - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.Pools( - sdk.WrapSDKContext(ctx), - &types.QueryPoolsRequest{ - Pagination: &tc.pagination, - }, - ) - require.NoError(t, err) - - var responsePools []types.Pool - for _, p := range resp.Pools { - responsePools = append(responsePools, *p) - } - require.Equal(t, tc.expectedPools, responsePools) - }) - } -} - -func TestQueryNumPools(t *testing.T) { - tests := []struct { - name string - newPools []types.Pool - expectedNumPools uint64 - }{ - { - name: "one pool", - newPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - }, - expectedNumPools: 1, - }, - { - name: "multiple pools", - newPools: []types.Pool{ - mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.USDC, 100), - ), - /*shares=*/ 100, - ), - mock.SpotPool( - /*poolId=*/ 2, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - mock.SpotPool( - /*poolId=*/ 3, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 100), - sdk.NewInt64Coin("unibi", 100), - ), - /*shares=*/ 100, - ), - }, - expectedNumPools: 3, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - sender := testutil.AccAddress() - // need funds to create pools - require.NoError(t, testapp.FundAccount( - app.BankKeeper, - ctx, - sender, - sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e18), - sdk.NewInt64Coin(denoms.NUSD, 1e18), - sdk.NewInt64Coin(denoms.USDC, 1e18), - ), - )) - - for _, newPool := range tc.newPools { - _, err := app.SpotKeeper.NewPool( - ctx, - sender, - newPool.PoolParams, - newPool.PoolAssets, - ) - require.NoError(t, err) - } - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.NumPools( - sdk.WrapSDKContext(ctx), - &types.QueryNumPoolsRequest{}, - ) - require.NoError(t, err) - require.Equal(t, tc.expectedNumPools, resp.NumPools) - }) - } -} - -func TestQueryPoolParams(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - expectedPoolParams types.PoolParams - }{ - { - name: "successful fetch pool params", - existingPool: types.Pool{ - Id: 1, - Address: testutil.AccAddress().String(), - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 200), - }, - expectedPoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - }, - { - name: "successful fetch pool params", - existingPool: types.Pool{ - Id: 1, - Address: testutil.AccAddress().String(), - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_STABLESWAP, - A: sdk.OneInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 200), - }, - expectedPoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.03"), - ExitFee: sdk.MustNewDecFromStr("0.03"), - PoolType: types.PoolType_STABLESWAP, - A: sdk.OneInt(), - }, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.PoolParams(sdk.WrapSDKContext(ctx), &types.QueryPoolParamsRequest{ - PoolId: 1, - }) - require.NoError(t, err) - require.Equal(t, tc.expectedPoolParams, *resp.PoolParams) - }) - } -} - -func TestQueryTotalShares(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - expectedTotalShares sdk.Coin - }{ - { - name: "successfully get existing shares", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedTotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - app.SpotKeeper.SetPool(ctx, tc.existingPool) - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.TotalShares( - sdk.WrapSDKContext(ctx), - &types.QueryTotalSharesRequest{ - PoolId: 1, - }, - ) - require.NoError(t, err) - require.Equal(t, tc.expectedTotalShares, resp.TotalShares) - }) - } -} - -func TestQuerySpotPrice(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - tokenInDenom string - tokenOutDenom string - expectedPrice sdk.Dec - }{ - { - name: "same quantity", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenInDenom: denoms.NUSD, - tokenOutDenom: "unibi", - expectedPrice: sdk.OneDec(), - }, - { - name: "price of 2 unusd per unibi", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 200), - ), - /*shares=*/ 100, - ), - tokenInDenom: denoms.NUSD, - tokenOutDenom: "unibi", - expectedPrice: sdk.MustNewDecFromStr("2"), - }, - { - name: "price of 0.5 unibi per unusd", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 200), - ), - /*shares=*/ 100, - ), - tokenInDenom: "unibi", - tokenOutDenom: denoms.NUSD, - expectedPrice: sdk.MustNewDecFromStr("0.5"), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - app.SpotKeeper.SetPool(ctx, tc.existingPool) - - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.SpotPrice( - sdk.WrapSDKContext(ctx), - &types.QuerySpotPriceRequest{ - PoolId: 1, - TokenInDenom: tc.tokenInDenom, - TokenOutDenom: tc.tokenOutDenom, - }, - ) - require.NoError(t, err) - require.Equal(t, tc.expectedPrice, sdk.MustNewDecFromStr(resp.SpotPrice)) - }) - } -} - -func TestQueryEstimateSwapExactAmountIn(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - tokenIn sdk.Coin - tokenOutDenom string - expectedTokenOut sdk.Coin - }{ - { - name: "simple swap", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NUSD, 100), - tokenOutDenom: "unibi", - expectedTokenOut: sdk.NewInt64Coin("unibi", 50), - }, - { - name: "complex swap", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 34844867), - sdk.NewInt64Coin(denoms.NUSD, 4684496849), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("unibi", 586848), - tokenOutDenom: denoms.NUSD, - // https://www.wolframalpha.com/input?i=4684496849+-+%2834844867+*+4684496849+%2F+%2834844867%2B586848%29+%29 - expectedTokenOut: sdk.NewInt64Coin(denoms.NUSD, 77588330), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.EstimateSwapExactAmountIn( - sdk.WrapSDKContext(ctx), - &types.QuerySwapExactAmountInRequest{ - PoolId: 1, - TokenIn: tc.tokenIn, - TokenOutDenom: tc.tokenOutDenom, - }, - ) - - require.NoError(t, err) - require.Equal(t, tc.expectedTokenOut, resp.TokenOut) - }) - } -} - -func TestQueryEstimateSwapExactAmountOut(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - tokenOut sdk.Coin - tokenInDenom string - expectedTokenIn sdk.Coin - }{ - { - name: "simple swap", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenOut: sdk.NewInt64Coin("unibi", 50), - tokenInDenom: denoms.NUSD, - // there's a swap fee that we take the ceiling of to round int - expectedTokenIn: sdk.NewInt64Coin(denoms.NUSD, 101), - }, - { - name: "complex swap", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 34844867), - sdk.NewInt64Coin(denoms.NUSD, 4684496849), - ), - /*shares=*/ 100, - ), - tokenOut: sdk.NewInt64Coin(denoms.NUSD, 77588330), - tokenInDenom: "unibi", - // https://www.wolframalpha.com/input?i=4684496849+-+%2834844867+*+4684496849+%2F+%2834844867%2B586848%29+%29 - expectedTokenIn: sdk.NewInt64Coin("unibi", 586848), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.EstimateSwapExactAmountOut( - sdk.WrapSDKContext(ctx), - &types.QuerySwapExactAmountOutRequest{ - PoolId: 1, - TokenOut: tc.tokenOut, - TokenInDenom: tc.tokenInDenom, - }, - ) - - require.NoError(t, err) - require.Equal(t, tc.expectedTokenIn, resp.TokenIn) - }) - } -} - -func TestQueryEstimateJoinExactAmountIn(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - tokensIn sdk.Coins - expectedPoolSharesOut sdkmath.Int - expectedRemCoins sdk.Coins - }{ - { - name: "complete join", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedPoolSharesOut: sdk.NewIntFromUint64(100), - expectedRemCoins: sdk.NewCoins(), - }, - { - name: "leftover coins", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 50), - sdk.NewInt64Coin(denoms.NUSD, 75), - ), - expectedPoolSharesOut: sdk.NewIntFromUint64(50), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 25), - ), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.EstimateJoinExactAmountIn( - sdk.WrapSDKContext(ctx), - &types.QueryJoinExactAmountInRequest{ - PoolId: 1, - TokensIn: tc.tokensIn, - }, - ) - - require.NoError(t, err) - require.Equal(t, tc.expectedPoolSharesOut, resp.PoolSharesOut) - require.Equal(t, tc.expectedRemCoins, resp.RemCoins) - }) - } -} - -func TestQueryEstimateExitExactAmountIn(t *testing.T) { - tests := []struct { - name string - existingPool types.Pool - poolSharesIn sdkmath.Int - expectedTokensOut sdk.Coins - }{ - { - name: "complete exit", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewIntFromUint64(100), - // exit fee leaves some tokens in pool - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 99), - sdk.NewInt64Coin(denoms.NUSD, 99), - ), - }, - { - name: "leftover coins", - existingPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewIntFromUint64(50), - // exit fee leaves some tokens in pool - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 49), - sdk.NewInt64Coin(denoms.NUSD, 49), - ), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - app.SpotKeeper.SetPool(ctx, tc.existingPool) - queryServer := keeper.NewQuerier(app.SpotKeeper) - - resp, err := queryServer.EstimateExitExactAmountIn( - sdk.WrapSDKContext(ctx), - &types.QueryExitExactAmountInRequest{ - PoolId: 1, - PoolSharesIn: tc.poolSharesIn, - }, - ) - - require.NoError(t, err) - require.Equal(t, tc.expectedTokensOut, resp.TokensOut) - }) - } -} diff --git a/x/spot/keeper/keeper.go b/x/spot/keeper/keeper.go deleted file mode 100644 index d7b6ec978..000000000 --- a/x/spot/keeper/keeper.go +++ /dev/null @@ -1,611 +0,0 @@ -package keeper - -import ( - "errors" - "fmt" - - storetypes "github.com/cosmos/cosmos-sdk/store/types" - - sdkmath "cosmossdk.io/math" - - "github.com/cometbft/cometbft/libs/log" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - gogotypes "github.com/cosmos/gogoproto/types" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -type ( - Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - paramstore paramtypes.Subspace - - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistrKeeper - } -) - -/* -NewKeeper Creates a new keeper for the spot module. - -args - - cdc: a codec - storeKey: the key-value store key that this keeper uses - ps: the param subspace for this keeper - accountKeeper: the auth module\'s keeper for accounts - bankKeeper: the bank module\'s keeper for bank transfers - -ret - - Keeper: a keeper for the spot module -*/ -func NewKeeper( - cdc codec.BinaryCodec, - storeKey storetypes.StoreKey, - ps paramtypes.Subspace, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distrKeeper types.DistrKeeper, -) Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } - - return Keeper{ - cdc: cdc, - storeKey: storeKey, - paramstore: ps, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - distrKeeper: distrKeeper, - } -} - -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) -} - -/* -Sets the next pool id that should be chosen when a new pool is created. -This function changes the state. - -args - - ctx: the cosmos-sdk context - poolNumber: the numeric id of the next pool number to use -*/ -func (k Keeper) SetNextPoolNumber(ctx sdk.Context, poolNumber uint64) { - store := ctx.KVStore(k.storeKey) - store.Set(types.KeyNextGlobalPoolNumber, - k.cdc.MustMarshal(&gogotypes.UInt64Value{Value: poolNumber})) -} - -/* -GetNextPoolNumber Retrieves the next pool id number to use when creating a new pool. -This function is idempotent (does not change state). - -args - - ctx: the cosmos-sdk context - -ret - - uint64: a pool id number -*/ -func (k Keeper) GetNextPoolNumber(ctx sdk.Context) (poolNumber uint64, err error) { - bz := ctx.KVStore(k.storeKey).Get(types.KeyNextGlobalPoolNumber) - if bz == nil { - return poolNumber, fmt.Errorf("pool number has not been initialized -- Should have been done in InitGenesis") - } - val := gogotypes.UInt64Value{} - k.cdc.MustUnmarshal(bz, &val) - return val.GetValue(), err -} - -/* -GetNextPoolNumberAndIncrement Returns the next pool id number, and increments the state's next pool id number by one -so that the next pool creation uses an autoincremented id number. - -args - - ctx: the cosmos-sdk context - -ret - - uint64: a pool id number -*/ -func (k Keeper) GetNextPoolNumberAndIncrement(ctx sdk.Context) (uint64, error) { - poolNumber, err := k.GetNextPoolNumber(ctx) - if err != nil { - return 0, err - } - k.SetNextPoolNumber(ctx, poolNumber+1) - return poolNumber, err -} - -/* -FetchPool Fetches a pool by id number. -Does not modify state. -Panics if the bytes could not be unmarshalled to a Pool proto object. - -args - - ctx: the cosmos-sdk context - poolId: the pool id number - -ret - - pool: a Pool proto object -*/ -func (k Keeper) FetchPool(ctx sdk.Context, poolId uint64) (pool types.Pool, err error) { - store := ctx.KVStore(k.storeKey) - k.cdc.MustUnmarshal(store.Get(types.GetKeyPrefixPools(poolId)), &pool) - - if len(pool.PoolAssets) == 0 { - return pool, types.ErrPoolNotFound.Wrapf("could not find pool with id %d", poolId) - } - return pool, nil -} - -/* -FetchPoolFromPair Given a pair of denom, find the corresponding pool id if it exists. - -args: - - denomA: One denom - - denomB: A second denom - -ret: - - poolId: the pool id - - err: error if any -*/ -func (k Keeper) FetchPoolFromPair(ctx sdk.Context, denomA string, denomB string) ( - pool types.Pool, err error, -) { - store := ctx.KVStore(k.storeKey) - - poolid := sdk.BigEndianToUint64(store.Get(types.GetDenomPrefixPoolIds(denomA, denomB))) - pool, err = k.FetchPool(ctx, poolid) - - if err != nil { - return pool, err - } - - return pool, nil -} - -/* -FetchAllPools fetch all pools from the store and returns them. -*/ -func (k Keeper) FetchAllPools(ctx sdk.Context) (pools []types.Pool) { - iterator := sdk.KVStorePrefixIterator(ctx.KVStore(k.storeKey), types.KeyPrefixPools) - defer iterator.Close() - for ; iterator.Valid(); iterator.Next() { - var pool types.Pool - k.cdc.MustUnmarshal(iterator.Value(), &pool) - pools = append(pools, pool) - } - - return pools -} - -/* -SetPool Writes a pool to the state. -Panics if the pool proto could not be marshaled. - -args: - - ctx: the cosmos-sdk context - - pool: the Pool proto object -*/ -func (k Keeper) SetPool(ctx sdk.Context, pool types.Pool) { - store := ctx.KVStore(k.storeKey) - store.Set(types.GetKeyPrefixPools(pool.Id), k.cdc.MustMarshal(&pool)) - - k.SetPoolIdByDenom(ctx, pool) -} - -/* -SetPoolIdByDenom Writes a pool to the state accessible with the PoolId. -Panics if the pool proto could not be marshaled. - -args: - - ctx: the cosmos-sdk context - - pool: the Pool proto object -*/ -func (k Keeper) SetPoolIdByDenom(ctx sdk.Context, pool types.Pool) { - denomA := pool.PoolAssets[0].Token.Denom - denomB := pool.PoolAssets[1].Token.Denom - - store := ctx.KVStore(k.storeKey) - store.Set( - types.GetDenomPrefixPoolIds(denomA, denomB), - sdk.Uint64ToBigEndian(pool.Id), - ) -} - -/* -Mints new pool share tokens and sends them to an account. - -args: - - ctx: the cosmos-sdk context - poolId: the pool id number - recipientAddr: the address of the recipient - amountPoolShares: the amount of pool shares to mint to the recipient - -ret: - - err: returns an error if something errored out -*/ -func (k Keeper) mintPoolShareToAccount(ctx sdk.Context, poolId uint64, recipientAddr sdk.AccAddress, amount sdkmath.Int) (poolShares sdk.Coin, err error) { - poolShares = sdk.NewCoin(types.GetPoolShareBaseDenom(poolId), amount) - newCoins := sdk.NewCoins(poolShares) - - err = k.bankKeeper.MintCoins(ctx, types.ModuleName, newCoins) - if err != nil { - return sdk.Coin{}, err - } - - err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, recipientAddr, newCoins) - if err != nil { - return sdk.Coin{}, err - } - - return poolShares, nil -} - -/* -Burns takes an amount of pool shares from an account and burns them. -It's the inverse of mintPoolShareToAccount. - -args: - - ctx: the cosmos-sdk context - poolId: the pool id number - recipientAddr: the address of the recipient - amountPoolShares: the amount of pool shares to mint to the recipient - -ret: - - err: returns an error if something errored out -*/ -func (k Keeper) burnPoolShareFromAccount( - ctx sdk.Context, - fromAddr sdk.AccAddress, - poolSharesOut sdk.Coin, -) (err error) { - if err = k.bankKeeper.SendCoinsFromAccountToModule( - ctx, - fromAddr, - types.ModuleName, - sdk.Coins{poolSharesOut}, - ); err != nil { - return err - } - - if err = k.bankKeeper.BurnCoins( - ctx, - types.ModuleName, - sdk.Coins{poolSharesOut}, - ); err != nil { - return err - } - - return nil -} - -/* -NewPool Creates a brand new pool and writes it to the state. - -args - - ctx: the cosmos-sdk context - sender: the pool creator's address - poolParams: parameters of the pool, represented by a PoolParams proto object - poolAssets: initial assets in the pool, represented by a PoolAssets proto object array - -ret - - poolId: the pool id number - err: an error if any occurred -*/ -func (k Keeper) NewPool( - ctx sdk.Context, - sender sdk.AccAddress, - poolParams types.PoolParams, - poolAssets []types.PoolAsset, -) (poolId uint64, err error) { - if len(poolAssets) < types.MinPoolAssets { - return 0, types.ErrTooFewPoolAssets - } - - if len(poolAssets) > types.MaxPoolAssets { - return 0, types.ErrTooManyPoolAssets - } - - if !k.areAllAssetsWhitelisted(ctx, poolAssets) { - return 0, types.ErrTokenNotAllowed - } - - _, err = k.FetchPoolFromPair(ctx, poolAssets[0].Token.Denom, poolAssets[1].Token.Denom) - if err == nil { - return 0, types.ErrPoolWithSameAssetsExists - } - - // send pool creation fee to community pool - params := k.GetParams(ctx) - err = k.distrKeeper.FundCommunityPool(ctx, params.PoolCreationFee, sender) - if err != nil { - return 0, err - } - - poolId, err = k.GetNextPoolNumberAndIncrement(ctx) - if err != nil { - return 0, err - } - poolName := fmt.Sprintf("nibiru-pool-%d", poolId) - // Create a new account for the pool to hold funds. - poolAccount := k.accountKeeper.NewAccount(ctx, authtypes.NewEmptyModuleAccount(poolName)) - k.accountKeeper.SetAccount(ctx, poolAccount) - - pool, err := types.NewPool(poolId, poolAccount.GetAddress(), poolParams, poolAssets) - if err != nil { - return 0, err - } - - // Transfer the PoolAssets tokens to the pool's module account from the user account. - var coins sdk.Coins - for _, asset := range poolAssets { - coins = append(coins, asset.Token) - } - coins = sdk.NewCoins(coins...) - - if err = k.bankKeeper.SendCoins(ctx, sender, poolAccount.GetAddress(), coins); err != nil { - return 0, err - } - - // Mint the initial 100.000000000000000000 pool share tokens to the sender - newPoolShares, err := k.mintPoolShareToAccount(ctx, pool.Id, sender, types.InitPoolSharesSupply) - if err != nil { - return 0, err - } - - // Finally, add the share token's meta data to the bank keeper. - poolShareBaseDenom := types.GetPoolShareBaseDenom(pool.Id) - poolShareDisplayDenom := types.GetPoolShareDisplayDenom(pool.Id) - k.bankKeeper.SetDenomMetaData(ctx, banktypes.Metadata{ - Description: fmt.Sprintf("The share token of the nibiru spot amm pool %d", pool.Id), - DenomUnits: []*banktypes.DenomUnit{ - { - Denom: poolShareBaseDenom, - Exponent: 0, - }, - { - Denom: poolShareDisplayDenom, - Exponent: 18, - }, - }, - Base: poolShareBaseDenom, - Display: poolShareDisplayDenom, - Name: fmt.Sprintf("Nibiru Pool %d Share Token", pool.Id), - Symbol: poolShareDisplayDenom, - }) - - k.SetPool(ctx, pool) - if err = k.RecordTotalLiquidityIncrease(ctx, coins); err != nil { - return poolId, err - } - - err = ctx.EventManager().EmitTypedEvent(&types.EventPoolCreated{ - Creator: sender.String(), - Fees: params.PoolCreationFee, - FinalPool: pool, - FinalUserPoolShares: newPoolShares, - }) - if err != nil { - return - } - - return poolId, nil -} - -// areAllAssetsWhitelisted checks if all assets are in whitelist -func (k Keeper) areAllAssetsWhitelisted(ctx sdk.Context, assets []types.PoolAsset) bool { - whitelistedAssets := k.GetParams(ctx).GetWhitelistedAssetsAsMap() - for _, a := range assets { - if _, ok := whitelistedAssets[a.Token.Denom]; !ok { - return false - } - } - - return true -} - -/* -JoinPool Joins a pool without swapping leftover assets if the ratios don't exactly match the pool's asset ratios. - -For example, if a pool has 100 pool shares, 100foo, 100bar, -and JoinPool is called with 75foo and bar, only 50foo and 50bar would be deposited. -25foo in remCoins would be returned to the user, along with 50 pool shares would be minted -and given to the user. - -Inverse of ExitPool. - -args: - - ctx: the cosmos-sdk context - - joinerAddr: the user who wishes to withdraw tokens - - poolId: the pool's numeric id - - tokensIn: the amount of liquidity to provide - -ret: - - pool: the updated pool after joining - - numSharesOut: the pool shares minted and returned to the user - - remCoins: the number of remaining coins from the user's initial deposit attempt - - err: error if any -*/ -func (k Keeper) JoinPool( - ctx sdk.Context, - joinerAddr sdk.AccAddress, - poolId uint64, - tokensIn sdk.Coins, - shouldSwap bool, -) (pool types.Pool, numSharesOut sdk.Coin, remCoins sdk.Coins, err error) { - pool, _ = k.FetchPool(ctx, poolId) - - if len(tokensIn) != len(pool.PoolAssets) && !shouldSwap { - return pool, numSharesOut, remCoins, errors.New("too few assets to join this pool") - } - - if !pool.AreTokensInDenomInPoolAssets(tokensIn) { - err = types.ErrTokenDenomNotFound - return - } - - poolAddr := pool.GetAddress() - - var numShares sdkmath.Int - if !shouldSwap || pool.PoolParams.PoolType == types.PoolType_STABLESWAP { - numShares, remCoins, err = pool.AddTokensToPool(tokensIn) - } else { - numShares, remCoins, err = pool.AddAllTokensToPool(tokensIn) - } - if err != nil { - return types.Pool{}, sdk.Coin{}, sdk.Coins{}, err - } - - tokensConsumed := tokensIn.Sub(remCoins...) - - // take coins from joiner to pool - if err = k.bankKeeper.SendCoins( - ctx, - /*from=*/ joinerAddr, - /*to=*/ poolAddr, - /*amount=*/ tokensConsumed, - ); err != nil { - return pool, numSharesOut, remCoins, err - } - - // give joiner LP shares - newPoolShares, err := k.mintPoolShareToAccount( - ctx, - /*from=*/ pool.Id, - /*to=*/ joinerAddr, - /*amount=*/ numShares, - ) - if err != nil { - return types.Pool{}, sdk.Coin{}, sdk.Coins{}, err - } - - // record changes to store - k.SetPool(ctx, pool) - if err = k.RecordTotalLiquidityIncrease(ctx, tokensConsumed); err != nil { - return pool, numSharesOut, remCoins, err - } - - existingPoolShares := k.bankKeeper.GetBalance(ctx, joinerAddr, newPoolShares.Denom) - - err = ctx.EventManager().EmitTypedEvent(&types.EventPoolJoined{ - Address: joinerAddr.String(), - TokensIn: tokensIn, - PoolSharesOut: newPoolShares, - RemCoins: remCoins, - FinalPool: pool, - FinalUserPoolShares: existingPoolShares.Add(newPoolShares), - }) - if err != nil { - return - } - - return pool, newPoolShares, remCoins, nil -} - -/* -ExitPool Exits a pool by taking out tokens relative to the amount of pool shares -in proportion to the total amount of pool shares. - -For example, if a pool has 100 pool shares and ExitPool is called with 50 pool shares, -half of the tokens (minus exit fees) are returned to the user. - -Inverse of JoinPool. - -Throws an error if the provided pool shares doesn't match up with the pool's actual pool share. - -args: - - ctx: the cosmos-sdk context - - sender: the user who wishes to withdraw tokens - - poolId: the pool's numeric id - - poolSharesOut: the amount of pool shares to burn - -ret: - - tokensOut: the amount of liquidity withdrawn from the pool - - err: error if any -*/ -func (k Keeper) ExitPool( - ctx sdk.Context, - sender sdk.AccAddress, - poolId uint64, - poolSharesOut sdk.Coin, -) (tokensOut sdk.Coins, err error) { - pool, _ := k.FetchPool(ctx, poolId) - - // sanity checks - if poolSharesOut.Denom != pool.TotalShares.Denom { - return sdk.Coins{}, - fmt.Errorf("invalid pool share denom. expected %s, got %s", - pool.TotalShares.Denom, - poolSharesOut.Denom, - ) - } - - if poolSharesOut.Amount.GT(pool.TotalShares.Amount) || - poolSharesOut.Amount.LTE(sdk.ZeroInt()) { - return sdk.Coins{}, fmt.Errorf( - "invalid number of pool shares %s must be between 0 and %s", - poolSharesOut.Amount, pool.TotalShares.Amount, - ) - } - - existingPoolShares := k.bankKeeper.GetBalance(ctx, sender, poolSharesOut.Denom) - - // calculate withdrawn liquidity - tokensOut, fees, err := pool.ExitPool(poolSharesOut.Amount) - if err != nil { - return sdk.Coins{}, err - } - - // apply exchange of pool shares for tokens - if err = k.bankKeeper.SendCoins(ctx, pool.GetAddress(), sender, tokensOut); err != nil { - return sdk.Coins{}, err - } - - if err = k.burnPoolShareFromAccount(ctx, sender, poolSharesOut); err != nil { - return sdk.Coins{}, err - } - - // record state changes - k.SetPool(ctx, pool) - if err = k.RecordTotalLiquidityDecrease(ctx, tokensOut); err != nil { - return sdk.Coins{}, err - } - - err = ctx.EventManager().EmitTypedEvent(&types.EventPoolExited{ - Address: sender.String(), - PoolSharesIn: poolSharesOut, - TokensOut: tokensOut, - Fees: fees, - FinalPool: pool, - FinalUserPoolShares: existingPoolShares.Sub(poolSharesOut), - }) - if err != nil { - return sdk.Coins{}, err - } - - return tokensOut, nil -} diff --git a/x/spot/keeper/keeper_test.go b/x/spot/keeper/keeper_test.go deleted file mode 100644 index 5c1d7fa51..000000000 --- a/x/spot/keeper/keeper_test.go +++ /dev/null @@ -1,873 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - - "github.com/cometbft/cometbft/crypto/ed25519" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestGetAndSetNextPoolNumber(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - app.SpotKeeper.SetNextPoolNumber(ctx, 150) - - // Read from store - poolNumber, err := app.SpotKeeper.GetNextPoolNumber(ctx) - assert.NoError(t, err) - require.EqualValues(t, poolNumber, 150) -} - -func TestGetNextPoolNumberAndIncrement(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write a pool number - app.SpotKeeper.SetNextPoolNumber(ctx, 200) - - // Get next and increment should return the current pool number - poolNumber, err := app.SpotKeeper.GetNextPoolNumberAndIncrement(ctx) - assert.NoError(t, err) - require.EqualValues(t, poolNumber, 200) - - // Check that the previous call incremented the number - poolNumber, err = app.SpotKeeper.GetNextPoolNumber(ctx) - assert.NoError(t, err) - require.EqualValues(t, poolNumber, 201) -} - -func TestSetAndFetchPool(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - pool := types.Pool{ - Id: 150, - PoolParams: types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewCoin(denoms.BTC, sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin(denoms.NUSD, sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/150", 100), - } - - app.SpotKeeper.SetPool(ctx, pool) - - retrievedPool, err := app.SpotKeeper.FetchPool(ctx, 150) - assert.NoError(t, err) - require.Equal(t, pool, retrievedPool) -} - -func TestFetchPoolFromPair(t *testing.T) { - tests := []struct { - name string - firstToken string - secondToken string - expectedPass bool - expectedPoolId uint64 - }{ - { - name: "Correct parse pool 1", - firstToken: "tokenA", - secondToken: "tokenB", - expectedPass: true, - expectedPoolId: 1, - }, - { - name: "Correct parse pool 1 inverted", - firstToken: "tokenB", - secondToken: "tokenA", - expectedPass: true, - expectedPoolId: sdk.OneInt().Uint64(), - }, - { - name: "Correct parse pool 2", - firstToken: "tokenB", - secondToken: "tokenC", - expectedPass: true, - expectedPoolId: sdk.NewInt(2).Uint64(), - }, - { - name: "Correct parse pool 2 inverted", - firstToken: "tokenC", - secondToken: "tokenB", - expectedPass: true, - expectedPoolId: sdk.NewInt(2).Uint64(), - }, - { - name: "Correct parse pool 2 inverted", - firstToken: "tokenC", - secondToken: "tokenB", - expectedPass: true, - expectedPoolId: sdk.NewInt(2).Uint64(), - }, - { - name: "Incorrect token denom, raise", - firstToken: "tokenA", - secondToken: "tokenC", - expectedPass: false, - }, - { - name: "Incorrect token denom, inverted", - firstToken: "tokenC", - secondToken: "tokenA", - expectedPass: false, - }, - { - name: "Incorrect token denom, same token", - firstToken: "tokenA", - secondToken: "tokenA", - expectedPass: false, - }, - { - name: "Incorrect token denom, missing token", - firstToken: "", - secondToken: "tokenA", - expectedPass: false, - }, - { - name: "Incorrect token denom, missing tokens", - firstToken: "", - secondToken: "", - expectedPass: false, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - app.SpotKeeper.SetPool(ctx, types.Pool{ - Id: 1, - PoolParams: types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewCoin("tokenB", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("tokenA", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - Address: "address1", - }) - - app.SpotKeeper.SetPool(ctx, types.Pool{ - Id: 2, - PoolParams: types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewCoin("tokenB", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("tokenC", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - Address: "address2", - }) - - retrievedPool, err := app.SpotKeeper.FetchPoolFromPair(ctx, tc.firstToken, tc.secondToken) - retrievedPoolId := retrievedPool.Id - if tc.expectedPass { - require.NoError(t, err) - - require.Equal(t, tc.expectedPoolId, retrievedPoolId) - } else { - require.Error(t, err) - } - }) - } -} - -func TestNewPool(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolCreationFeeCoin := sdk.NewInt64Coin(denoms.NIBI, 1000*common.TO_MICRO) - app.SpotKeeper.SetParams(ctx, types.NewParams( - /*startingPoolNumber=*/ 1, - /*poolCreationFee=*/ sdk.NewCoins(poolCreationFeeCoin), - /*whitelistedAssets*/ []string{ - "uatom", - "uosmo", - }, - )) - - userAddr := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes()) - - err := testapp.FundAccount(app.BankKeeper, ctx, userAddr, sdk.NewCoins( - sdk.NewCoin("uatom", sdk.NewInt(1000)), - sdk.NewCoin("uosmo", sdk.NewInt(1000)), - poolCreationFeeCoin, - )) - require.NoError(t, err) - - poolId, err := app.SpotKeeper.NewPool(ctx, - // sender - userAddr, - // poolParams - types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - // poolAssets - []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("uosmo", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - }) - require.NoError(t, err) - - retrievedPool, _ := app.SpotKeeper.FetchPool(ctx, poolId) - - require.Equal(t, types.Pool{ - Id: 1, - Address: retrievedPool.Address, // address is random so can't test, just reuse value - PoolParams: types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - A: sdk.ZeroInt(), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom", sdk.NewInt(1000)), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewCoin("uosmo", sdk.NewInt(1000)), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalWeight: sdk.NewInt(2 << 30), - TotalShares: sdk.NewCoin("nibiru/pool/1", sdkmath.NewIntWithDecimal(100, 18)), - }, retrievedPool) -} - -func TestNewPoolNotEnoughFunds(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - app.SpotKeeper.SetParams(ctx, types.NewParams( - /*startingPoolNumber=*/ 1, - /*poolCreationFee=*/ sdk.NewCoins(sdk.NewInt64Coin(denoms.NIBI, 1000*common.TO_MICRO)), - /*whitelistedAssets*/ []string{}, - )) - - userAddr := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes()) - - err := testapp.FundAccount(app.BankKeeper, ctx, userAddr, sdk.NewCoins( - sdk.NewCoin("uatom", sdk.NewInt(1000)), - sdk.NewCoin("uosmo", sdk.NewInt(1000)), - sdk.NewCoin("unibi", sdk.NewInt(999*common.TO_MICRO)), - )) - require.NoError(t, err) - - _, err = app.SpotKeeper.NewPool(ctx, - // sender - userAddr, - // poolParams - types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - }, - // poolAssets - []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("uosmo", sdk.NewInt(1000)), - Weight: sdk.OneInt(), - }, - }) - require.Error(t, err) -} - -func TestNewPoolTooLittleAssets(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - userAddr, err := sdk.AccAddressFromBech32(testutil.AccAddress().String()) - require.NoError(t, err) - - poolParams := types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - } - poolAssets := []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom", sdk.NewInt(1000)), - }, - } - - poolId, err := app.SpotKeeper.NewPool(ctx, userAddr, poolParams, poolAssets) - require.ErrorIs(t, err, types.ErrTooFewPoolAssets) - require.Equal(t, uint64(0), poolId) -} - -func TestKeeperNewPoolNotWhitelistedAssets(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - userAddr, err := sdk.AccAddressFromBech32(testutil.AccAddress().String()) - require.NoError(t, err) - - poolParams := types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - } - - poolAssets := []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom1", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom2", sdk.NewInt(1000)), - }, - } - - poolId, err := app.SpotKeeper.NewPool(ctx, userAddr, poolParams, poolAssets) - require.ErrorIs(t, err, types.ErrTokenNotAllowed) - require.Equal(t, uint64(0), poolId) -} - -func TestNewPoolTooManyAssets(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - userAddr, err := sdk.AccAddressFromBech32(testutil.AccAddress().String()) - require.NoError(t, err) - - poolParams := types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: types.PoolType_BALANCER, - } - poolAssets := []types.PoolAsset{ - { - Token: sdk.NewCoin("uatom1", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom2", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom3", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom4", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom5", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom6", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom7", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom8", sdk.NewInt(1000)), - }, - { - Token: sdk.NewCoin("uatom9", sdk.NewInt(1000)), - }, - } - - poolId, err := app.SpotKeeper.NewPool(ctx, userAddr, poolParams, poolAssets) - require.ErrorIs(t, err, types.ErrTooManyPoolAssets) - require.Equal(t, uint64(0), poolId) -} - -func TestNewPoolDups(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - userAddr, err := sdk.AccAddressFromBech32(testutil.AccAddress().String()) - require.NoError(t, err) - - poolCreationFeeCoin := sdk.NewCoins(sdk.NewInt64Coin(denoms.NIBI, 1)) - err = testapp.FundAccount(app.BankKeeper, ctx, userAddr, sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(1000)), - sdk.NewCoin("bar", sdk.NewInt(1000)), - sdk.NewCoin("foo", sdk.NewInt(1000)), - )) - require.NoError(t, err) - app.SpotKeeper.SetParams(ctx, types.NewParams( - /*startingPoolNumber=*/ 1, - /*poolCreationFee=*/ poolCreationFeeCoin, - /*whitelistedAssets*/ []string{ - "bar", - "foo", - }, - )) - - poolParams := types.PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - } - poolAssets := []types.PoolAsset{ - { - Token: sdk.NewCoin("bar", sdk.NewInt(10)), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewCoin("foo", sdk.NewInt(10)), - Weight: sdk.OneInt(), - }, - } - - poolId, err := app.SpotKeeper.NewPool(ctx, userAddr, poolParams, poolAssets) - require.NoError(t, err) - require.Equal(t, uint64(1), poolId) - - _, err = app.SpotKeeper.NewPool(ctx, userAddr, poolParams, poolAssets) - require.ErrorIs(t, err, types.ErrPoolWithSameAssetsExists) -} - -func TestJoinPool(t *testing.T) { - const shareDenom = "nibiru/pool/1" - - tests := []struct { - name string - joinerInitialFunds sdk.Coins - initialPool types.Pool - tokensIn sdk.Coins - expectedNumSharesOut sdk.Coin - expectedRemCoins sdk.Coins - expectedJoinerFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "join with all assets", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 100), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins(sdk.NewInt64Coin(shareDenom, 100)), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 200), - sdk.NewInt64Coin("foo", 200), - ), - /*shares=*/ 200), - }, - { - name: "join with some assets, none remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 50), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 150), - sdk.NewInt64Coin("foo", 150), - ), - /*shares=*/ 150), - }, - { - name: "join with some assets, some remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 75), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("foo", 25), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 150), - sdk.NewInt64Coin("foo", 150), - ), - /*shares=*/ 150), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - joinerAddr := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, joinerAddr, tc.joinerInitialFunds)) - - pool, numSharesOut, remCoins, err := app.SpotKeeper.JoinPool(ctx, joinerAddr, 1, tc.tokensIn, false) - require.NoError(t, err) - require.Equal(t, tc.expectedFinalPool, pool) - require.Equal(t, tc.expectedNumSharesOut, numSharesOut) - require.Equal(t, tc.expectedRemCoins, remCoins) - }) - } -} - -func TestJoinPoolAllAssets(t *testing.T) { - const shareDenom = "nibiru/pool/1" - - tests := []struct { - name string - joinerInitialFunds sdk.Coins - initialPool types.Pool - tokensIn sdk.Coins - expectedNumSharesOut sdk.Coin - expectedRemCoins sdk.Coins - expectedJoinerFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "join with all assets", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 100), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins(sdk.NewInt64Coin(shareDenom, 100)), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 200), - sdk.NewInt64Coin("foo", 200), - ), - /*shares=*/ 200), - }, - { - name: "join with some assets, none remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 50), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 150), - sdk.NewInt64Coin("foo", 150), - ), - /*shares=*/ 150), - }, - { - name: "join with some assets, pool empty in one side, none remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 1), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 904), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 904), - sdk.NewInt64Coin("bar", 0), - sdk.NewInt64Coin("foo", 0), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 101), - ), - /*shares=*/ 1004), - }, - { - name: "join with some assets, but swap done", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 75), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 62), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 62), - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 25), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 150), - sdk.NewInt64Coin("foo", 175), - ), - /*shares=*/ 162), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - joinerAddr := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, joinerAddr, tc.joinerInitialFunds)) - - pool, numSharesOut, remCoins, err := app.SpotKeeper.JoinPool(ctx, joinerAddr, 1, tc.tokensIn, true) - require.NoError(t, err) - require.Equal(t, tc.expectedFinalPool, pool) - require.Equal(t, tc.expectedNumSharesOut, numSharesOut) - require.Equal(t, tc.expectedRemCoins, remCoins) - require.Equal(t, tc.expectedJoinerFinalFunds, app.BankKeeper.GetAllBalances(ctx, joinerAddr)) - }) - } -} - -func TestExitPool(t *testing.T) { - const shareDenom = "nibiru/pool/1" - - tests := []struct { - name string - joinerInitialFunds sdk.Coins - initialPoolFunds sdk.Coins - initialPool types.Pool - poolSharesIn sdk.Coin - expectedTokensOut sdk.Coins - expectedJoinerFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "exit all pool shares", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - initialPoolFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 100), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 99), - sdk.NewInt64Coin("foo", 99), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 199), - sdk.NewInt64Coin("foo", 199), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 1), - sdk.NewInt64Coin("foo", 1), - ), - /*shares=*/ 0, - ), - }, - { - name: "exit half pool shares", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - initialPoolFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 50), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 49), - sdk.NewInt64Coin("foo", 49), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("bar", 149), - sdk.NewInt64Coin("foo", 149), - sdk.NewInt64Coin(shareDenom, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("bar", 51), - sdk.NewInt64Coin("foo", 51), - ), - /*shares=*/ 50, - ), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, sender, tc.joinerInitialFunds)) - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, tc.initialPool.GetAddress(), tc.initialPoolFunds)) - - tokensOut, err := app.SpotKeeper.ExitPool(ctx, sender, 1, tc.poolSharesIn) - require.NoError(t, err) - require.Equal(t, tc.expectedTokensOut, tokensOut) - require.Equal(t, tc.expectedJoinerFinalFunds, app.BankKeeper.GetAllBalances(ctx, sender)) - pool, _ := app.SpotKeeper.FetchPool(ctx, 1) - require.Equal(t, tc.expectedFinalPool, pool) - }) - } -} diff --git a/x/spot/keeper/liquidity.go b/x/spot/keeper/liquidity.go deleted file mode 100644 index 6151af626..000000000 --- a/x/spot/keeper/liquidity.go +++ /dev/null @@ -1,156 +0,0 @@ -package keeper - -// Everything to do with total liquidity in the spot and liquidity of specific coin denoms. - -import ( - "fmt" - - "github.com/cosmos/cosmos-sdk/store/prefix" - - spottypes "github.com/NibiruChain/nibiru/x/spot/types" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common" -) - -/* -Fetches the liquidity for a specific coin denom. - -args: - - ctx: the cosmos-sdk context - denom: the coin denom - -ret: - - amount: the amount of liquidity for the provided coin. Returns 0 if not found. -*/ -func (k Keeper) GetDenomLiquidity(ctx sdk.Context, denom string) (amount sdkmath.Int, err error) { - store := ctx.KVStore(k.storeKey) - bz := store.Get(spottypes.GetDenomLiquidityPrefix(denom)) - if bz == nil { - return sdk.ZeroInt(), nil - } - - if err := amount.Unmarshal(bz); err != nil { - return amount, common.CombineErrors( - fmt.Errorf("failed to GetDenomLiquidty for denom %s", denom), - err) - } - - return amount, nil -} - -/* -Sets the liquidity for a specific coin denom. - -args: - - ctx: the cosmos-sdk context - denom: the coin denom - amount: the amount of liquidity for the coin -*/ -func (k Keeper) SetDenomLiquidity(ctx sdk.Context, denom string, amount sdkmath.Int) error { - store := ctx.KVStore(k.storeKey) - bz, err := amount.Marshal() - if err != nil { - return err - } - store.Set(spottypes.GetDenomLiquidityPrefix(denom), bz) - return nil -} - -/* -Fetches the liquidity for all tokens in the spot. - -args: - - ctx: the cosmos-sdk context - -ret: - - coins: an array of liquidities in the spot -*/ -func (k Keeper) GetTotalLiquidity(ctx sdk.Context) (coins sdk.Coins) { - store := ctx.KVStore(k.storeKey) - prefixStore := prefix.NewStore(store, spottypes.KeyTotalLiquidity) - - iterator := prefixStore.Iterator(nil, nil) - defer iterator.Close() - - for ; iterator.Valid(); iterator.Next() { - denom := string(iterator.Key()) - amount, err := k.GetDenomLiquidity(ctx, denom) - if err != nil { - ctx.Logger().Error(err.Error()) - } else { - coins = coins.Add(sdk.NewCoin(denom, amount)) - } - } - - return coins -} - -/* -Sets the total liquidity for each coin. - -args: - - ctx: the cosmos-sdk context - coins: the array of liquidities to update with -*/ -func (k Keeper) SetTotalLiquidity(ctx sdk.Context, coins sdk.Coins) error { - for _, coin := range coins { - if err := k.SetDenomLiquidity(ctx, coin.Denom, coin.Amount); err != nil { - return err - } - } - return nil -} - -/* -Increases the total liquidity of the provided coins by the coin amount. - -args: - - ctx: the cosmos-sdk context - coins: the coins added to the spot -*/ -func (k Keeper) RecordTotalLiquidityIncrease(ctx sdk.Context, coins sdk.Coins) error { - for _, coin := range coins { - amount, err := k.GetDenomLiquidity(ctx, coin.Denom) - if err != nil { - return err - } - amount = amount.Add(coin.Amount) - if err := k.SetDenomLiquidity(ctx, coin.Denom, amount); err != nil { - return err - } - } - return nil -} - -/* -Increases the total liquidity of the provided coins by the coin amount. - -args: - - ctx: the cosmos-sdk context - coins: the coins removed from the spot -*/ -func (k Keeper) RecordTotalLiquidityDecrease(ctx sdk.Context, coins sdk.Coins) error { - for _, coin := range coins { - amount, err := k.GetDenomLiquidity(ctx, coin.Denom) - if err != nil { - return err - } - amount = amount.Sub(coin.Amount) - if err := k.SetDenomLiquidity(ctx, coin.Denom, amount); err != nil { - return err - } - } - return nil -} diff --git a/x/spot/keeper/liquidity_test.go b/x/spot/keeper/liquidity_test.go deleted file mode 100644 index cd1409c38..000000000 --- a/x/spot/keeper/liquidity_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/spot/keeper" -) - -func TestGetSetDenomLiquidity(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - coin := sdk.NewCoin("nibi", sdk.NewInt(1_000)) - assert.NoError(t, app.SpotKeeper.SetDenomLiquidity(ctx, coin.Denom, coin.Amount)) - - // Read from store - amount, err := app.SpotKeeper.GetDenomLiquidity(ctx, "nibi") - assert.NoError(t, err) - require.EqualValues(t, sdk.NewInt(1000), amount) -} - -func TestGetTotalLiquidity(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - coinMap := map[string]sdkmath.Int{ - "atom": sdk.NewInt(123), - "nibi": sdk.NewInt(456), - "foo": sdk.NewInt(789), - } - for denom, amount := range coinMap { - coin := sdk.NewCoin(denom, amount) - assert.NoError(t, app.SpotKeeper.SetDenomLiquidity(ctx, coin.Denom, coin.Amount)) - } - - // Read from store - coins := app.SpotKeeper.GetTotalLiquidity(ctx) - - require.EqualValues(t, sdk.NewCoins( - sdk.NewCoin("atom", coinMap["atom"]), - sdk.NewCoin("nibi", coinMap["nibi"]), - sdk.NewCoin("foo", coinMap["foo"]), - ), coins) -} - -// assertLiqValues checks if the total liquidity for each denom (key) of the -// expected map matches what's given by the SpotKeeper -func assertLiqValues( - t *testing.T, - ctx sdk.Context, - spotKeeper keeper.Keeper, - expected map[string]sdkmath.Int, -) { - for denom, expectedLiq := range expected { - liq, err := spotKeeper.GetDenomLiquidity(ctx, denom) - assert.NoError(t, err) - assert.EqualValues(t, liq, expectedLiq) - } -} - -func TestSetTotalLiquidity(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - assert.NoError(t, app.SpotKeeper.SetTotalLiquidity(ctx, sdk.NewCoins( - sdk.NewCoin("atom", sdk.NewInt(123)), - sdk.NewCoin("nibi", sdk.NewInt(456)), - sdk.NewCoin("foo", sdk.NewInt(789)), - ))) - - // Read from store - expectedLiqValues := map[string]sdkmath.Int{ - "atom": sdk.NewInt(123), - "nibi": sdk.NewInt(456), - "foo": sdk.NewInt(789), - } - assertLiqValues(t, ctx, app.SpotKeeper, expectedLiqValues) -} - -func TestRecordTotalLiquidityIncrease(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - assert.NoError(t, app.SpotKeeper.SetTotalLiquidity(ctx, sdk.NewCoins( - sdk.NewCoin("atom", sdk.NewInt(100)), - sdk.NewCoin("nibi", sdk.NewInt(200)), - ))) - err := app.SpotKeeper.RecordTotalLiquidityIncrease(ctx, sdk.NewCoins( - sdk.NewCoin("atom", sdk.NewInt(50)), - sdk.NewCoin("nibi", sdk.NewInt(75)), - )) - assert.NoError(t, err) - - expectedLiqValues := map[string]sdkmath.Int{ - "atom": sdk.NewInt(150), - "nibi": sdk.NewInt(275), - } - assertLiqValues(t, ctx, app.SpotKeeper, expectedLiqValues) -} - -func TestRecordTotalLiquidityDecrease(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // Write to store - assert.NoError(t, app.SpotKeeper.SetTotalLiquidity(ctx, sdk.NewCoins( - sdk.NewCoin("atom", sdk.NewInt(100)), - sdk.NewCoin("nibi", sdk.NewInt(200)), - ))) - err := app.SpotKeeper.RecordTotalLiquidityDecrease(ctx, sdk.NewCoins( - sdk.NewCoin("atom", sdk.NewInt(50)), - sdk.NewCoin("nibi", sdk.NewInt(75)), - )) - assert.NoError(t, err) - - expectedLiqValues := map[string]sdkmath.Int{ - "atom": sdk.NewInt(50), - "nibi": sdk.NewInt(125), - } - assertLiqValues(t, ctx, app.SpotKeeper, expectedLiqValues) -} diff --git a/x/spot/keeper/msg_server.go b/x/spot/keeper/msg_server.go deleted file mode 100644 index 2c1fb63d9..000000000 --- a/x/spot/keeper/msg_server.go +++ /dev/null @@ -1,166 +0,0 @@ -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -type msgServer struct { - Keeper -} - -// NewMsgServerImpl returns an implementation of the MsgServer interface -// for the provided Keeper. -func NewMsgServerImpl(keeper Keeper) types.MsgServer { - return &msgServer{Keeper: keeper} -} - -var _ types.MsgServer = msgServer{} - -/* -CreatePool Handler for the MsgCreatePool transaction. - -args - - ctx: the cosmos-sdk context - msg: a MsgCreatePool proto object - -ret - - MsgCreatePoolResponse: the MsgCreatePoolResponse proto object response, containing the pool id number - error: an error if any occurred -*/ -func (k msgServer) CreatePool(goCtx context.Context, msg *types.MsgCreatePool) (*types.MsgCreatePoolResponse, error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - sender, err := sdk.AccAddressFromBech32(msg.Creator) - if err != nil { - return nil, err - } - - poolId, err := k.NewPool(ctx, sender, *msg.PoolParams, msg.PoolAssets) - if err != nil { - return nil, err - } - - return &types.MsgCreatePoolResponse{ - PoolId: poolId, - }, nil -} - -/* -JoinPool Handler for the MsgJoinPool transaction. - -args - - ctx: the cosmos-sdk context - msg: a MsgJoinPool proto object - -ret - - MsgJoinPoolResponse: the MsgJoinPoolResponse proto object response, containing the pool id number - error: an error if any occurred -*/ -func (k msgServer) JoinPool(ctx context.Context, msg *types.MsgJoinPool) (*types.MsgJoinPoolResponse, error) { - sdkContext := sdk.UnwrapSDKContext(ctx) - - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, err - } - - pool, numSharesOut, remCoins, err := k.Keeper.JoinPool( - sdkContext, - sender, - msg.PoolId, - msg.TokensIn, - msg.UseAllCoins, - ) - if err != nil { - return nil, err - } - - return &types.MsgJoinPoolResponse{ - Pool: &pool, - NumPoolSharesOut: numSharesOut, - RemainingCoins: remCoins, - }, nil -} - -/* -ExitPool Handler for the MsgExitPool transaction. - -args - - ctx: the cosmos-sdk context - msg: a MsgExitPool proto object - -ret - - MsgExitPoolResponse: the MsgExitPoolResponse proto object response, containing the amount of tokens returned to the user - error: an error if any occurred -*/ -func (k msgServer) ExitPool(ctx context.Context, msg *types.MsgExitPool) (*types.MsgExitPoolResponse, error) { - sdkContext := sdk.UnwrapSDKContext(ctx) - - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, err - } - - tokensOut, err := k.Keeper.ExitPool( - sdkContext, - sender, - msg.PoolId, - msg.PoolShares, - ) - if err != nil { - return nil, err - } - - return &types.MsgExitPoolResponse{ - TokensOut: tokensOut, - }, nil -} - -/* -SwapAssets Handler for the MsgJoinPool transaction. - -args - - ctx: the cosmos-sdk context - msg: a MsgJoinPool proto object - -ret - - MsgJoinPoolResponse: the MsgJoinPoolResponse proto object response, containing the pool id number - error: an error if any occurred -*/ -func (k msgServer) SwapAssets(ctx context.Context, msg *types.MsgSwapAssets) ( - *types.MsgSwapAssetsResponse, error, -) { - sdkContext := sdk.UnwrapSDKContext(ctx) - - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, err - } - - tokenOut, err := k.Keeper.SwapExactAmountIn( - sdkContext, - sender, - msg.PoolId, - msg.TokenIn, - msg.TokenOutDenom, - ) - if err != nil { - return nil, err - } - - return &types.MsgSwapAssetsResponse{ - TokenOut: tokenOut, - }, nil -} diff --git a/x/spot/keeper/msg_server_test.go b/x/spot/keeper/msg_server_test.go deleted file mode 100644 index 0b57f1698..000000000 --- a/x/spot/keeper/msg_server_test.go +++ /dev/null @@ -1,1254 +0,0 @@ -package keeper_test - -import ( - "fmt" - "testing" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - - "github.com/cometbft/cometbft/crypto/ed25519" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/spot/keeper" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestCreatePool(t *testing.T) { - tests := []struct { - name string - creatorAddr sdk.AccAddress - poolParams types.PoolParams - poolAssets []types.PoolAsset - senderInitialFunds sdk.Coins - expectedErr error - }{ - { - name: "invalid creator addr", - creatorAddr: []byte{}, - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{}, - expectedErr: fmt.Errorf("empty address string is not allowed"), - }, - { - name: "not enough assets", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{}, - expectedErr: types.ErrTooFewPoolAssets, - }, - { - name: "too many assets", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("ccc", 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTooManyPoolAssets, - }, - { - name: "asset not whitelisted 1", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("aaaa", 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTokenNotAllowed, - }, - { - name: "asset not whitelisted 2", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTokenNotAllowed, - }, - { - name: "insufficient pool creation fee", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9-1), - sdk.NewInt64Coin("aaa", 1), - sdk.NewInt64Coin("bbb", 1), - ), - expectedErr: fmt.Errorf("999999999unibi is smaller than 1000000000unibi: insufficient funds"), - }, - { - name: "insufficient initial deposit", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NIBI, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - ), - expectedErr: fmt.Errorf("is smaller than 1unibi: insufficient funds"), // SDK does not print 0nibi - }, - { - name: "successful pool creation", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1), - sdk.NewInt64Coin(denoms.USDC, 1), - ), - expectedErr: nil, - }, - { - name: "invalid creator addr - Stableswap", - creatorAddr: []byte{}, - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{}, - expectedErr: fmt.Errorf("empty address string is not allowed"), - }, - { - name: "not enough assets - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{}, - expectedErr: types.ErrTooFewPoolAssets, - }, - { - name: "too many assets - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("ccc", 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTooManyPoolAssets, - }, - { - name: "asset not whitelisted 1 - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("aaaa", 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTokenNotAllowed, - }, - { - name: "asset not whitelisted 2 - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - expectedErr: types.ErrTokenNotAllowed, - }, - { - name: "insufficient pool creation fee - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9-1), - sdk.NewInt64Coin("aaa", 1), - sdk.NewInt64Coin("bbb", 1), - ), - expectedErr: fmt.Errorf("999999999unibi is smaller than 1000000000unibi: insufficient funds"), - }, - { - name: "insufficient initial deposit - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NIBI, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - ), - expectedErr: fmt.Errorf("is smaller than 1unibi: insufficient funds"), // SDK cannot print 0unibi - }, - { - name: "successful pool creation - Stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1), - sdk.NewInt64Coin(denoms.USDC, 1), - ), - expectedErr: nil, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - msgServer := keeper.NewMsgServerImpl(app.SpotKeeper) - - if tc.creatorAddr == nil { - tc.creatorAddr = ed25519.GenPrivKey().PubKey().Address().Bytes() - } - if tc.senderInitialFunds != nil { - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, tc.creatorAddr, tc.senderInitialFunds)) - } - - msgCreatePool := types.MsgCreatePool{ - Creator: tc.creatorAddr.String(), - PoolParams: &tc.poolParams, - PoolAssets: tc.poolAssets, - } - - _, err := msgServer.CreatePool(sdk.WrapSDKContext(ctx), &msgCreatePool) - if tc.expectedErr != nil { - require.Contains(t, err.Error(), tc.expectedErr.Error()) - } else { - require.NoError(t, err) - } - }) - } -} - -func TestCreateExitJoinPool(t *testing.T) { - tests := []struct { - name string - creatorAddr sdk.AccAddress - poolParams types.PoolParams - poolAssets []types.PoolAsset - senderInitialFunds sdk.Coins - expectedErr error - useAllCoins bool - }{ - { - name: "happy path", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1_000), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1_000), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1_000), - sdk.NewInt64Coin(denoms.USDC, 1_000), - ), - expectedErr: nil, - useAllCoins: true, - }, - { - name: "happy path - stableswap", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1_000), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1_000), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1_000), - sdk.NewInt64Coin(denoms.USDC, 1_000), - ), - expectedErr: nil, - useAllCoins: true, - }, - { - name: "happy path - no use all coins", - poolParams: types.PoolParams{PoolType: types.PoolType_BALANCER, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1_000), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1_000), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1_000), - sdk.NewInt64Coin(denoms.USDC, 1_000), - ), - expectedErr: nil, - useAllCoins: false, - }, - { - name: "happy path - stableswap - no use all coins", - poolParams: types.PoolParams{PoolType: types.PoolType_STABLESWAP, A: sdk.OneInt()}, - poolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin(denoms.NUSD, 1_000), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin(denoms.USDC, 1_000), - Weight: sdk.OneInt(), - }, - }, - senderInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1e9), - sdk.NewInt64Coin(denoms.NUSD, 1_000), - sdk.NewInt64Coin(denoms.USDC, 1_000), - ), - expectedErr: nil, - useAllCoins: false, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - msgServer := keeper.NewMsgServerImpl(app.SpotKeeper) - - if tc.creatorAddr == nil { - tc.creatorAddr = ed25519.GenPrivKey().PubKey().Address().Bytes() - } - if tc.senderInitialFunds != nil { - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, tc.creatorAddr, tc.senderInitialFunds)) - } - - msgCreatePool := types.MsgCreatePool{ - Creator: tc.creatorAddr.String(), - PoolParams: &tc.poolParams, - PoolAssets: tc.poolAssets, - } - - _, err := msgServer.CreatePool(sdk.WrapSDKContext(ctx), &msgCreatePool) - require.NoError(t, err) - - poolShares := app.BankKeeper.GetBalance(ctx, tc.creatorAddr, "nibiru/pool/1") - msgExitPool := types.MsgExitPool{ - Sender: tc.creatorAddr.String(), - PoolId: 1, - PoolShares: poolShares, - } - _, err = msgServer.ExitPool(sdk.WrapSDKContext(ctx), &msgExitPool) - require.NoError(t, err) - - require.Equal( - t, - tc.senderInitialFunds.Sub(sdk.NewInt64Coin(denoms.NIBI, 1e9)), - app.BankKeeper.GetAllBalances(ctx, tc.creatorAddr), - ) - - msgJoinPool := types.MsgJoinPool{ - Sender: tc.creatorAddr.String(), - PoolId: 1, - TokensIn: tc.senderInitialFunds.Sub(sdk.NewInt64Coin(denoms.NIBI, 1e9)), - UseAllCoins: tc.useAllCoins, - } - _, err = msgServer.JoinPool(sdk.WrapSDKContext(ctx), &msgJoinPool) - require.NoError(t, err) - - require.Equal( - t, - sdk.NewCoins(poolShares), - app.BankKeeper.GetAllBalances(ctx, tc.creatorAddr), - ) - }) - } -} - -func TestMsgServerJoinPool(t *testing.T) { - const shareDenom = "nibiru/pool/1" - tests := []struct { - name string - joinerInitialFunds sdk.Coins - initialPool types.Pool - tokensIn sdk.Coins - expectedNumSharesOut sdk.Coin - expectedRemCoins sdk.Coins - expectedJoinerFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "join with all assets", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 100), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins(sdk.NewInt64Coin(shareDenom, 100)), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 200), - sdk.NewInt64Coin(denoms.NUSD, 200), - ), - /*shares=*/ 200), - }, - { - name: "join with some assets, none remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 150), - sdk.NewInt64Coin(denoms.NUSD, 150), - ), - /*shares=*/ 150), - }, - { - name: "join with some assets, some remaining", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 75), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 25), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 150), - sdk.NewInt64Coin(denoms.NUSD, 150), - ), - /*shares=*/ 150), - }, - { - name: "join with all assets - Stablepool", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 100), - expectedRemCoins: sdk.NewCoins(), - expectedJoinerFinalFunds: sdk.NewCoins(sdk.NewInt64Coin(shareDenom, 100)), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 200), - sdk.NewInt64Coin(denoms.NUSD, 200), - ), - /*shares=*/ 200), - }, - { - name: "join with some assets, none remaining - Stablepool", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 50), - expectedRemCoins: []sdk.Coin{}, - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 50), - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 150), - sdk.NewInt64Coin(denoms.NUSD, 150), - ), - /*shares=*/ 150), - }, - { - name: "join with some assets, some remaining - Stablepool", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100), - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 75), - ), - expectedNumSharesOut: sdk.NewInt64Coin(shareDenom, 62), - expectedRemCoins: []sdk.Coin{}, - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(shareDenom, 62), - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 25), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 150), - sdk.NewInt64Coin(denoms.NUSD, 175), - ), - /*shares=*/ 162), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - joinerAddr := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, joinerAddr, tc.joinerInitialFunds)) - - msgServer := keeper.NewMsgServerImpl(app.SpotKeeper) - resp, err := msgServer.JoinPool( - sdk.WrapSDKContext(ctx), - types.NewMsgJoinPool(joinerAddr.String(), tc.initialPool.Id, tc.tokensIn, false), - ) - - require.NoError(t, err) - require.Equal(t, types.MsgJoinPoolResponse{ - Pool: &tc.expectedFinalPool, - NumPoolSharesOut: tc.expectedNumSharesOut, - RemainingCoins: tc.expectedRemCoins, - }, *resp) - require.Equal(t, tc.expectedJoinerFinalFunds, app.BankKeeper.GetAllBalances(ctx, joinerAddr)) - }) - } -} - -func TestMsgServerExitPool(t *testing.T) { - const shareDenom = "nibiru/pool/1" - tests := []struct { - name string - joinerInitialFunds sdk.Coins - poolFundsToAdd sdk.Coins - initialPool types.Pool - poolSharesIn sdk.Coin - expectedTokensOut sdk.Coins - expectedJoinerFinalFunds sdk.Coins - expectedFinalPool types.Pool - expectedFees sdk.Coins - }{ - { - name: "exit all pool shares", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - poolFundsToAdd: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 100), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 99), - sdk.NewInt64Coin(denoms.NUSD, 99), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 199), - sdk.NewInt64Coin(denoms.NUSD, 199), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - sdk.NewInt64Coin(denoms.NUSD, 1), - ), - /*shares=*/ 0, - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - sdk.NewInt64Coin(denoms.NUSD, 1), - ), - }, - { - name: "exit half pool shares", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - poolFundsToAdd: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 50), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 49), - sdk.NewInt64Coin(denoms.NUSD, 49), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 149), - sdk.NewInt64Coin(denoms.NUSD, 149), - sdk.NewInt64Coin(shareDenom, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 51), - sdk.NewInt64Coin(denoms.NUSD, 51), - ), - /*shares=*/ 50, - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - sdk.NewInt64Coin(denoms.NUSD, 1), - ), - }, - { - name: "exit all pool shares - StablePool", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - poolFundsToAdd: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 100), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 200), - sdk.NewInt64Coin(denoms.NUSD, 200), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - sdk.NewInt64Coin(denoms.NUSD, 1), - ), - /*shares=*/ 0, - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 0), - sdk.NewInt64Coin(denoms.NUSD, 0), - ), - }, - { - name: "exit half pool shares - StablePool", - joinerInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - sdk.NewInt64Coin(shareDenom, 100), - ), - poolFundsToAdd: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - poolSharesIn: sdk.NewInt64Coin(shareDenom, 50), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedJoinerFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 150), - sdk.NewInt64Coin(denoms.NUSD, 150), - sdk.NewInt64Coin(shareDenom, 50), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 50), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - /*shares=*/ 50, - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 0), - sdk.NewInt64Coin(denoms.NUSD, 0), - ), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount( - app.BankKeeper, ctx, sender, tc.joinerInitialFunds)) - require.NoError(t, testapp.FundAccount( - app.BankKeeper, ctx, tc.initialPool.GetAddress(), tc.poolFundsToAdd)) - - msgServer := keeper.NewMsgServerImpl(app.SpotKeeper) - resp, err := msgServer.ExitPool( - sdk.WrapSDKContext(ctx), - types.NewMsgExitPool(sender.String(), tc.initialPool.Id, tc.poolSharesIn), - ) - require.NoError(t, err) - require.Equal(t, - types.MsgExitPoolResponse{ - TokensOut: tc.expectedTokensOut, - }, - *resp, - ) - require.Equal(t, - tc.expectedJoinerFinalFunds, - app.BankKeeper.GetAllBalances(ctx, sender), - ) - }) - } -} - -func TestMsgServerSwapAssets(t *testing.T) { - tests := []struct { - name string - - // test setup - userInitialFunds sdk.Coins - initialPool types.Pool - tokenIn sdk.Coin - tokenOutDenom string - - // expected results - expectedError error - expectedTokenOut sdk.Coin - expectedUserFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "regular swap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NUSD, - expectedTokenOut: sdk.NewInt64Coin(denoms.NUSD, 50), - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 200), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - /*shares=*/ 100, - ), - expectedError: nil, - }, - { - name: "not enough user funds", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: sdkerrors.ErrInsufficientFunds, - }, - { - name: "invalid token in denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("foo", 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "invalid token out denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: "foo", - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "same token in and token out denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NIBI, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrSameTokenDenom, - }, - { - name: "regular swap - StableSwap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NUSD, - expectedTokenOut: sdk.NewInt64Coin(denoms.NUSD, 95), - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 95), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 200), - sdk.NewInt64Coin(denoms.NUSD, 5), - ), - /*shares=*/ 100, - ), - expectedError: nil, - }, - { - name: "not enough user funds - StableSwap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 1), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: sdkerrors.ErrInsufficientFunds, - }, - { - name: "invalid token in denom - StableSwap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("foo", 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "invalid token out denom - StableSwap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: "foo", - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "same token in and token out denom - StableSwap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.NIBI, 100), - tokenOutDenom: denoms.NIBI, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.NIBI, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrSameTokenDenom, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - msgServer := keeper.NewMsgServerImpl(app.SpotKeeper) - - // fund pool account - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - require.NoError(t, - testapp.FundAccount( - app.BankKeeper, - ctx, - poolAddr, - tc.initialPool.PoolBalances(), - ), - ) - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - // fund user account - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, sender, tc.userInitialFunds)) - - // swap assets - resp, err := msgServer.SwapAssets( - sdk.WrapSDKContext(ctx), - types.NewMsgSwapAssets(sender.String(), tc.initialPool.Id, tc.tokenIn, tc.tokenOutDenom), - ) - - if tc.expectedError != nil { - require.ErrorIs(t, err, tc.expectedError) - } else { - require.NoError(t, err) - require.Equal(t, - types.MsgSwapAssetsResponse{ - TokenOut: tc.expectedTokenOut, - }, - *resp, - ) - } - - // check user's final funds - require.Equal(t, - tc.expectedUserFinalFunds, - app.BankKeeper.GetAllBalances(ctx, sender), - ) - - // check final pool state - finalPool, err := app.SpotKeeper.FetchPool(ctx, tc.initialPool.Id) - require.NoError(t, err) - require.Equal(t, tc.expectedFinalPool, finalPool) - }) - } -} diff --git a/x/spot/keeper/params.go b/x/spot/keeper/params.go deleted file mode 100644 index f59a429ee..000000000 --- a/x/spot/keeper/params.go +++ /dev/null @@ -1,18 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// GetParams get all parameters as types.Params -func (k Keeper) GetParams(ctx sdk.Context) (p types.Params) { - k.paramstore.GetParamSet(ctx, &p) - return p -} - -// SetParams set the params -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/spot/keeper/params_test.go b/x/spot/keeper/params_test.go deleted file mode 100644 index 5791cf2fe..000000000 --- a/x/spot/keeper/params_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package keeper_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestGetParams(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - params := types.DefaultParams() - app.SpotKeeper.SetParams(ctx, params) - - require.EqualValues(t, params, app.SpotKeeper.GetParams(ctx)) -} diff --git a/x/spot/keeper/swap.go b/x/spot/keeper/swap.go deleted file mode 100644 index 305afef73..000000000 --- a/x/spot/keeper/swap.go +++ /dev/null @@ -1,121 +0,0 @@ -package keeper - -import ( - "errors" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func (k Keeper) updatePoolForSwap( - ctx sdk.Context, - pool types.Pool, - sender sdk.AccAddress, - tokenIn sdk.Coin, - tokenOut sdk.Coin, -) (err error) { - if err = k.bankKeeper.SendCoins( - ctx, - /*from=*/ sender, - /*to=*/ pool.GetAddress(), - /*coins=*/ sdk.Coins{tokenIn}, - ); err != nil { - return err - } - - if err = k.bankKeeper.SendCoins( - ctx, - /*from=*/ pool.GetAddress(), - /*to=*/ sender, - /*coins=*/ sdk.Coins{tokenOut}, - ); err != nil { - return err - } - - if err = pool.ApplySwap(tokenIn, tokenOut); err != nil { - return err - } - k.SetPool(ctx, pool) - - if err = k.RecordTotalLiquidityIncrease(ctx, sdk.Coins{tokenIn}); err != nil { - return err - } - if err = k.RecordTotalLiquidityDecrease(ctx, sdk.Coins{tokenOut}); err != nil { - return err - } - - return err -} - -/* -SwapExactAmountIn Given a poolId and the amount of tokens to swap in, returns the number of tokens out -received, specified by the tokenOutDenom. - -For example, if pool 1 has 100foo and 100bar, this function can be called with -tokenIn=10foo and tokenOutDenom=bar. - -args: - - ctx: the cosmos-sdk context - - sender: the address wishing to perform the swap - - poolId: the pool id number - - tokenIn: the amount of tokens to given to the pool - - tokenOutDenom: the denom of the token taken out of the pool - -ret: - - tokenOut: the amount of tokens taken out of the pool - - err: error if any -*/ -func (k Keeper) SwapExactAmountIn( - ctx sdk.Context, - sender sdk.AccAddress, - poolId uint64, - tokenIn sdk.Coin, - tokenOutDenom string, -) (tokenOut sdk.Coin, err error) { - if tokenIn.Denom == tokenOutDenom { - return sdk.Coin{}, types.ErrSameTokenDenom - } - - pool, err := k.FetchPool(ctx, poolId) - if err != nil { - return sdk.Coin{}, err - } - - // calculate tokenOut and validate - tokenOut, fee, err := pool.CalcOutAmtGivenIn(tokenIn, tokenOutDenom, false) - if err != nil { - return sdk.Coin{}, err - } - if tokenOut.Amount.LTE(sdk.ZeroInt()) { - return sdk.Coin{}, errors.New("tokenOut amount must be greater than zero") - } - - // check sender has enough tokenIn - if err = k.CheckEnoughBalances(ctx, sdk.Coins{tokenIn}, sender); err != nil { - return sdk.Coin{}, err - } - - // check pool has enough tokenOut - if err = k.CheckEnoughBalances(ctx, sdk.Coins{tokenOut}, pool.GetAddress()); err != nil { - return sdk.Coin{}, err - } - - err = k.updatePoolForSwap(ctx, pool, sender, tokenIn, tokenOut) - if err != nil { - return sdk.Coin{}, err - } - - err = ctx.EventManager().EmitTypedEvent(&types.EventAssetsSwapped{ - Address: sender.String(), - TokenIn: tokenIn, - TokenOut: tokenOut, - Fee: fee, - FinalPool: pool, - }) - if err != nil { - return tokenOut, err - } - - return tokenOut, nil -} diff --git a/x/spot/keeper/swap_test.go b/x/spot/keeper/swap_test.go deleted file mode 100644 index 04476fcd1..000000000 --- a/x/spot/keeper/swap_test.go +++ /dev/null @@ -1,399 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/mock" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestSwapExactAmountIn(t *testing.T) { - tests := []struct { - name string - - // test setup - userInitialFunds sdk.Coins - initialPool types.Pool - tokenIn sdk.Coin - tokenOutDenom string - - // expected results - expectedError error - expectedTokenOut sdk.Coin - expectedUserFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "testnet 2 BUG, should not panic", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 236534500), - sdk.NewInt64Coin("unusd", 1700000000), - sdk.NewInt64Coin("uusdt", 701785070), - ), - initialPool: types.Pool{ - Id: 1, - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.01"), - ExitFee: sdk.MustNewDecFromStr("0.01"), - PoolType: types.PoolType_STABLESWAP, - A: sdk.NewInt(10), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("unusd", 1_510_778_598), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("uusdt", 7_712_056), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - tokenIn: sdk.NewInt64Coin("unusd", 1_500_000_000), - tokenOutDenom: "uusdt", - expectedTokenOut: sdk.NewInt64Coin("uusdt", 6_670_336), - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 236_534_500), - sdk.NewInt64Coin("unusd", 200_000_000), - sdk.NewInt64Coin("uusdt", 708_455_406), - ), - expectedFinalPool: types.Pool{ - Id: 1, - PoolParams: types.PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.01"), - ExitFee: sdk.MustNewDecFromStr("0.01"), - PoolType: types.PoolType_STABLESWAP, - A: sdk.NewInt(10), - }, - PoolAssets: []types.PoolAsset{ - { - Token: sdk.NewInt64Coin("unusd", 3_010_778_598), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("uusdt", 1_041_720), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - expectedError: nil, - }, - { - name: "regular stableswap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 10), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin(denoms.USDC, 10), - tokenOutDenom: denoms.NUSD, - expectedTokenOut: sdk.NewInt64Coin(denoms.NUSD, 10), - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 10), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 110), - sdk.NewInt64Coin(denoms.NUSD, 90), - ), - /*shares=*/ 100, - ), - expectedError: nil, - }, - { - name: "regular swap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("unibi", 100), - tokenOutDenom: denoms.NUSD, - expectedTokenOut: sdk.NewInt64Coin(denoms.NUSD, 50), - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 200), - sdk.NewInt64Coin(denoms.NUSD, 50), - ), - /*shares=*/ 100, - ), - expectedError: nil, - }, - { - name: "not enough user funds", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 1), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("unibi", 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 1), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: sdkerrors.ErrInsufficientFunds, - }, - { - name: "invalid token in denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("foo", 100), - tokenOutDenom: denoms.NUSD, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("foo", 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "invalid token out denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("unibi", 100), - tokenOutDenom: "foo", - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrTokenDenomNotFound, - }, - { - name: "same token in and token out denom", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - initialPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - tokenIn: sdk.NewInt64Coin("unibi", 100), - tokenOutDenom: "unibi", - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - ), - expectedFinalPool: mock.SpotPool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin("unibi", 100), - sdk.NewInt64Coin(denoms.NUSD, 100), - ), - /*shares=*/ 100, - ), - expectedError: types.ErrSameTokenDenom, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // fund pool account - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - require.NoError(t, - testapp.FundAccount( - app.BankKeeper, - ctx, - poolAddr, - tc.initialPool.PoolBalances(), - ), - ) - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - // fund user account - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, sender, tc.userInitialFunds)) - - // swap assets - tokenOut, err := app.SpotKeeper.SwapExactAmountIn(ctx, sender, tc.initialPool.Id, tc.tokenIn, tc.tokenOutDenom) - - if tc.expectedError != nil { - require.ErrorIs(t, err, tc.expectedError) - } else { - require.NoError(t, err) - require.Equal(t, tc.expectedTokenOut, tokenOut) - } - - // check user's final funds - require.Equal(t, - tc.expectedUserFinalFunds, - app.BankKeeper.GetAllBalances(ctx, sender), - ) - - // check final pool state - finalPool, err := app.SpotKeeper.FetchPool(ctx, tc.initialPool.Id) - require.NoError(t, err) - require.Equal(t, tc.expectedFinalPool, finalPool) - }) - } -} - -func TestDoubleSwapExactAmountIn(t *testing.T) { - tests := []struct { - name string - - // test setup - userInitialFunds sdk.Coins - initialPool types.Pool - tokenIns []sdk.Coin - tokenOutDenoms []string - - // expected results - expectedTokenOuts []sdk.Coin - expectedUserFinalFunds sdk.Coins - expectedFinalPool types.Pool - }{ - { - name: "double stableswap", - userInitialFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 10_000), - ), - initialPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 100_000_000), - sdk.NewInt64Coin(denoms.NUSD, 100_000_000), - ), - /*shares=*/ 100, - ), - tokenIns: []sdk.Coin{sdk.NewInt64Coin(denoms.USDC, 10_000), sdk.NewInt64Coin(denoms.NUSD, 10_000)}, - tokenOutDenoms: []string{denoms.NUSD, denoms.USDC}, - expectedTokenOuts: []sdk.Coin{sdk.NewInt64Coin(denoms.NUSD, 10_000), sdk.NewInt64Coin(denoms.USDC, 10_001)}, - expectedUserFinalFunds: sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 10_001), - ), - expectedFinalPool: mock.SpotStablePool( - /*poolId=*/ 1, - /*assets=*/ sdk.NewCoins( - sdk.NewInt64Coin(denoms.USDC, 99_999_999), - sdk.NewInt64Coin(denoms.NUSD, 100_000_000), - ), - /*shares=*/ 100, - ), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - - // fund pool account - poolAddr := testutil.AccAddress() - tc.initialPool.Address = poolAddr.String() - tc.expectedFinalPool.Address = poolAddr.String() - require.NoError(t, - testapp.FundAccount( - app.BankKeeper, - ctx, - poolAddr, - tc.initialPool.PoolBalances(), - ), - ) - app.SpotKeeper.SetPool(ctx, tc.initialPool) - - // fund user account - sender := testutil.AccAddress() - require.NoError(t, testapp.FundAccount(app.BankKeeper, ctx, sender, tc.userInitialFunds)) - - // swap assets - for i, tokenIn := range tc.tokenIns { - tokenOut, err := app.SpotKeeper.SwapExactAmountIn(ctx, sender, tc.initialPool.Id, tokenIn, tc.tokenOutDenoms[i]) - require.NoError(t, err) - - require.Equal(t, tc.expectedTokenOuts[i], tokenOut) - } - - // check user's final funds - require.Equal(t, - tc.expectedUserFinalFunds, - app.BankKeeper.GetAllBalances(ctx, sender), - ) - - // check final pool state - finalPool, err := app.SpotKeeper.FetchPool(ctx, tc.initialPool.Id) - require.NoError(t, err) - require.Equal(t, tc.expectedFinalPool, finalPool) - }) - } -} diff --git a/x/spot/math/constant_function.go b/x/spot/math/constant_function.go deleted file mode 100644 index f4393aa7d..000000000 --- a/x/spot/math/constant_function.go +++ /dev/null @@ -1,40 +0,0 @@ -package math - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// solveConstantFunctionInvariant solves the constant function of an AMM -// that determines the relationship between the differences of two sides -// of assets inside the pool. -// For fixed xPrior, xAfter, xWeight, yPrior, yWeight, -// we could deduce the deltaY, calculated by: -// deltaY = balanceY * (1 - (xPrior/xAfter)^(xWeight/yWeight)) -// deltaY is positive when y's balance liquidity decreases. -// deltaY is negative when y's balance liquidity increases. -// panics if yWeight is 0. -// -// TODO(https://github.com/NibiruChain/nibiru/issues/141): Currently always calculates the invariant assuming constant weight (xy=k). -// Once we figure out the floating point arithmetic conversions for exponentiation, we can -// add unequal weights. -func SolveConstantProductInvariant( - xPrior, - xAfter, - /*unused*/ _xWeight, - yPrior, - /*unused*/ _yWeight sdk.Dec, -) (deltaY sdk.Dec) { - // // weightRatio = (xWeight/yWeight) - // weightRatio := xWeight.Quo(yWeight) - - // r = xPrior/xAfter - r := xPrior.Quo(xAfter) - - // TODO(https://github.com/NibiruChain/nibiru/issues/141): Figure out floating point arithmetic for exponentation. - // Naive calculation could lead to significant rounding errors with large numbers - // amountY = yPrior * (1 - (r ^ weightRatio)) - // rToWeightRatio := sdk.MustNewDecFromStr( - // fmt.Sprintf("%f", math.Pow(r.MustFloat64(), weightRatio.MustFloat64())), - // ) - return yPrior.Mul(sdk.OneDec().Sub(r)) -} diff --git a/x/spot/math/constant_function_test.go b/x/spot/math/constant_function_test.go deleted file mode 100644 index 914443bbb..000000000 --- a/x/spot/math/constant_function_test.go +++ /dev/null @@ -1,59 +0,0 @@ -package math - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestSolveConstantProductInvariantHappyPath(t *testing.T) { - for _, tc := range []struct { - name string - xPrior sdk.Dec - xAfter sdk.Dec - xWeight sdk.Dec - yPrior sdk.Dec - yWeight sdk.Dec - expectedDeltaY sdk.Dec - }{ - { - // 100*(1-(100/200)^(.50/.50)) - name: "simple numbers", - xPrior: sdk.NewDec(100), - xAfter: sdk.NewDec(200), - xWeight: sdk.NewDecWithPrec(5, 1), - yPrior: sdk.NewDec(100), - yWeight: sdk.NewDecWithPrec(5, 1), - expectedDeltaY: sdk.NewDec(50), - }, - { - // 33*(1-(33/50)^(.50/.50)) - name: "difficult numbers", - xPrior: sdk.NewDec(33), - xAfter: sdk.NewDec(50), - xWeight: sdk.NewDecWithPrec(5, 1), - yPrior: sdk.NewDec(33), - yWeight: sdk.NewDecWithPrec(5, 1), - expectedDeltaY: sdk.NewDecWithPrec(1122, 2), - }, - // TODO(https://github.com/NibiruChain/nibiru/issues/141): allow for uneven weights - // { - // // 44*(1-(86/35)^(.75/.25)) - // name: "difficult numbers - uneven weights", - // xPrior: sdk.NewDec(86), - // xAfter: sdk.NewDec(35), - // xWeight: sdk.NewDecWithPrec(75, 2), - // yPrior: sdk.NewDec(44), - // yWeight: sdk.NewDecWithPrec(25, 2), - // expectedDeltaY: sdk.NewDecWithPrec(-60874551603, 8), - // }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - deltaY := SolveConstantProductInvariant( - tc.xPrior, tc.xAfter, tc.xWeight, tc.yPrior, tc.yWeight) - require.InDelta(t, tc.expectedDeltaY.MustFloat64(), deltaY.MustFloat64(), 0.0001) - }) - } -} diff --git a/x/spot/module.go b/x/spot/module.go deleted file mode 100644 index c0fc8a40f..000000000 --- a/x/spot/module.go +++ /dev/null @@ -1,157 +0,0 @@ -package spot - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - - abci "github.com/cometbft/cometbft/abci/types" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - - "github.com/NibiruChain/nibiru/x/spot/client/cli" - "github.com/NibiruChain/nibiru/x/spot/keeper" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} -) - -// ---------------------------------------------------------------------------- -// AppModuleBasic -// ---------------------------------------------------------------------------- - -// AppModuleBasic implements the AppModuleBasic interface for the capability module. -type AppModuleBasic struct { - cdc codec.BinaryCodec -} - -func NewAppModuleBasic(cdc codec.BinaryCodec) AppModuleBasic { - return AppModuleBasic{cdc: cdc} -} - -// Name returns the capability module's name. -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - types.RegisterLegacyAminoCodec(cdc) -} - -// RegisterInterfaces registers the module's interface types -func (a AppModuleBasic) RegisterInterfaces(reg cdctypes.InterfaceRegistry) { - types.RegisterInterfaces(reg) -} - -// DefaultGenesis returns the capability module's default genesis state. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesis()) -} - -// ValidateGenesis performs genesis state validation for the capability module. -func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { - var genState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - return genState.Validate() -} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the module. -func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *runtime.ServeMux) { - if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the capability module's root tx command. -func (a AppModuleBasic) GetTxCmd() *cobra.Command { - return cli.GetTxCmd() -} - -// GetQueryCmd returns the capability module's root query command. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() -} - -// ---------------------------------------------------------------------------- -// AppModule -// ---------------------------------------------------------------------------- - -// AppModule implements the AppModule interface for the module. -type AppModule struct { - AppModuleBasic - - keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper -} - -func NewAppModule( - cdc codec.Codec, - keeper keeper.Keeper, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, -) AppModule { - return AppModule{ - AppModuleBasic: NewAppModuleBasic(cdc), - keeper: keeper, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - } -} - -// Name returns the capability module's name. -func (am AppModule) Name() string { - return am.AppModuleBasic.Name() -} - -// RegisterServices registers a GRPC query service to respond to the -// module-specific GRPC queries. -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterQueryServer(cfg.QueryServer(), keeper.NewQuerier(am.keeper)) - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) -} - -// RegisterInvariants registers the capability module's invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - -// InitGenesis performs the capability module's genesis initialization It returns -// no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, gs json.RawMessage) []abci.ValidatorUpdate { - var genState types.GenesisState - // Initialize global index to index in genesis state - cdc.MustUnmarshalJSON(gs, &genState) - - InitGenesis(ctx, am.keeper, genState) - - return []abci.ValidatorUpdate{} -} - -// ExportGenesis returns the capability module's exported genesis state as raw JSON bytes. -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - genState := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(genState) -} - -// ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 2 } - -// BeginBlock executes all ABCI BeginBlock logic respective to the capability module. -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} - -// EndBlock executes all ABCI EndBlock logic respective to the capability module. It -// returns no validator updates. -func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} diff --git a/x/spot/module_simulation.go b/x/spot/module_simulation.go deleted file mode 100644 index 0b3e6dfd2..000000000 --- a/x/spot/module_simulation.go +++ /dev/null @@ -1,33 +0,0 @@ -package spot - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - - "github.com/NibiruChain/nibiru/x/spot/simulation" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -// GenerateGenesisState creates a default GenState of the module -func (AppModule) GenerateGenesisState(simState *module.SimulationState) { - accs := make([]string, len(simState.Accounts)) - for i, acc := range simState.Accounts { - accs[i] = acc.Address.String() - } - dexGenesis := types.DefaultGenesis() - simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(dexGenesis) -} - -// ProposalContents doesn't return any content functions for governance proposals -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { - return nil -} - -// RegisterStoreDecoder registers a decoder -func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) {} - -// WeightedOperations returns the all the spot module operations with their respective weights. -func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { - return simulation.WeightedOperations(am.accountKeeper, am.bankKeeper, am.keeper) -} diff --git a/x/spot/simulation/operations.go b/x/spot/simulation/operations.go deleted file mode 100644 index bf3d71f9e..000000000 --- a/x/spot/simulation/operations.go +++ /dev/null @@ -1,441 +0,0 @@ -package simulation - -import ( - "fmt" - "math/rand" - "strings" - "time" - - "github.com/cosmos/cosmos-sdk/types/module/testutil" - - sdkmath "cosmossdk.io/math" - - "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" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/spot/keeper" - "github.com/NibiruChain/nibiru/x/spot/types" -) - -const defaultWeight = 100 - -// WeightedOperations returns all the operations from the module with their respective weights -func WeightedOperations( - ak types.AccountKeeper, - bk types.BankKeeper, - k keeper.Keeper, -) simulation.WeightedOperations { - return simulation.WeightedOperations{ - simulation.NewWeightedOperation( - defaultWeight, - SimulateMsgCreatePool(ak, bk, k), - ), - simulation.NewWeightedOperation( - defaultWeight, - SimulateMsgSwap(ak, bk, k), - ), - simulation.NewWeightedOperation( - defaultWeight, - SimulateJoinPool(ak, bk, k), - ), - simulation.NewWeightedOperation( - defaultWeight, - SimulateExitPool(ak, bk, k), - ), - } -} - -// SimulateMsgCreatePool generates a MsgCreatePool with random values. -func SimulateMsgCreatePool(ak types.AccountKeeper, bk types.BankKeeper, 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) { - simAccount, _ := simtypes.RandomAcc(r, accs) - params := k.GetParams(ctx) - - fundAccountWithTokens(ctx, simAccount.Address, bk) - spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) - - whitelistedAssets := params.GetWhitelistedAssetsAsMap() - - poolAssets := genPoolAssets(r, spendableCoins, whitelistedAssets) - poolParams := genBalancerPoolParams(r, ctx.BlockTime(), poolAssets) - - // set the pool params to set the pool creation fee to dust amount of denom - params.PoolCreationFee = sdk.Coins{sdk.NewInt64Coin(spendableCoins[0].Denom, 1)} - k.SetParams(ctx, params) - - msg := &types.MsgCreatePool{ - Creator: simAccount.Address.String(), - PoolParams: &poolParams, - PoolAssets: poolAssets, - } - _, err := k.FetchPoolFromPair(ctx, poolAssets[0].Token.Denom, poolAssets[1].Token.Denom) - if err == nil { - // types.ErrPoolWithSameAssetsExists - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "pool already exists for these tokens"), nil, nil - } - - return simulation.GenAndDeliverTxWithRandFees( - simulation.OperationInput{ - R: r, - App: app, - TxGen: testutil.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: PoolAssetsCoins(poolAssets), - }, - ) - } -} - -/* -SimulateMsgSwap generates a MsgSwap with random values -*/ -func SimulateMsgSwap(ak types.AccountKeeper, bk types.BankKeeper, 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) { - msg := &types.MsgSwapAssets{} - - simAccount, _ := simtypes.RandomAcc(r, accs) - fundAccountWithTokens(ctx, simAccount.Address, bk) - spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) - - denomIn, denomOut, poolId, balanceIn := findRandomPoolWithDenom(ctx, r, spendableCoins, k) - - if denomIn == "" { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "No pool existing yet for account tokens"), nil, nil - } - if balanceIn.IsZero() { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "No tokens to swap in"), nil, nil - } - - tokenIn := sdk.NewCoin(denomIn, balanceIn) - msg = &types.MsgSwapAssets{ - Sender: simAccount.Address.String(), - PoolId: poolId, - TokenIn: tokenIn, - TokenOutDenom: denomOut, - } - pool, _ := k.FetchPool(ctx, poolId) - _, _, err := pool.CalcOutAmtGivenIn(tokenIn, denomOut, false) - if err != nil { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "pool imbalanced and not enough swap amount"), nil, nil - } - - return simulation.GenAndDeliverTxWithRandFees( - simulation.OperationInput{ - R: r, - App: app, - TxGen: testutil.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: sdk.NewCoins(tokenIn), - }, - ) - } -} - -/* -SimulateJoinPool generates a MsgJoinPool with random values -This function has a 33% chance of swapping a random fraction of the balance of a random token -*/ -func SimulateJoinPool(ak types.AccountKeeper, bk types.BankKeeper, 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) { - msg := &types.MsgJoinPool{} - // run only 1/3 of the time - if simtypes.RandomDecAmount(r, sdk.OneDec()).GTE(sdk.MustNewDecFromStr("0.33")) { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "No join pool done"), nil, nil - } - - simAccount, _ := simtypes.RandomAcc(r, accs) - fundAccountWithTokens(ctx, simAccount.Address, bk) - spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) - - pool, err, index1, index2 := findRandomPoolWithDenomPair(ctx, r, spendableCoins, k) - if err != nil { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "No pool existing yet for tokens in account"), nil, nil - } - - intensityFactorToken0 := simtypes.RandomDecAmount(r, sdk.MustNewDecFromStr("0.499")).Add(sdk.MustNewDecFromStr("0.5")) - intensityFactorToken1 := simtypes.RandomDecAmount(r, sdk.MustNewDecFromStr("0.499")).Add(sdk.MustNewDecFromStr("0.5")) - - tokensIn := sdk.NewCoins( - sdk.NewCoin( - pool.PoolAssets[0].Token.Denom, - intensityFactorToken0.Mul(sdk.NewDecFromInt(spendableCoins[index1].Amount)).TruncateInt()), - sdk.NewCoin( - pool.PoolAssets[1].Token.Denom, - intensityFactorToken1.Mul(sdk.NewDecFromInt(spendableCoins[index2].Amount)).TruncateInt()), - ) - - msg = &types.MsgJoinPool{ - Sender: simAccount.Address.String(), - PoolId: pool.Id, - TokensIn: tokensIn, - } - - _, err = pool.GetD(pool.PoolAssets) - if err != nil { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "borked pool"), nil, nil - } - - return simulation.GenAndDeliverTxWithRandFees( - simulation.OperationInput{ - R: r, - App: app, - TxGen: testutil.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: tokensIn, - }, - ) - } -} - -/* -SimulateExitPool generates a MsgExitPool with random values -This function has a 33% chance of swapping a random fraction of the balance of a random token -*/ -func SimulateExitPool(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Keeper) simtypes.Operation { - return func( - r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string, - ) (opMsg simtypes.OperationMsg, futureOp []simtypes.FutureOperation, err error) { - simAccount, _ := simtypes.RandomAcc(r, accs) - spendableCoins := bk.SpendableCoins(ctx, simAccount.Address) - - // Search for LP tokens in sim coins - randomIndices := r.Perm(spendableCoins.Len()) - var shareTokens sdk.Coin - - for _, index := range randomIndices { - coin := spendableCoins[index] - if strings.Contains(coin.Denom, "nibiru/pool/") { - shareTokens = coin - break - } - } - msg := &types.MsgExitPool{} - - if shareTokens.Denom == "" { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "No pool share token found in wallet"), nil, nil - } - - intensityFactor := simtypes.RandomDecAmount(r, sdk.MustNewDecFromStr("0.499")).Add(sdk.MustNewDecFromStr("0.5")) - shareTokensIn := sdk.NewCoin( - shareTokens.Denom, - intensityFactor.MulInt(shareTokens.Amount).TruncateInt(), - ) - - // Ugly but does the job - poolId := sdk.MustNewDecFromStr(strings.Replace(shareTokensIn.Denom, "nibiru/pool/", "", 1)).TruncateInt().Uint64() - - // check if there are enough tokens to withdraw - pool, err := k.FetchPool(ctx, poolId) - if err != nil { - return opMsg, futureOp, err - } - tokensOut, _, err := pool.TokensOutFromPoolSharesIn(shareTokensIn.Amount) - if err != nil { - return opMsg, futureOp, err - } - - // this is necessary, as invalid tokens will be considered as wrong inputs in simulations - if !tokensOut.IsValid() { - return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "not enough pool tokens to exit pool"), nil, nil - } - - msg = &types.MsgExitPool{ - Sender: simAccount.Address.String(), - PoolId: poolId, - PoolShares: shareTokensIn, - } - - return simulation.GenAndDeliverTxWithRandFees( - simulation.OperationInput{ - R: r, - App: app, - TxGen: testutil.MakeTestEncodingConfig().TxConfig, - Cdc: nil, - Msg: msg, - MsgType: msg.Type(), - Context: ctx, - SimAccount: simAccount, - AccountKeeper: ak, - Bankkeeper: bk, - ModuleName: types.ModuleName, - CoinsSpentInMsg: sdk.NewCoins(shareTokensIn), - }, - ) - } -} - -// PoolAssetsCoins returns all the coins corresponding to a slice of pool assets. -func PoolAssetsCoins(assets []types.PoolAsset) sdk.Coins { - coins := sdk.Coins{} - for _, asset := range assets { - coins = coins.Add(asset.Token) - } - return sdk.NewCoins(coins...) -} - -// genBalancerPoolParams creates random parameters for the swap and exit fee of the pool -// The pool has 50% chance of being a stableswap pool. -func genBalancerPoolParams(r *rand.Rand, blockTime time.Time, assets []types.PoolAsset) types.PoolParams { - // swapFeeInt := int64(r.Intn(1e5)) - // swapFee := sdk.NewDecWithPrec(swapFeeInt, 6) - - exitFeeInt := int64(r.Intn(1e5)) - exitFee := sdk.NewDecWithPrec(exitFeeInt, 6) - isBalancer := r.Intn(2) - - var poolType types.PoolType - if isBalancer == 0 { - poolType = types.PoolType_BALANCER - } else { - poolType = types.PoolType_STABLESWAP - } - - A := sdk.NewInt(int64(r.Intn(4_000) + 1)) - - // Create swap fee between 0% and 5% - swapFeeFloat := r.Float64() * .05 - swapFee := sdk.MustNewDecFromStr(fmt.Sprintf("%.5f", swapFeeFloat)) - - return types.PoolParams{ - SwapFee: swapFee, - ExitFee: exitFee, - PoolType: poolType, - A: A, - } -} - -// genPoolAssets creates a pool asset object based on current balance of the account -func genPoolAssets( - r *rand.Rand, - coins sdk.Coins, - whitelistedAssets map[string]bool, -) []types.PoolAsset { - denomIndices := r.Perm(coins.Len()) - var assets []types.PoolAsset - - for _, denomIndex := range denomIndices { - denom := coins[denomIndex].Denom - - if _, ok := whitelistedAssets[denom]; ok { - amt, _ := simtypes.RandPositiveInt(r, coins[denomIndex].Amount.QuoRaw(10)) - reserveAmt := sdk.NewCoin(denom, amt) - - // Weight is useless for stableswap pools. - weight := sdk.NewInt(r.Int63n(9) + 1) - assets = append(assets, types.PoolAsset{Token: reserveAmt, Weight: weight}) - - if len(assets) == 2 { - return assets - } - } - } - - panic("amm pool must have 2 assets") -} - -// fundAccountWithTokens fund the account with some gov, coll and stable denom. -// when simulation for stablecoin is done, we should consider only funding with stable. -func fundAccountWithTokens(ctx sdk.Context, address sdk.AccAddress, bk types.BankKeeper) { - million := 1 * common.TO_MICRO - newTokens := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(int64(10*million))), - sdk.NewCoin(denoms.USDC, sdk.NewInt(int64(10*million))), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(int64(10*million))), - ) - - err := bk.MintCoins(ctx, types.ModuleName, newTokens) - if err != nil { - panic(err) - } - err = bk.SendCoinsFromModuleToAccount( - ctx, - types.ModuleName, - address, - newTokens, - ) - if err != nil { - panic(err) - } -} - -// findRandomPoolWithDenom search possible pool available to swap from a set of coins -func findRandomPoolWithDenom(ctx sdk.Context, r *rand.Rand, spendableCoins sdk.Coins, k keeper.Keeper) ( - denomIn string, denomOut string, poolId uint64, balanceIn sdkmath.Int, -) { - randomIndices := r.Perm(spendableCoins.Len()) - whitelistedAssets := k.GetParams(ctx).GetWhitelistedAssetsAsMap() - - pools := k.FetchAllPools(ctx) - for _, index := range randomIndices { - coin := spendableCoins[index] - if _, ok := whitelistedAssets[coin.Denom]; ok { - for _, pool := range pools { - if pool.PoolAssets[0].Token.Denom == coin.Denom { - return coin.Denom, pool.PoolAssets[1].Token.Denom, pool.Id, spendableCoins[index].Amount - } else if pool.PoolAssets[1].Token.Denom == coin.Denom { - return coin.Denom, pool.PoolAssets[0].Token.Denom, pool.Id, spendableCoins[index].Amount - } - } - } - } - - return "", "", 0, sdk.ZeroInt() -} - -// findRandomPoolWithDenomPair search one pool available from a pair of coins of simCoins -func findRandomPoolWithDenomPair(ctx sdk.Context, r *rand.Rand, simCoins sdk.Coins, k keeper.Keeper) ( - pool types.Pool, err error, index1 int, index2 int, -) { - whitelistedAssets := k.GetParams(ctx).GetWhitelistedAssetsAsMap() - randomIndices1 := r.Perm(simCoins.Len()) - randomIndices2 := r.Perm(simCoins.Len()) - - for _, index1 := range randomIndices1 { - coin1 := simCoins[index1] - if _, ok := whitelistedAssets[coin1.Denom]; ok { - for _, index2 := range randomIndices2 { - if index1 != index2 { - coin2 := simCoins[index2] - if _, ok := whitelistedAssets[coin2.Denom]; ok { - pool, err := k.FetchPoolFromPair(ctx, coin1.Denom, coin2.Denom) - if err == nil { - return pool, nil, index1, index2 - } - } - } - } - } - } - return types.Pool{}, types.ErrPoolNotFound.Wrapf("could not find pool compatible with any pair of assets"), 0, 0 -} diff --git a/x/spot/types/codec.go b/x/spot/types/codec.go deleted file mode 100644 index 04d538125..000000000 --- a/x/spot/types/codec.go +++ /dev/null @@ -1,30 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" - cdctypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/msgservice" -) - -func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - cdc.RegisterConcrete(&MsgCreatePool{}, "spot/CreatePool", nil) - cdc.RegisterConcrete(&MsgJoinPool{}, "spot/JoinPool", nil) - cdc.RegisterConcrete(&MsgExitPool{}, "spot/ExitPool", nil) - cdc.RegisterConcrete(&MsgSwapAssets{}, "spot/SwapAssets", nil) -} - -func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { - registry.RegisterImplementations( - /* interface */ (*sdk.Msg)(nil), - /* implementations */ - &MsgCreatePool{}, - &MsgJoinPool{}, - &MsgExitPool{}, - &MsgSwapAssets{}, - ) - - msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) -} - -var ModuleCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry()) diff --git a/x/spot/types/constants.go b/x/spot/types/constants.go deleted file mode 100644 index 6958edd70..000000000 --- a/x/spot/types/constants.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -import ( - sdkmath "cosmossdk.io/math" -) - -const ( - // MinPoolAssets minimum number of assets a pool may have - MinPoolAssets = 2 - // MaxPoolAssets maximum number of assets a pool may have - MaxPoolAssets = 2 - - // DisplayPoolShareExponent the exponent of a pool display share compared to a pool base share (one pool display share = 10^18 pool base shares) - DisplayPoolShareExponent = 18 - - // GuaranteedWeightPrecision Scaling factor for every weight. The pool weight is: - // weight_in_MsgCreateBalancerPool * GuaranteedWeightPrecision - // - // This is done so that smooth weight changes have enough precision to actually be smooth. - GuaranteedWeightPrecision int64 = 1 << 30 -) - -var ( - // OneDisplayPoolShare represents one display pool share - OneDisplayPoolShare = sdkmath.NewIntWithDecimal(1, DisplayPoolShareExponent) - - // InitPoolSharesSupply is the amount of new shares to initialize a pool with. - InitPoolSharesSupply = OneDisplayPoolShare.MulRaw(100) - - // MaxUserSpecifiedWeight Pool creators can specify a weight in [1, MaxUserSpecifiedWeight) - // for every token in the balancer pool. - // - // The weight used in the balancer equation is then creator-specified-weight * GuaranteedWeightPrecision. - // This is done so that LBP's / smooth weight changes can actually happen smoothly, - // without complex precision loss / edge effects. - MaxUserSpecifiedWeight = sdkmath.NewIntFromUint64(1 << 20) -) diff --git a/x/spot/types/errors.go b/x/spot/types/errors.go deleted file mode 100644 index a78559bc9..000000000 --- a/x/spot/types/errors.go +++ /dev/null @@ -1,42 +0,0 @@ -package types - -// DONTCOVER - -import ( - sdkerrors "cosmossdk.io/errors" -) - -// x/spot module sentinel errors -var ( - ErrTooFewPoolAssets = sdkerrors.Register(ModuleName, 1, "pool should have at least 2 assets, as they must be swapping between at least two assets") - ErrTooManyPoolAssets = sdkerrors.Register(ModuleName, 2, "pool has too many assets (currently capped at 2 assets per pool)") - ErrInvalidSwapFee = sdkerrors.Register(ModuleName, 3, "invalid pool swap fee, must be between [0, 1]") - ErrInvalidExitFee = sdkerrors.Register(ModuleName, 4, "invalid pool exit fee, must be between [0, 1]") - ErrInvalidTokenWeight = sdkerrors.Register(ModuleName, 5, "token weight must be greater than zero") - ErrTokenNotAllowed = sdkerrors.Register(ModuleName, 8, "token not allowed") - ErrInvalidPoolType = sdkerrors.Register(ModuleName, 15, "pool_type needs to be either `balancer` or `stableswap`") - ErrAmplificationMissing = sdkerrors.Register(ModuleName, 16, "amplification parameter is missing") - ErrAmplificationTooLow = sdkerrors.Register(ModuleName, 17, "amplification parameter a needs to be greater than 1") - ErrInitialDeposit = sdkerrors.Register(ModuleName, 19, "initial deposit requires all coins deposited") - ErrPoolWithSameAssetsExists = sdkerrors.Register(ModuleName, 20, "a pool with the same denoms already exists") - ErrBorkedPool = sdkerrors.Register(ModuleName, 21, "the pool is borked") - ErrInvariantLowerAfterJoining = sdkerrors.Register(ModuleName, 22, "the invariant was unexpectedly lower after joining") - - // create-pool tx cli errors - ErrMissingPoolFileFlag = sdkerrors.Register(ModuleName, 6, "must pass in a pool json using the --pool-file flag") - ErrInvalidCreatePoolArgs = sdkerrors.Register(ModuleName, 7, "deposit tokens and token weights should have same length and denom order") - ErrAmplificationIntable = sdkerrors.Register(ModuleName, 23, - "amplification string failed to parse as int256") - - // Invalid MsgSwapAsset - ErrInvalidPoolId = sdkerrors.Register(ModuleName, 9, "invalid pool id") - ErrInvalidTokenIn = sdkerrors.Register(ModuleName, 10, "invalid tokens in") - ErrInvalidTokenOutDenom = sdkerrors.Register(ModuleName, 11, "invalid token out denom") - - // Errors when swapping assets - ErrPoolNotFound = sdkerrors.Register(ModuleName, 12, "pool not found") - ErrTokenDenomNotFound = sdkerrors.Register(ModuleName, 13, "token denom not found in pool") - ErrSameTokenDenom = sdkerrors.Register(ModuleName, 14, "cannot use same token denom to swap in and out") - - ErrNotImplemented = sdkerrors.Register(ModuleName, 18, "not implemented") -) diff --git a/x/spot/types/event.pb.go b/x/spot/types/event.pb.go deleted file mode 100644 index 1fff8349b..000000000 --- a/x/spot/types/event.pb.go +++ /dev/null @@ -1,1816 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/event.proto - -package types - -import ( - fmt "fmt" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type EventPoolCreated struct { - // the address of the user who created the pool - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - // the create pool fee - Fees []types.Coin `protobuf:"bytes,2,rep,name=fees,proto3" json:"fees"` - // the final state of the pool - FinalPool Pool `protobuf:"bytes,4,opt,name=final_pool,json=finalPool,proto3" json:"final_pool"` - // the amount of pool shares that the user received - FinalUserPoolShares types.Coin `protobuf:"bytes,5,opt,name=final_user_pool_shares,json=finalUserPoolShares,proto3" json:"final_user_pool_shares"` -} - -func (m *EventPoolCreated) Reset() { *m = EventPoolCreated{} } -func (m *EventPoolCreated) String() string { return proto.CompactTextString(m) } -func (*EventPoolCreated) ProtoMessage() {} -func (*EventPoolCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_23fa99c8c3a21a65, []int{0} -} -func (m *EventPoolCreated) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventPoolCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventPoolCreated.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventPoolCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventPoolCreated.Merge(m, src) -} -func (m *EventPoolCreated) XXX_Size() int { - return m.Size() -} -func (m *EventPoolCreated) XXX_DiscardUnknown() { - xxx_messageInfo_EventPoolCreated.DiscardUnknown(m) -} - -var xxx_messageInfo_EventPoolCreated proto.InternalMessageInfo - -func (m *EventPoolCreated) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *EventPoolCreated) GetFees() []types.Coin { - if m != nil { - return m.Fees - } - return nil -} - -func (m *EventPoolCreated) GetFinalPool() Pool { - if m != nil { - return m.FinalPool - } - return Pool{} -} - -func (m *EventPoolCreated) GetFinalUserPoolShares() types.Coin { - if m != nil { - return m.FinalUserPoolShares - } - return types.Coin{} -} - -type EventPoolJoined struct { - // the address of the user who joined the pool - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // the amount of tokens that the user deposited - TokensIn []types.Coin `protobuf:"bytes,2,rep,name=tokens_in,json=tokensIn,proto3" json:"tokens_in"` - // the amount of pool shares that the user received - PoolSharesOut types.Coin `protobuf:"bytes,3,opt,name=pool_shares_out,json=poolSharesOut,proto3" json:"pool_shares_out"` - // the amount of tokens remaining for the user - RemCoins []types.Coin `protobuf:"bytes,4,rep,name=rem_coins,json=remCoins,proto3" json:"rem_coins"` - // the final state of the pool - FinalPool Pool `protobuf:"bytes,5,opt,name=final_pool,json=finalPool,proto3" json:"final_pool"` - // the final amount of user pool shares - FinalUserPoolShares types.Coin `protobuf:"bytes,6,opt,name=final_user_pool_shares,json=finalUserPoolShares,proto3" json:"final_user_pool_shares"` -} - -func (m *EventPoolJoined) Reset() { *m = EventPoolJoined{} } -func (m *EventPoolJoined) String() string { return proto.CompactTextString(m) } -func (*EventPoolJoined) ProtoMessage() {} -func (*EventPoolJoined) Descriptor() ([]byte, []int) { - return fileDescriptor_23fa99c8c3a21a65, []int{1} -} -func (m *EventPoolJoined) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventPoolJoined) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventPoolJoined.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventPoolJoined) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventPoolJoined.Merge(m, src) -} -func (m *EventPoolJoined) XXX_Size() int { - return m.Size() -} -func (m *EventPoolJoined) XXX_DiscardUnknown() { - xxx_messageInfo_EventPoolJoined.DiscardUnknown(m) -} - -var xxx_messageInfo_EventPoolJoined proto.InternalMessageInfo - -func (m *EventPoolJoined) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *EventPoolJoined) GetTokensIn() []types.Coin { - if m != nil { - return m.TokensIn - } - return nil -} - -func (m *EventPoolJoined) GetPoolSharesOut() types.Coin { - if m != nil { - return m.PoolSharesOut - } - return types.Coin{} -} - -func (m *EventPoolJoined) GetRemCoins() []types.Coin { - if m != nil { - return m.RemCoins - } - return nil -} - -func (m *EventPoolJoined) GetFinalPool() Pool { - if m != nil { - return m.FinalPool - } - return Pool{} -} - -func (m *EventPoolJoined) GetFinalUserPoolShares() types.Coin { - if m != nil { - return m.FinalUserPoolShares - } - return types.Coin{} -} - -type EventPoolExited struct { - // the address of the user who exited the pool - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // the amount of pool shares that the user exited with - PoolSharesIn types.Coin `protobuf:"bytes,2,opt,name=pool_shares_in,json=poolSharesIn,proto3" json:"pool_shares_in"` - // the amount of tokens returned to the user - TokensOut []types.Coin `protobuf:"bytes,3,rep,name=tokens_out,json=tokensOut,proto3" json:"tokens_out"` - // the amount of fees collected by the pool - Fees []types.Coin `protobuf:"bytes,4,rep,name=fees,proto3" json:"fees"` - // the final state of the pool - FinalPool Pool `protobuf:"bytes,5,opt,name=final_pool,json=finalPool,proto3" json:"final_pool"` - // the final amount of user pool shares - FinalUserPoolShares types.Coin `protobuf:"bytes,6,opt,name=final_user_pool_shares,json=finalUserPoolShares,proto3" json:"final_user_pool_shares"` -} - -func (m *EventPoolExited) Reset() { *m = EventPoolExited{} } -func (m *EventPoolExited) String() string { return proto.CompactTextString(m) } -func (*EventPoolExited) ProtoMessage() {} -func (*EventPoolExited) Descriptor() ([]byte, []int) { - return fileDescriptor_23fa99c8c3a21a65, []int{2} -} -func (m *EventPoolExited) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventPoolExited) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventPoolExited.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventPoolExited) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventPoolExited.Merge(m, src) -} -func (m *EventPoolExited) XXX_Size() int { - return m.Size() -} -func (m *EventPoolExited) XXX_DiscardUnknown() { - xxx_messageInfo_EventPoolExited.DiscardUnknown(m) -} - -var xxx_messageInfo_EventPoolExited proto.InternalMessageInfo - -func (m *EventPoolExited) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *EventPoolExited) GetPoolSharesIn() types.Coin { - if m != nil { - return m.PoolSharesIn - } - return types.Coin{} -} - -func (m *EventPoolExited) GetTokensOut() []types.Coin { - if m != nil { - return m.TokensOut - } - return nil -} - -func (m *EventPoolExited) GetFees() []types.Coin { - if m != nil { - return m.Fees - } - return nil -} - -func (m *EventPoolExited) GetFinalPool() Pool { - if m != nil { - return m.FinalPool - } - return Pool{} -} - -func (m *EventPoolExited) GetFinalUserPoolShares() types.Coin { - if m != nil { - return m.FinalUserPoolShares - } - return types.Coin{} -} - -type EventAssetsSwapped struct { - // the address of the user who swapped tokens - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` - // the amount of tokens that the user deposited - TokenIn types.Coin `protobuf:"bytes,2,opt,name=token_in,json=tokenIn,proto3" json:"token_in"` - // the amount of tokens that the user received - TokenOut types.Coin `protobuf:"bytes,3,opt,name=token_out,json=tokenOut,proto3" json:"token_out"` - // the amount of fees collected by the pool - Fee types.Coin `protobuf:"bytes,4,opt,name=fee,proto3" json:"fee"` - // the final state of the pool - FinalPool Pool `protobuf:"bytes,5,opt,name=final_pool,json=finalPool,proto3" json:"final_pool"` -} - -func (m *EventAssetsSwapped) Reset() { *m = EventAssetsSwapped{} } -func (m *EventAssetsSwapped) String() string { return proto.CompactTextString(m) } -func (*EventAssetsSwapped) ProtoMessage() {} -func (*EventAssetsSwapped) Descriptor() ([]byte, []int) { - return fileDescriptor_23fa99c8c3a21a65, []int{3} -} -func (m *EventAssetsSwapped) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventAssetsSwapped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventAssetsSwapped.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EventAssetsSwapped) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventAssetsSwapped.Merge(m, src) -} -func (m *EventAssetsSwapped) XXX_Size() int { - return m.Size() -} -func (m *EventAssetsSwapped) XXX_DiscardUnknown() { - xxx_messageInfo_EventAssetsSwapped.DiscardUnknown(m) -} - -var xxx_messageInfo_EventAssetsSwapped proto.InternalMessageInfo - -func (m *EventAssetsSwapped) GetAddress() string { - if m != nil { - return m.Address - } - return "" -} - -func (m *EventAssetsSwapped) GetTokenIn() types.Coin { - if m != nil { - return m.TokenIn - } - return types.Coin{} -} - -func (m *EventAssetsSwapped) GetTokenOut() types.Coin { - if m != nil { - return m.TokenOut - } - return types.Coin{} -} - -func (m *EventAssetsSwapped) GetFee() types.Coin { - if m != nil { - return m.Fee - } - return types.Coin{} -} - -func (m *EventAssetsSwapped) GetFinalPool() Pool { - if m != nil { - return m.FinalPool - } - return Pool{} -} - -func init() { - proto.RegisterType((*EventPoolCreated)(nil), "nibiru.spot.v1.EventPoolCreated") - proto.RegisterType((*EventPoolJoined)(nil), "nibiru.spot.v1.EventPoolJoined") - proto.RegisterType((*EventPoolExited)(nil), "nibiru.spot.v1.EventPoolExited") - proto.RegisterType((*EventAssetsSwapped)(nil), "nibiru.spot.v1.EventAssetsSwapped") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/event.proto", fileDescriptor_23fa99c8c3a21a65) } - -var fileDescriptor_23fa99c8c3a21a65 = []byte{ - // 514 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0x31, 0x6f, 0xd3, 0x40, - 0x14, 0x8e, 0x13, 0xb7, 0x25, 0x57, 0x68, 0x91, 0xa9, 0x90, 0x9b, 0xc1, 0x44, 0x9d, 0x22, 0x86, - 0xb3, 0xdc, 0x4e, 0x20, 0x84, 0x44, 0x43, 0x84, 0xc2, 0x00, 0xa8, 0x85, 0x85, 0xc5, 0xb2, 0x93, - 0x97, 0xe4, 0x44, 0x72, 0xcf, 0xba, 0x3b, 0x87, 0x32, 0xf2, 0x0f, 0x98, 0xf8, 0x4d, 0x1d, 0x3b, - 0x32, 0x21, 0x94, 0xfc, 0x03, 0x26, 0x46, 0x74, 0x77, 0x4e, 0x08, 0x1d, 0x5a, 0x97, 0x32, 0x74, - 0xbb, 0xf3, 0x7b, 0xdf, 0x7d, 0xef, 0x7d, 0xdf, 0xf3, 0x23, 0x0d, 0xce, 0x52, 0x26, 0xf2, 0x50, - 0x66, 0xa8, 0xc2, 0x69, 0x14, 0xc2, 0x14, 0xb8, 0xa2, 0x99, 0x40, 0x85, 0xde, 0x96, 0x8d, 0x51, - 0x1d, 0xa3, 0xd3, 0xa8, 0xb1, 0x33, 0xc4, 0x21, 0x9a, 0x50, 0xa8, 0x4f, 0x36, 0xab, 0x11, 0xf4, - 0x50, 0x4e, 0x50, 0x86, 0x69, 0x22, 0x21, 0x9c, 0x46, 0x29, 0xa8, 0x24, 0x0a, 0x7b, 0xc8, 0x78, - 0x11, 0xdf, 0x3d, 0xc7, 0x90, 0x21, 0x8e, 0x6d, 0x68, 0xef, 0xa7, 0x43, 0xee, 0x76, 0x34, 0xe1, - 0x1b, 0xc4, 0x71, 0x5b, 0x40, 0xa2, 0xa0, 0xef, 0xf9, 0x64, 0xa3, 0xa7, 0x8f, 0x28, 0x7c, 0xa7, - 0xe9, 0xb4, 0xea, 0x47, 0x8b, 0xab, 0x77, 0x40, 0xdc, 0x01, 0x80, 0xf4, 0xab, 0xcd, 0x5a, 0x6b, - 0x73, 0x7f, 0x97, 0x5a, 0x62, 0xaa, 0x89, 0x69, 0x41, 0x4c, 0xdb, 0xc8, 0xf8, 0xa1, 0x7b, 0xfa, - 0xfd, 0x41, 0xe5, 0xc8, 0x24, 0x7b, 0x8f, 0x08, 0x19, 0x30, 0x9e, 0x8c, 0x63, 0xcd, 0xeb, 0xbb, - 0x4d, 0xa7, 0xb5, 0xb9, 0xbf, 0x43, 0xff, 0xee, 0x8c, 0x6a, 0xfe, 0x02, 0x55, 0x37, 0xd9, 0xfa, - 0x83, 0xf7, 0x96, 0xdc, 0xb7, 0xd0, 0x5c, 0x82, 0x30, 0xf8, 0x58, 0x8e, 0x12, 0x01, 0xd2, 0x5f, - 0x33, 0xcf, 0x5c, 0x5a, 0xc1, 0x3d, 0x03, 0x7f, 0x27, 0x41, 0xe8, 0xf7, 0x8e, 0x0d, 0x76, 0xef, - 0x73, 0x8d, 0x6c, 0x2f, 0x9b, 0x7e, 0x89, 0x8c, 0xdb, 0x9e, 0x93, 0x7e, 0x5f, 0x80, 0x94, 0x8b, - 0x9e, 0x8b, 0xab, 0xf7, 0x84, 0xd4, 0x15, 0x7e, 0x00, 0x2e, 0x63, 0xc6, 0xcb, 0x36, 0x7e, 0xcb, - 0x22, 0xba, 0xdc, 0x7b, 0x41, 0xb6, 0x57, 0xca, 0x8e, 0x31, 0x57, 0x7e, 0xad, 0x5c, 0xe9, 0x77, - 0xb2, 0x65, 0xc5, 0xaf, 0x73, 0xa5, 0xcb, 0x10, 0x30, 0x89, 0xb5, 0xad, 0xd2, 0x77, 0x4b, 0x96, - 0x21, 0x60, 0xa2, 0xaf, 0xe7, 0x3d, 0x58, 0xfb, 0x3f, 0x1e, 0xac, 0x5f, 0xc3, 0x83, 0x5f, 0xd5, - 0x15, 0x0f, 0x3a, 0x27, 0x4c, 0x5d, 0xe8, 0x41, 0x87, 0x6c, 0xad, 0xaa, 0x68, 0x8c, 0x28, 0xc5, - 0x7d, 0xfb, 0x8f, 0x88, 0x5d, 0xee, 0x3d, 0x25, 0xa4, 0xb0, 0xd2, 0xfa, 0x50, 0x4a, 0xc4, 0xc2, - 0x7d, 0xed, 0xc1, 0x62, 0xfc, 0xdd, 0x7f, 0x1f, 0xff, 0x1b, 0x20, 0xfd, 0xd7, 0x2a, 0xf1, 0x8c, - 0xf4, 0xcf, 0xa4, 0x04, 0x25, 0x8f, 0x3f, 0x26, 0x59, 0x76, 0xa1, 0xfa, 0x8f, 0x89, 0x9d, 0xe7, - 0x2b, 0xe8, 0xbe, 0x61, 0x00, 0x5d, 0xbe, 0xfc, 0x7b, 0xae, 0x32, 0xf9, 0x96, 0x4d, 0x0b, 0x1e, - 0x91, 0xda, 0x00, 0xa0, 0xd8, 0x19, 0x97, 0xe2, 0x74, 0xee, 0x35, 0xe4, 0x3e, 0x7c, 0x7e, 0x3a, - 0x0b, 0x9c, 0xb3, 0x59, 0xe0, 0xfc, 0x98, 0x05, 0xce, 0x97, 0x79, 0x50, 0x39, 0x9b, 0x07, 0x95, - 0x6f, 0xf3, 0xa0, 0xf2, 0xfe, 0xe1, 0x90, 0xa9, 0x51, 0x9e, 0xd2, 0x1e, 0x4e, 0xc2, 0x57, 0xe6, - 0xa9, 0xf6, 0x28, 0x61, 0x3c, 0x2c, 0x16, 0xeb, 0x89, 0x5d, 0xad, 0xea, 0x53, 0x06, 0x32, 0x5d, - 0x37, 0x9b, 0xf5, 0xe0, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0xf6, 0x0e, 0x47, 0xd8, 0x05, - 0x00, 0x00, -} - -func (m *EventPoolCreated) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventPoolCreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventPoolCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FinalUserPoolShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.FinalPool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - if len(m.Fees) > 0 { - for iNdEx := len(m.Fees) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Fees[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventPoolJoined) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventPoolJoined) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventPoolJoined) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FinalUserPoolShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size, err := m.FinalPool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if len(m.RemCoins) > 0 { - for iNdEx := len(m.RemCoins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RemCoins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - { - size, err := m.PoolSharesOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.TokensIn) > 0 { - for iNdEx := len(m.TokensIn) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventPoolExited) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventPoolExited) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventPoolExited) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FinalUserPoolShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size, err := m.FinalPool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if len(m.Fees) > 0 { - for iNdEx := len(m.Fees) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Fees[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.TokensOut) > 0 { - for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - { - size, err := m.PoolSharesIn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EventAssetsSwapped) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventAssetsSwapped) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventAssetsSwapped) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.FinalPool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvent(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintEvent(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintEvent(dAtA []byte, offset int, v uint64) int { - offset -= sovEvent(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *EventPoolCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - if len(m.Fees) > 0 { - for _, e := range m.Fees { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - l = m.FinalPool.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FinalUserPoolShares.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *EventPoolJoined) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - if len(m.TokensIn) > 0 { - for _, e := range m.TokensIn { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - l = m.PoolSharesOut.Size() - n += 1 + l + sovEvent(uint64(l)) - if len(m.RemCoins) > 0 { - for _, e := range m.RemCoins { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - l = m.FinalPool.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FinalUserPoolShares.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *EventPoolExited) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - l = m.PoolSharesIn.Size() - n += 1 + l + sovEvent(uint64(l)) - if len(m.TokensOut) > 0 { - for _, e := range m.TokensOut { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - if len(m.Fees) > 0 { - for _, e := range m.Fees { - l = e.Size() - n += 1 + l + sovEvent(uint64(l)) - } - } - l = m.FinalPool.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FinalUserPoolShares.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func (m *EventAssetsSwapped) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Address) - if l > 0 { - n += 1 + l + sovEvent(uint64(l)) - } - l = m.TokenIn.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.TokenOut.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.Fee.Size() - n += 1 + l + sovEvent(uint64(l)) - l = m.FinalPool.Size() - n += 1 + l + sovEvent(uint64(l)) - return n -} - -func sovEvent(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozEvent(x uint64) (n int) { - return sovEvent(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *EventPoolCreated) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventPoolCreated: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventPoolCreated: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fees", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Fees = append(m.Fees, types.Coin{}) - if err := m.Fees[len(m.Fees)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalPool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalUserPoolShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalUserPoolShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventPoolJoined) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventPoolJoined: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventPoolJoined: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensIn = append(m.TokensIn, types.Coin{}) - if err := m.TokensIn[len(m.TokensIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolSharesOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolSharesOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemCoins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RemCoins = append(m.RemCoins, types.Coin{}) - if err := m.RemCoins[len(m.RemCoins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalPool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalUserPoolShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalUserPoolShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventPoolExited) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventPoolExited: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventPoolExited: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolSharesIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolSharesIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensOut = append(m.TokensOut, types.Coin{}) - if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fees", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Fees = append(m.Fees, types.Coin{}) - if err := m.Fees[len(m.Fees)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalPool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalUserPoolShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalUserPoolShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventAssetsSwapped) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EventAssetsSwapped: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventAssetsSwapped: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FinalPool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvent - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvent - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvent - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.FinalPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvent(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvent - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipEvent(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowEvent - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthEvent - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupEvent - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthEvent - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthEvent = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowEvent = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupEvent = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/expected_keepers.go b/x/spot/types/expected_keepers.go deleted file mode 100644 index da254c9b2..000000000 --- a/x/spot/types/expected_keepers.go +++ /dev/null @@ -1,53 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" -) - -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - IterateAccounts(ctx sdk.Context, process func(authtypes.AccountI) (stop bool)) - GetAccount(ctx sdk.Context, addr sdk.AccAddress) authtypes.AccountI - NewAccount(sdk.Context, authtypes.AccountI) authtypes.AccountI - SetAccount(ctx sdk.Context, acc authtypes.AccountI) - GetModuleAddress(name string) sdk.AccAddress - GetModuleAccount(ctx sdk.Context, moduleName string) authtypes.ModuleAccountI - - SetModuleAccount(sdk.Context, authtypes.ModuleAccountI) - // Methods imported from account should be defined here -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - // Methods imported from bank should be defined here - SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error - SendCoinsFromModuleToModule(ctx sdk.Context, senderPool, recipientPool string, amt sdk.Coins) error - SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - - MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error - BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error - - SetDenomMetaData(ctx sdk.Context, denomMetaData banktypes.Metadata) - - // Only needed for simulation interface matching - // TODO: Look into golang syntax to make this "Everything in stakingtypes.bankkeeper + extra funcs" - // I think it has to do with listing another interface as the first line here? - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin - // SetBalances(ctx sdk.Context, addr sdk.AccAddress, balances sdk.Coins) error - LockedCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - GetSupply(ctx sdk.Context, denom string) sdk.Coin - UndelegateCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error - DelegateCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error - IterateAllBalances(ctx sdk.Context, callback func(addr sdk.AccAddress, coin sdk.Coin) (stop bool)) -} - -// DistrKeeper defines the contract needed to be fulfilled for distribution keeper. -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} diff --git a/x/spot/types/genesis.go b/x/spot/types/genesis.go deleted file mode 100644 index 103b72a0c..000000000 --- a/x/spot/types/genesis.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -// DefaultGenesis returns the default Capability genesis state -func DefaultGenesis() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - Pools: []Pool{}, - } -} - -// Validate performs basic genesis state validation returning an error upon any -// failure. -func (gs GenesisState) Validate() error { - return gs.Params.Validate() -} diff --git a/x/spot/types/genesis.pb.go b/x/spot/types/genesis.pb.go deleted file mode 100644 index 0ab2380e2..000000000 --- a/x/spot/types/genesis.pb.go +++ /dev/null @@ -1,387 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/genesis.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the spot module's genesis state. -type GenesisState struct { - // params defines all the parameters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - // pools defines all the pools of the module. - Pools []Pool `protobuf:"bytes,2,rep,name=pools,proto3" json:"pools"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_f2772e1e838a47ec, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetPools() []Pool { - if m != nil { - return m.Pools - } - return nil -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "nibiru.spot.v1.GenesisState") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/genesis.proto", fileDescriptor_f2772e1e838a47ec) } - -var fileDescriptor_f2772e1e838a47ec = []byte{ - // 227 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0xc9, 0xcb, 0x4c, 0xca, - 0x2c, 0x2a, 0xd5, 0x2f, 0x2e, 0xc8, 0x2f, 0xd1, 0x2f, 0x33, 0xd4, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, - 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x83, 0xc8, 0xea, 0x81, 0x64, 0xf5, - 0xca, 0x0c, 0xa5, 0xa4, 0xd1, 0x54, 0x17, 0x24, 0x16, 0x25, 0xe6, 0x42, 0x15, 0x4b, 0x49, 0xa2, - 0x4b, 0xe6, 0xe7, 0xe7, 0x40, 0xa5, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, - 0x22, 0xaa, 0x54, 0xc6, 0xc5, 0xe3, 0x0e, 0xb1, 0x2e, 0xb8, 0x24, 0xb1, 0x24, 0x55, 0xc8, 0x84, - 0x8b, 0x0d, 0x62, 0xa0, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0xb7, 0x91, 0x98, 0x1e, 0xaa, 0xf5, 0x7a, - 0x01, 0x60, 0x59, 0x27, 0x96, 0x13, 0xf7, 0xe4, 0x19, 0x82, 0xa0, 0x6a, 0x85, 0x0c, 0xb8, 0x58, - 0x41, 0x36, 0x15, 0x4b, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x1b, 0x89, 0x60, 0x68, 0xca, 0xcf, 0xcf, - 0x81, 0x6a, 0x81, 0x28, 0x74, 0x72, 0x39, 0xf1, 0x48, 0x8e, 0xf1, 0xc2, 0x23, 0x39, 0xc6, 0x07, - 0x8f, 0xe4, 0x18, 0x27, 0x3c, 0x96, 0x63, 0xb8, 0xf0, 0x58, 0x8e, 0xe1, 0xc6, 0x63, 0x39, 0x86, - 0x28, 0xad, 0xf4, 0xcc, 0x92, 0x8c, 0xd2, 0x24, 0xbd, 0xe4, 0xfc, 0x5c, 0x7d, 0x3f, 0xb0, 0x31, - 0xce, 0x19, 0x89, 0x99, 0x79, 0xfa, 0x50, 0x9f, 0x55, 0x40, 0xfc, 0x56, 0x52, 0x59, 0x90, 0x5a, - 0x9c, 0xc4, 0x06, 0xf6, 0x84, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x16, 0xfb, 0x27, 0x7a, 0x42, - 0x01, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Pools) > 0 { - for iNdEx := len(m.Pools) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Pools[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - if len(m.Pools) > 0 { - for _, e := range m.Pools { - l = e.Size() - n += 1 + l + sovGenesis(uint64(l)) - } - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pools", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pools = append(m.Pools, Pool{}) - if err := m.Pools[len(m.Pools)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/genesis_test.go b/x/spot/types/genesis_test.go deleted file mode 100644 index eae38d740..000000000 --- a/x/spot/types/genesis_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package types_test - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/spot/types" -) - -func TestGenesisState_Validate(t *testing.T) { - for _, tc := range []struct { - desc string - genState *types.GenesisState - valid bool - }{ - { - desc: "default is valid", - genState: types.DefaultGenesis(), - valid: true, - }, - { - desc: "valid genesis state", - genState: &types.GenesisState{}, - valid: true, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - err := tc.genState.Validate() - if tc.valid { - require.NoError(t, err) - } else { - require.Error(t, err) - } - }) - } -} diff --git a/x/spot/types/keys.go b/x/spot/types/keys.go deleted file mode 100644 index da7fcf46b..000000000 --- a/x/spot/types/keys.go +++ /dev/null @@ -1,54 +0,0 @@ -package types - -import ( - "sort" - "strings" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -const ( - // ModuleName defines the module name - ModuleName = "spot" - - // StoreKey defines the primary module store key - StoreKey = ModuleName - - // RouterKey is the message route for slashing - RouterKey = ModuleName - - // QuerierRoute defines the module's query routing key - QuerierRoute = ModuleName - - // MemStoreKey defines the in-memory store key - MemStoreKey = "mem_dex" -) - -func KeyPrefix(p string) []byte { - return []byte(p) -} - -var ( - // KeyNextGlobalPoolNumber defines key to store the next Pool ID to be used - KeyNextGlobalPoolNumber = []byte{0x01} - // KeyPrefixPools defines prefix to store pools - KeyPrefixPools = []byte{0x02} - // KeyTotalLiquidity defines key to store total liquidity - KeyTotalLiquidity = []byte{0x03} - // KeyPrefixPoolIds defines prefix to store pool ids by denoms in the pool - KeyPrefixPoolIds = []byte{0x04} -) - -func GetDenomPrefixPoolIds(denoms ...string) []byte { - sort.Strings(denoms) - concatenation := strings.Join(denoms[:], "") - return append(KeyPrefixPoolIds, []byte(concatenation)...) -} - -func GetKeyPrefixPools(poolId uint64) []byte { - return append(KeyPrefixPools, sdk.Uint64ToBigEndian(poolId)...) -} - -func GetDenomLiquidityPrefix(denom string) []byte { - return append(KeyTotalLiquidity, []byte(denom)...) -} diff --git a/x/spot/types/message.go b/x/spot/types/message.go deleted file mode 100644 index 8724d6b5b..000000000 --- a/x/spot/types/message.go +++ /dev/null @@ -1,226 +0,0 @@ -package types - -import ( - sdkerrors "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/errors" -) - -const ( - TypeMsgExitPool = "exit_pool" - TypeMsgJoinPool = "join_pool" - TypeMsgSwapAssets = "swap_assets" - TypeMsgCreatePool = "create_pool" -) - -var ( - _ sdk.Msg = &MsgExitPool{} - _ sdk.Msg = &MsgJoinPool{} - _ sdk.Msg = &MsgSwapAssets{} - _ sdk.Msg = &MsgCreatePool{} -) - -func NewMsgExitPool(sender string, poolId uint64, poolShares sdk.Coin) *MsgExitPool { - return &MsgExitPool{ - Sender: sender, - PoolId: poolId, - PoolShares: poolShares, - } -} - -func (msg *MsgExitPool) Route() string { - return RouterKey -} - -func (msg *MsgExitPool) Type() string { - return TypeMsgExitPool -} - -func (msg *MsgExitPool) GetSigners() []sdk.AccAddress { - creator, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{creator} -} - -func (msg *MsgExitPool) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(msg) - return sdk.MustSortJSON(bz) -} - -func (msg *MsgExitPool) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid address (%s)", err) - } - return nil -} - -var _ sdk.Msg = &MsgJoinPool{} - -func NewMsgJoinPool(sender string, poolId uint64, tokensIn sdk.Coins, useAllCoins bool) *MsgJoinPool { - return &MsgJoinPool{ - Sender: sender, - PoolId: poolId, - TokensIn: tokensIn, - UseAllCoins: useAllCoins, - } -} - -func (msg *MsgJoinPool) Route() string { - return RouterKey -} - -func (msg *MsgJoinPool) Type() string { - return TypeMsgJoinPool -} - -func (msg *MsgJoinPool) GetSigners() []sdk.AccAddress { - creator, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{creator} -} - -func (msg *MsgJoinPool) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(msg) - return sdk.MustSortJSON(bz) -} - -func (msg *MsgJoinPool) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid creator address (%s)", err) - } - return nil -} - -var _ sdk.Msg = &MsgSwapAssets{} - -func NewMsgSwapAssets(sender string, poolId uint64, tokenIn sdk.Coin, tokenOutDenom string) *MsgSwapAssets { - return &MsgSwapAssets{ - Sender: sender, - PoolId: poolId, - TokenIn: tokenIn, - TokenOutDenom: tokenOutDenom, - } -} - -func (msg *MsgSwapAssets) Route() string { - return RouterKey -} - -func (msg *MsgSwapAssets) Type() string { - return TypeMsgSwapAssets -} - -func (msg *MsgSwapAssets) GetSigners() []sdk.AccAddress { - creator, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(err) - } - return []sdk.AccAddress{creator} -} - -func (msg *MsgSwapAssets) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(msg) - return sdk.MustSortJSON(bz) -} - -func (msg *MsgSwapAssets) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid creator address (%s)", err) - } - - if msg.PoolId == 0 { - return ErrInvalidPoolId.Wrapf("pool id cannot be %d", msg.PoolId) - } - - if msg.TokenIn.Amount.LTE(sdk.ZeroInt()) { - return ErrInvalidTokenIn.Wrapf("invalid argument %s", msg.TokenIn.String()) - } - - if msg.TokenOutDenom == "" { - return ErrInvalidTokenOutDenom.Wrap("cannot be empty") - } - - return nil -} - -var _ sdk.Msg = &MsgCreatePool{} - -func NewMsgCreatePool(creator string, poolAssets []PoolAsset, poolParams *PoolParams) *MsgCreatePool { - return &MsgCreatePool{ - Creator: creator, - PoolAssets: poolAssets, - PoolParams: poolParams, - } -} - -func (msg *MsgCreatePool) Route() string { - return RouterKey -} - -func (msg *MsgCreatePool) Type() string { - return TypeMsgCreatePool -} - -func (msg *MsgCreatePool) GetSigners() []sdk.AccAddress { - creator, err := sdk.AccAddressFromBech32(msg.Creator) - if err != nil { - panic(err) - } - return []sdk.AccAddress{creator} -} - -func (msg *MsgCreatePool) GetSignBytes() []byte { - bz := ModuleCdc.MustMarshalJSON(msg) - return sdk.MustSortJSON(bz) -} - -func (msg *MsgCreatePool) ValidateBasic() error { - _, err := sdk.AccAddressFromBech32(msg.Creator) - if err != nil { - return sdkerrors.Wrapf(errors.ErrInvalidAddress, "invalid creator address (%s)", err) - } - - if len(msg.PoolAssets) < MinPoolAssets { - return ErrTooFewPoolAssets.Wrapf("invalid number of assets (%d)", len(msg.PoolAssets)) - } - if len(msg.PoolAssets) > MaxPoolAssets { - return ErrTooManyPoolAssets.Wrapf("invalid number of assets (%d)", len(msg.PoolAssets)) - } - - for _, asset := range msg.PoolAssets { - if asset.Weight.LTE(sdk.ZeroInt()) { - return ErrInvalidTokenWeight.Wrapf("invalid token weight %d for denom %s", asset.Weight, asset.Token.Denom) - } - } - - if msg.PoolParams.SwapFee.LT(sdk.ZeroDec()) || msg.PoolParams.SwapFee.GT(sdk.OneDec()) { - return ErrInvalidSwapFee.Wrapf("invalid swap fee: %s", msg.PoolParams.SwapFee) - } - - if msg.PoolParams.ExitFee.LT(sdk.ZeroDec()) || msg.PoolParams.ExitFee.GT(sdk.OneDec()) { - return ErrInvalidExitFee.Wrapf("invalid exit fee: %s", msg.PoolParams.ExitFee) - } - - if (msg.PoolParams.PoolType != PoolType_STABLESWAP) && (msg.PoolParams.PoolType != PoolType_BALANCER) { - return ErrInvalidPoolType - } - - if msg.PoolParams.PoolType == PoolType_STABLESWAP { - if msg.PoolParams.A.IsNil() { - return ErrAmplificationMissing - } - - if !msg.PoolParams.A.IsPositive() { - return ErrAmplificationTooLow - } - } - - return nil -} diff --git a/x/spot/types/message_test.go b/x/spot/types/message_test.go deleted file mode 100644 index 3e9f71ce3..000000000 --- a/x/spot/types/message_test.go +++ /dev/null @@ -1,350 +0,0 @@ -package types - -import ( - "testing" - - "github.com/NibiruChain/nibiru/x/common/testutil" - - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/stretchr/testify/require" -) - -func TestValidateBasic(t *testing.T) { - tests := []struct { - name string - msg MsgCreatePool - expectedErr error - }{ - { - name: "invalid address", - msg: MsgCreatePool{ - Creator: "invalid_address", - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid swap fee, too small", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("-0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrInvalidSwapFee, - }, - { - name: "invalid swap fee, too large", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("1.1"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrInvalidSwapFee, - }, - { - name: "invalid exit fee, too small", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("-0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrInvalidExitFee, - }, - { - name: "invalid exit fee, too large", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("1.1"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrInvalidExitFee, - }, - { - name: "too few assets", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrTooFewPoolAssets, - }, - { - name: "too many assets", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("ccc", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: ErrTooManyPoolAssets, - }, - { - name: "invalid token weight", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.ZeroInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.ZeroInt(), - }, - }, - }, - expectedErr: ErrInvalidTokenWeight, - }, - { - name: "valid create pool message", - msg: MsgCreatePool{ - Creator: testutil.AccAddress().String(), - PoolParams: &PoolParams{ - SwapFee: sdk.MustNewDecFromStr("0.003"), - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1), - Weight: sdk.OneInt(), - }, - }, - }, - expectedErr: nil, - }, - } - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.msg.ValidateBasic() - if tc.expectedErr != nil { - require.ErrorIs(t, err, tc.expectedErr) - } else { - require.NoError(t, err) - } - }) - } -} - -func TestMsgExitPool_ValidateBasic(t *testing.T) { - tests := []struct { - name string - msg MsgExitPool - err error - }{ - { - name: "invalid address", - msg: MsgExitPool{ - Sender: "invalid_address", - }, - err: sdkerrors.ErrInvalidAddress, - }, { - name: "valid address", - msg: MsgExitPool{ - Sender: testutil.AccAddress().String(), - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -func TestMsgJoinPool_ValidateBasic(t *testing.T) { - tests := []struct { - name string - msg MsgJoinPool - err error - }{ - { - name: "invalid address", - msg: MsgJoinPool{ - Sender: "invalid_address", - }, - err: sdkerrors.ErrInvalidAddress, - }, { - name: "valid address", - msg: MsgJoinPool{ - Sender: testutil.AccAddress().String(), - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} - -func TestMsgSwapAssets_ValidateBasic(t *testing.T) { - tests := []struct { - name string - msg MsgSwapAssets - err error - }{ - { - name: "invalid address", - msg: MsgSwapAssets{ - Sender: "invalid_address", - PoolId: 1, - TokenIn: sdk.NewInt64Coin("foo", 1), - TokenOutDenom: "bar", - }, - err: sdkerrors.ErrInvalidAddress, - }, - { - name: "invalid pool id", - msg: MsgSwapAssets{ - Sender: testutil.AccAddress().String(), - PoolId: 0, - TokenIn: sdk.NewInt64Coin("foo", 1), - TokenOutDenom: "bar", - }, - err: ErrInvalidPoolId, - }, - { - name: "invalid tokens in", - msg: MsgSwapAssets{ - Sender: testutil.AccAddress().String(), - PoolId: 1, - TokenIn: sdk.NewInt64Coin("foo", 0), - TokenOutDenom: "bar", - }, - err: ErrInvalidTokenIn, - }, - { - name: "invalid token out denom", - msg: MsgSwapAssets{ - Sender: testutil.AccAddress().String(), - PoolId: 1, - TokenIn: sdk.NewInt64Coin("foo", 1), - TokenOutDenom: "", - }, - err: ErrInvalidTokenOutDenom, - }, - { - name: "valid message", - msg: MsgSwapAssets{ - Sender: testutil.AccAddress().String(), - PoolId: 1, - TokenIn: sdk.NewInt64Coin("foo", 1), - TokenOutDenom: "bar", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - err := tt.msg.ValidateBasic() - if tt.err != nil { - require.ErrorIs(t, err, tt.err) - return - } - require.NoError(t, err) - }) - } -} diff --git a/x/spot/types/misc/stabletests.csv b/x/spot/types/misc/stabletests.csv deleted file mode 100644 index c22f81de4..000000000 --- a/x/spot/types/misc/stabletests.csv +++ /dev/null @@ -1,200 +0,0 @@ -"[27775542291595154, 97122479520742482]",3569,1,0,14569132846928708,14558669000207900 -"[99811231953029219, 67867258133352948, 4548504687635641, 22643988721136401]",1866,3,0,74314087998730798,74314370435091235 -"[79490968623278253, 2416473075872119, 16201992876681232, 26563606891100389, 31550918159678239]",1,2,3,20029180402698560,19630034405572792 -"[20390077612988015, 14143931325787607]",2874,0,1,646125170094190,646076474640607 -"[29862292342512526, 67464721015487113, 87029435446288613, 84748092193374166]",1661,1,0,19106998798163720,19105983646625076 -"[26314181423329306, 72232425287195858]",895,1,0,7017055246943759,7008536248313182 -"[50063648172290677, 88478493455845741, 56498015592382508]",434,0,2,56175044123085933,55631680015957697 -"[85974277623017018, 75621698555726081, 29660923586357885]",1769,1,0,56285720871465698,56282169988152274 -"[1448549668833367, 70220925182942167, 42193669609889726]",2702,2,1,30952835910452511,30952209807541944 -"[52760182169704204, 80560578505928626, 38370011571631126, 10523567718382376]",221,0,1,6243981777191623,6244229760683159 -"[21751115335094304, 2269537422422848, 79169137488199321, 62781109611104749, 70868520138484385]",906,1,4,4012347630123592,4013055467856176 -"[33812769090233324, 48275794826844955, 89859018195028312, 27622838635968022]",2623,1,0,29988889904145794,29986866603935209 -"[38550790744242251, 35749808204325994, 93688086287146772, 34503077430670297]",2892,1,0,34838346497693955,34836630239365079 -"[35417314410960968, 4102881661698347, 50055922087158045, 41884105950994686, 21101364706028050]",1186,1,2,3257903809020377,3257972188930204 -"[81129188249394063, 2584813155461682, 44804906888421064, 95264202217524109]",1,0,3,13940226839652919,13942817493440413 -"[72198520015474283, 98969806731775461, 7611649180436155]",3122,1,2,202275634204473,202067889175795 -"[77465114480268386, 78634762228767018, 5358738318039752, 82945484720524193, 30247634941059964]",725,0,4,10590544249402921,10590282436865524 -"[31068776034058944, 39968193528864314, 66360358721109297, 72646270885375562, 49523261462211484]",656,1,2,6857592314650409,6857600057013195 -"[25879450930992734, 73939730379687436, 98429560125131177, 6795064681229696]",1,3,0,13464205242148189,14430167730236281 -"[9340982326865641, 15587877420282456, 19501458580492835]",1007,1,2,9210079999688523,9209722748453901 -"[7872468114108993, 54708259168727746]",1290,0,1,28993075810311349,29008102407452619 -"[16285777537914017, 47446976441183895, 19919924880162336, 74231611041964662]",3763,1,3,40463544061139090,40463479145802453 -"[90591070006013486, 50731623526683063]",867,0,1,20036636364726264,20021021240086739 -"[22375051499480917, 41218751399761200, 12866957746759533, 24558798024917684, 29090029845634340]",2233,3,2,2975889618200377,2975885412523381 -"[62306694955836749, 49854186833579912, 33994657304703837, 28267954219420635]",2410,1,0,41496721619858045,41496504518209157 -"[6070925865583425, 92662876144134456, 95607482675151999, 41971114961613525, 47082597756636923]",3194,4,0,1431992583897632,1431950385301611 -"[80846549083963206, 70906406854076547, 74228318994171188, 2027393953938540, 82811121181051201]",942,2,3,786579769740673,785735057363777 -"[51301342054599088, 77126730028661743, 58751637435206305]",3926,1,0,1891009760636839,1890984993566355 -"[32305358452421359, 60920358540527868, 71857503348686740, 81504571407927530]",1138,2,0,30570323644075886,30557631212637089 -"[74283885983215027, 97376907892131235, 44701059091011433, 75038989483601953]",3572,1,0,61077282754379821,61076374079398594 -"[61809191794567159, 65268210983736695, 13041955921362012]",3334,2,0,1367651454523366,1367875804543958 -"[29305950030977337, 50529747115163700, 87408501924636118]",1893,0,2,57500308755670506,57500367166862904 -"[81555735945943859, 92446513201273467, 26820392358889621]",745,1,0,5649991870092771,5649806044917715 -"[55312357586388897, 85507925667443520]",476,1,0,15461825549485662,15448256102708432 -"[3324774254953230, 7444302682607094, 73818588715037600]",2423,0,1,1036600598831895,1038409415489951 -"[70866111453900446, 987034925133774, 5551501056990013, 33827754450273291]",1,0,2,440991689322851,163173975913946 -"[69260898739623064, 2407120271845792]",2114,1,0,27975191526590264,28031647097048791 -"[78989492850850109, 34085017560697864, 17098872479483990, 82101123756003477, 75942316151386295]",2151,0,2,832459722815124,832455899715611 -"[43105400266091190, 30907212812585241, 99592755261735635, 68038321017851058, 75636781777032787]",3041,1,4,3966410030435909,3966413284798787 -"[72480217367559860, 29633693498020282, 39797991003336311, 23528064722640901]",749,0,3,13344798053600377,13343604186498670 -"[7573870148015712, 96425949453897932, 12213914565225419, 29817160901860679]",3816,1,3,15641214014477820,15640405643999879 -"[39446768558086319, 33060509822102699, 47308413038664680]",3683,2,1,26651994504238407,26649135052115203 -"[59765006200169844, 32729340087571085, 5459283337981383, 72833741419973763]",1958,3,1,15353465961140485,15352657088325650 -"[11687948178407447, 70735263447974241, 19396727197336045, 60339348678984523]",1929,2,3,57279688711334547,57276037997951275 -"[76423498163807014, 61843295785370953, 65130276996772654, 27310582754688037, 18460489944575185]",1763,3,2,55654197258731139,55654084187322882 -"[46510092262672225, 35088848864762949, 85877728950773668]",495,0,2,25241287191968211,25242561667555042 -"[94489200612776920, 12892523631993082]",1703,0,1,6897644195895437,6860662857295104 -"[16624955453576244, 13099675266618686, 9573816005550134, 13670828667375562, 16649951565620241]",2845,2,0,15369216122484917,15369180878123818 -"[4349619225115443, 36739923809792602]",1905,0,1,21733705954783216,21742124926044837 -"[63491607504450131, 6957907101513874, 52641848063164062]",2856,2,0,28866767659336552,28865894138520401 -"[42575766492233533, 75944493215873760, 69477013071683111, 20575071825017380]",1806,2,1,623786338925258,623786837033419 -"[489218592538267, 14662597764290572, 23765886037043450]",2123,0,1,14537721546710050,14517774321461833 -"[13885765464616729, 3550969430265598]",1,1,0,5224753861040049,6500102664148832 -"[79661913387008706, 91524687892670355, 84888699883808398, 56172071485651526]",1,2,0,39201593055227540,38768818852997409 -"[67556033156043755, 5228023594229166, 9567881125457033]",877,0,2,4783368122087361,4765066821372804 -"[74993254895716474, 82141866006727728, 71846419421012636, 91708209715761089]",3726,1,0,28098385920714617,28098320361060157 -"[19637585111522953, 62882034406891290, 94855758426681982, 35490102125455267]",1853,2,1,11169301656973989,11169225571163800 -"[25973997813573493, 68627514110076118, 32245424124395163, 42026703571510752]",3451,1,2,23981507806427169,23981032331783447 -"[1701071625071059, 66138954591081596, 93178803700364461, 18089842293575865]",3070,1,2,48496537290436353,48495556130571719 -"[73507959220182831, 14246726621273775, 57144788495045358]",691,0,1,667236216367843,666656469812813 -"[12976150107437855, 97530586264274771, 76033118824173699, 32784474586516297, 38191053027841122]",3273,0,2,42291896504487313,42291932166701471 -"[91455767533246994, 61860751078374560]",539,0,1,1335308558546835,1334766062174620 -"[48164506381587318, 12397200467071704, 89035296175993046, 93793949252928114, 93874595153952850]",1942,4,2,76359322092558186,76358845763371849 -"[61328513286729704, 89852914158889517, 16905638990485440]",645,2,1,89159278973384881,88902851394992373 -"[68796293159405016, 86982538554379329]",1555,1,0,45511260656708490,45487452422795276 -"[8898007662468760, 92882563089559083]",3079,1,0,6842128161385877,6767336355160415 -"[37572692320844011, 78194216157707620]",3403,1,0,24005344006305440,23994508948323056 -"[63296299392391998, 15393876906431156, 14305587782713097, 68056283702550734]",1931,3,2,11647681896302999,11644441698114468 -"[18495841046767555, 82801749401579506, 61367066674882964]",2401,1,2,50688306115900746,50677407249052123 -"[78569114356943248, 15034128553414328, 96020554733746314]",1906,0,1,10107230131538149,10093317230348115 -"[62995662163319645, 34510490826081701, 65056543656776077, 78725328043591716, 19580263133955812]",3215,2,1,11056603170104980,11056591306192758 -"[46867583551858212, 37361486211856719, 80530344373805838, 35279570203019942, 96169359256080527]",3052,3,1,34823191232863459,34822887767130375 -"[3897337546208566, 61255724506026266, 64124651280978749, 92035336790824045, 78640745983696567]",487,1,0,18865779306098,18859486230683 -"[10449792083323391, 96046536920849986, 13127364880396787, 42121783828388748, 57722048484583211]",1,3,4,21623643670366424,21603788171156399 -"[43569236319830742, 36164620468153152, 75659062096776293, 60290733273448348, 42572681684400149]",967,1,2,37543659747235268,37543662423938384 -"[65111486824188036, 15661462404808721, 90164242572032832]",3666,1,2,14018987270090014,14020290779593297 -"[62061649229886036, 86851118889003425, 88274678251332076, 37389133926544499, 28977216355694804]",2902,0,3,10230551165644378,10230541426013324 -"[41823775070881603, 99225495794483530, 97115572679015653, 11350827886613140]",138,1,0,14693212838718158,14685212817866186 -"[80399317447959105, 19278741788798667, 97066374621342521]",204,0,2,32150528805435421,32145974107469428 -"[42514859695161149, 23779240243607695, 67259951487290892, 88717088575764004, 48834923714106316]",1845,1,2,43338533049253633,43338533336323111 -"[73420340616190429, 13431955718528882, 90085545544663931]",2288,2,1,109354105471013,109307925843683 -"[79173488595533176, 3095237363042198, 21682105737006794]",2929,2,1,1889746623230921,1876010193578316 -"[77704926969639656, 77453655833385927, 41681921151102252, 5223364732082858]",19,0,1,37722403172760587,37658611630002083 -"[20181384943814402, 67648658299439068, 61017188067476311]",3263,0,2,36747715248753532,36747984565464539 -"[59644483751711445, 65368384869406243]",786,0,1,57265510186654588,57143788310280319 -"[11665294459266695, 47481522580086917, 98561920979835682]",1,1,0,2735417209572263,1559400101969246 -"[80343525778891752, 79841930559669422, 49928576688971674, 36481579439455317, 99059687053189357]",1538,1,0,38819021008192692,38818991392060768 -"[25476137267109667, 29779132789637466, 51890576127790626]",3011,2,0,22434291455351709,22426920028781022 -"[21253619500587785, 37083681507189642, 92435363158926560, 48155854277037419, 75395708578308175]",726,4,0,14297986240396403,14297629831923982 -"[56911194864610338, 29983013817364024, 50369147910526390]",2123,0,2,4304286630173394,4304242450001299 -"[62723932673727116, 78212559624222356, 57398895199822767]",1,1,2,55849242356781324,44241962577150562 -"[58811804535401855, 69496955154034174, 20418866425224185]",1768,1,0,35493975483228121,35490931114821848 -"[82718112317463953, 8826850051363447, 92429802699925819, 33974576718302112]",2547,3,1,6383363341197876,6380744896686156 -"[19530792888210565, 548817406053776, 52699645793059384, 53407463938485303, 2925653870295818]",2777,4,1,387981843602306,384220122374564 -"[1645555732508651, 22217428103835650]",3710,0,1,10201715888190194,10206365884637108 -"[60091944007873372, 4825805865875489, 42349758746972729]",1,0,1,2751806457611371,877567379617301 -"[69451152420411631, 21927767292937187, 46613955265624778]",1,2,1,11569573074969161,9100533133080165 -"[80247046112981582, 42946576117522403, 55769140175073498, 2459569987569055]",1199,2,0,42074265990434132,42073217487727570 -"[20419859863985500, 57006432202366351, 45676188739860291]",2053,0,2,26102599708855703,26102529713487053 -"[70799901756274291, 31246070612751444, 51625437793655233, 28002099806049716]",634,2,1,29548979689965134,29533190203501932 -"[74194789012746491, 23111217050480249]",1925,0,1,7678002541916038,7671784007785916 -"[35761839419113165, 43177675271669727, 2793876178502950, 74236746662306530]",3324,3,1,23408516255585964,23407642540826963 -"[2389935293412759, 90722194103360944, 33554657062247059, 75413708292200801]",1412,3,0,348841718471271,347747403470350 -"[81160498135213554, 99142268833380375, 90345012890697159]",2747,2,1,85420679438876243,85410686872367065 -"[32137332442702858, 40678323701569584, 27468385539121105]",1925,2,0,13106400667278981,13106113266529047 -"[60139786451371726, 16377001684986043, 42151498053701624, 15076187330797665]",3865,1,0,50708734466897840,50708584204081401 -"[3621235742757581, 55363775943291536, 85394299419424733, 67699336762421870, 28482776932231394]",1727,4,1,95361111436334,95361674349960 -"[92433040794899419, 17164989863623070]",2536,0,1,7886119318682126,7871771144730641 -"[55214885829406499, 50335319328185454]",849,0,1,3627690833258196,3627341317050072 -"[595195262273315, 23874611527563193]",1643,0,1,6758896817926198,6793532110645690 -"[38638239458495434, 45749377268118255]",1,0,1,41907717755308016,31182448816213348 -"[99558605390903370, 55089900255704010, 21746075552214046, 50722180288720687]",1005,2,3,30507627849563204,30507560771416899 -"[50922729579375163, 96720072430232666, 5131591505294711]",1180,1,0,34397549730425743,34365776712075701 -"[70187425709284979, 78301460518417366, 42914247765978870, 52445731913189562, 54079792593765903]",1044,2,4,20932647044074441,20932637138043229 -"[91796285297293685, 22985387394391223, 68765093669833582, 56015703436774448]",3328,0,2,41396767105996307,41396441439442088 -"[78682156810606273, 60288819532447583, 48606253300325634, 874425726434693, 75169432195480183]",317,2,1,18086202328356698,18085908045182504 -"[6260137618940906, 94592802995981447, 36171078644600848]",3647,2,0,2457151399736167,2453808745051091 -"[90437735388118521, 44941741779181066, 21012424410658660, 37722872677786489, 41294431478651274]",1180,2,4,9339930315177791,9339942012964508 -"[57055247100972084, 97411041131490238, 88049437050618239, 28624004497812491, 66751901520401601]",2842,4,1,40418268224225143,40418264520740681 -"[80129410612599784, 83152019722453770]",1482,0,1,7286711630499487,7286582584842827 -"[96326714879509188, 37150318472078601, 79134390216976776, 60752909349701383, 35545676528189951]",1,2,1,15599990731741671,15536640234327600 -"[72010951167324091, 46352886174585451, 38745205797512237, 991653313080774]",1009,1,2,17799473286977551,17795557440931498 -"[61875212826932831, 72593040558011432, 19011646412279374]",3251,2,1,56205039384725983,56204711457319102 -"[15684112510939275, 96348627053556424]",3255,1,0,6367437054719561,6357124094279745 -"[10577563463353731, 52365820866282587, 29743177535602727, 41464246715654358]",2358,2,1,2125474505652479,2125485704542424 -"[45797231490346310, 19798482141736898]",1559,1,0,17115911409820152,17117702615031928 -"[71563162133678205, 81067597843976089, 70096022688615157, 99605299596835179]",1591,3,1,14585836363953879,14585783933681730 -"[29778208710118849, 64003338911050551, 45683809660143699]",3366,2,1,23470192025837031,23470115661671601 -"[19061029274162701, 88861042867103360]",1838,1,0,10380564887668160,10356328610769880 -"[81787427341393947, 28608408366168903]",3892,0,1,19405170712865413,19391241127797297 -"[5462536427837892, 60313003575039480, 30353510819364908, 80895117588152368, 35609564308819457]",2499,1,2,3096645186275397,3096637399954882 -"[97164432788743194, 9222045657218267, 42669157740877683, 89623221668756758, 13425776184662290]",75,3,4,296290347174338,296144185875546 -"[2525328083241901, 46421200423112829, 49666741712426690, 47352654256329765, 96358952649655268]",2144,1,0,40164958388258,40159395758322 -"[69038980588785024, 79837863579666355]",3973,1,0,43890394893295760,43883134828408922 -"[83515125086460535, 4917642495500753, 87395837591485469]",1862,2,1,2170833162202295,2156365527821558 -"[9994740418341502, 73198573631658376, 56546880956573137, 72102720530614895]",2417,3,1,51015946681524385,51015104737435898 -"[55243677217920709, 77971196695910202, 24757003639492289, 51347097693429737]",2337,2,0,645612721869928,645619377652683 -"[44075484005417502, 99009487706621372, 10206162861896777]",1,0,1,55211367147916370,55174788460612972 -"[77449783951525627, 96622527617405901]",124,1,0,17597919266290529,17564511534571724 -"[31472711499304794, 28537794900047728, 64590509440965888]",2278,1,0,3199818035633924,3199815672426861 -"[85127147804183038, 10907451024955490]",3101,0,1,5172140096670793,5156993162774455 -"[78869112819379136, 65683563674540773, 20450721902044273]",1,0,2,9580067507543145,6681840906321364 -"[76355003527890715, 89423248722724658]",445,0,1,32884188770912793,32874319386910856 -"[58350897179380223, 25320109331183988, 47409765415590316, 45884797510615309, 12771227731243619]",3348,4,3,669497091074848,669498333633530 -"[31629082547321912, 66962487253351599]",984,1,0,23526055061542009,23472331528288205 -"[61339069701175488, 57031595555609106, 27628293955272026]",1959,1,2,12393582463904563,12391970802708548 -"[90723223197964049, 92126516973348926, 25135966310466049, 6468863141559427]",3848,1,3,3502939308201254,3501483276834226 -"[30643815872495940, 99444958907123488, 60753933151148470, 45488579207343040, 36009953155972845]",487,2,3,11864673148291478,11864635854948134 -"[50543316487943597, 40313943101469725]",763,0,1,6352546382595016,6350904205737744 -"[11269790010109139, 65499243416568380, 81108527659964265, 70600446102693155]",114,3,0,10301709506174410,10148535134527868 -"[74554080886007678, 28670405010645704, 85654569480415530, 40968797961996311, 60924679540547467]",245,4,1,13118780250084403,13118494520027400 -"[46737043084360074, 82286149430729857]",2078,0,1,81237921881759889,80892516508534447 -"[8835611916050400, 57628382142431560]",1450,0,1,55989737010935606,55901590251352898 -"[64213443300134140, 64238213023738027]",2293,1,0,49151697148187180,49131920676197744 -"[73853094731189380, 7829335682003209]",2686,1,0,62260051096986523,62266364003095637 -"[5321655983813001, 91317131515757413]",3866,1,0,4160223091286997,4068380917831002 -"[48862501782929970, 55310406286670663, 49464435707234074, 69239111106638847]",1667,3,0,24966900151310959,24966626658169836 -"[30949795165527066, 89836611028918417, 54114214280108296, 51934703618072614]",317,0,1,49248577476488154,49249116887001376 -"[16138777978942730, 91547730741777183]",1443,0,1,12915578092294545,12928501231751342 -"[8218396563534725, 57737575296515419]",3166,0,1,34780030163893337,34786225555935240 -"[20447099011249796, 85406630653105891]",1,1,0,5743132972156642,2840742068206874 -"[91674619594269523, 29729701492058737, 2764287487501530, 10378124496155158]",3685,3,1,15942654438851238,15943004075115926 -"[98644950910472577, 58900491983607430, 36131813150848573]",2043,2,0,93437448520396446,93418264263692998 -"[17900199594434773, 9442670433755745, 27115402511241802, 76251636243027103, 66221708467367021]",2391,2,4,27286261816823239,27286278252910860 -"[99528408031324165, 66063536800192963]",1,0,1,54560755318735428,36277482536949316 -"[53673848541149130, 97714409424635281, 96721723451169947, 58155389654406246]",2326,1,2,60488830579513017,60488441844712628 -"[61976671467845593, 78221250311814832, 4797806429527831]",1273,0,1,40096814654104937,40091787678904902 -"[29132228183822363, 87258711327926155]",1147,0,1,31309221243789011,31317607263211598 -"[88499875721648702, 18532749390880803, 61623274093981801, 48895221084664315]",2461,1,2,24836036948053844,24836210684551946 -"[37918616704488552, 1978275343636407]",1185,1,0,30652228690824828,30682612007314091 -"[39566760046981365, 72165888636327214, 20984355492852881, 69732831981287588, 26644647874223458]",542,0,3,25787314673575233,25787324319619429 -"[33231171828127595, 70031823269237423, 29203587248870731, 46542297859429344]",1,3,1,826924181157457,831903979460410 -"[24168732790973415, 9891884832884577, 95888118345683431, 70447213823396764, 34778290967823452]",3364,2,0,18576443409495213,18576203163745039 -"[43460789793974808, 65358405945975190, 27686557946342977, 3730885400396796]",2477,2,1,52214733323434910,52213910103877138 -"[54867547995683828, 12486378424318257, 86932311741415380, 55718479759640327]",550,1,0,51587976361293124,51580284382596332 -"[95732886232079569, 78704352535502697]",3271,1,0,77725390605163864,77702892480086970 -"[82133674028027480, 62739247902702178]",1,1,0,5361724450167141,5719167931583828 -"[32489426358328931, 36496217877525875, 84851321668505670, 78292922005138858, 791961040552220]",1234,0,1,30737386011478621,30732598969452400 -"[13366363818185899, 30889885647796456, 81467436205101920, 67551454185472331]",742,3,2,29941440958617812,29941207831334242 -"[92918118211171130, 57330341525998584, 75911304280676823, 3890514656626920]",337,0,3,2533367736527389,2501365840465054 -"[76521766164486813, 86354971552504815, 54730979848559086]",1279,1,2,31497989275591945,31493163199716561 -"[49812811743199548, 58186596227649302, 26287660790015157]",933,1,2,8349095818526541,8347329998126068 -"[37933886900413822, 55726202592601111, 46081748926849522]",1786,2,0,12564858311979099,12564332455456866 -"[69867461742160185, 1352814715636538, 7736858741765872, 29311983032987394, 53904387879961111]",3045,3,1,900550488932776,899546826546409 -"[96132482844993548, 20976026519931608, 88455471296293319, 63575262507473881, 15860997286236090]",1,3,4,7634594760238378,7428289578458734 -"[1330441825650699, 35108857365414931]",3682,1,0,35127902021358,34675970003453 -"[10386380277462794, 23652365759781377]",2588,0,1,8543868360422247,8544415115796825 -"[57452763039578501, 25602886812442815, 57161394447653617, 59027345742473696, 28222779128014982]",184,3,0,42555399562147592,42554716657434372 -"[95688279586172992, 81357300020638325]",2875,1,0,44376644563882978,44373443081853912 -"[48086772769243042, 43738509811407018, 95806070340604096, 54383155620608511]",3697,0,3,7745771226916083,7745769878714023 -"[48466550134706494, 62458489539405430, 41001260515711365, 84672518612262309, 66952519627874424]",193,1,0,179130399358799,179129904259862 -"[12467222030895314, 53297354208761319, 9745688825539827, 83158153602115150, 18829217014123659]",3914,1,0,8414326373462587,8414192704810180 -"[87373514757295389, 36776518566996441]",1,0,1,14534609232868448,9396059756397486 -"[20871959848374229, 92008916703325096, 13218142135668071, 89619195637431353, 68632514579833846]",129,4,1,65265537174093928,65263485816100742 -"[98931597104436506, 33132493678017210, 27768934273835381, 92972857848664691, 90429529573619284]",60,4,0,83499627800950500,83491126823768986 -"[86153591584134967, 3499032560766213, 87788771609402210, 95665988072887715]",1756,3,0,18753147219416474,18752788840532866 -"[75038892220520647, 67581506476477568]",3521,1,0,10603995148523590,10603927906542831 -"[71600789539212919, 63529769797209224, 25127151339962766, 70085352502498970, 6565694423980876]",443,0,2,9942752460235186,9942400476625734 -"[19025005827936588, 97753026265519923]",910,0,1,86011328318824956,85981698734805866 -"[72959864838082277, 44748119077116580, 52088565520242482, 6454284556605846, 53320655481448340]",1802,1,0,15221030816245318,15221038933088359 diff --git a/x/spot/types/params.go b/x/spot/types/params.go deleted file mode 100644 index 5028af937..000000000 --- a/x/spot/types/params.go +++ /dev/null @@ -1,98 +0,0 @@ -package types - -import ( - fmt "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - "gopkg.in/yaml.v2" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/denoms" -) - -var _ paramtypes.ParamSet = (*Params)(nil) - -// ParamKeyTable the param key table for launch module -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams(startingPoolNumber uint64, poolCreationFee sdk.Coins, whitelistedAssets []string) Params { - return Params{ - StartingPoolNumber: startingPoolNumber, - PoolCreationFee: poolCreationFee, - WhitelistedAsset: whitelistedAssets, - } -} - -// DefaultParams returns a default set of parameters -func DefaultParams() Params { - return Params{ - StartingPoolNumber: 1, - PoolCreationFee: sdk.NewCoins(sdk.NewInt64Coin(denoms.NIBI, 1000*common.TO_MICRO)), // 1000 NIBI - WhitelistedAsset: []string{ - denoms.NIBI, - denoms.USDC, - denoms.NUSD, - denoms.USDT, - }, - } -} - -// ParamSetPairs get the params.ParamSet -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair([]byte("StartingPoolNumber"), &p.StartingPoolNumber, validatePoolNumber), - paramtypes.NewParamSetPair([]byte("PoolCreationFee"), &p.PoolCreationFee, validatePoolCreationFee), - paramtypes.NewParamSetPair([]byte("WhitelistedAsset"), &p.WhitelistedAsset, func(value interface{}) error { return nil }), - } -} - -func validatePoolNumber(i interface{}) error { - _, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validatePoolCreationFee(i interface{}) error { - v, ok := i.(sdk.Coins) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.Validate() != nil { - return fmt.Errorf("invalid pool creation fee: %+v", i) - } - - return nil -} - -// Validate validates the set of params -func (p Params) Validate() error { - if err := validatePoolCreationFee(p.PoolCreationFee); err != nil { - return err - } - - return nil -} - -// String implements the Stringer interface. -func (p Params) String() string { - out, _ := yaml.Marshal(p) - return string(out) -} - -// GetWhitelistedAssetsAsMap returns the whitelisted assets as map, util for -// checking if a value is on the whitelist. -func (p Params) GetWhitelistedAssetsAsMap() map[string]bool { - whitelistedAssets := make(map[string]bool) - for _, a := range p.WhitelistedAsset { - whitelistedAssets[a] = true - } - return whitelistedAssets -} diff --git a/x/spot/types/params.pb.go b/x/spot/types/params.pb.go deleted file mode 100644 index 1327e9702..000000000 --- a/x/spot/types/params.pb.go +++ /dev/null @@ -1,434 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/params.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/cosmos-proto" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// Params defines the parameters for the module. -type Params struct { - // The start pool number, i.e. the first pool number that isn't taken yet. - StartingPoolNumber uint64 `protobuf:"varint,1,opt,name=starting_pool_number,json=startingPoolNumber,proto3" json:"starting_pool_number,omitempty"` - // The cost of creating a pool, taken from the pool creator's account. - PoolCreationFee github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=pool_creation_fee,json=poolCreationFee,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"pool_creation_fee" yaml:"pool_creation_fee"` - // The assets that can be used to create liquidity pools - WhitelistedAsset []string `protobuf:"bytes,3,rep,name=whitelisted_asset,json=whitelistedAsset,proto3" json:"whitelisted_asset,omitempty"` -} - -func (m *Params) Reset() { *m = Params{} } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_532c93f2cfe0dc59, []int{0} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetStartingPoolNumber() uint64 { - if m != nil { - return m.StartingPoolNumber - } - return 0 -} - -func (m *Params) GetPoolCreationFee() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.PoolCreationFee - } - return nil -} - -func (m *Params) GetWhitelistedAsset() []string { - if m != nil { - return m.WhitelistedAsset - } - return nil -} - -func init() { - proto.RegisterType((*Params)(nil), "nibiru.spot.v1.Params") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/params.proto", fileDescriptor_532c93f2cfe0dc59) } - -var fileDescriptor_532c93f2cfe0dc59 = []byte{ - // 351 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x91, 0x3f, 0x4f, 0xc2, 0x40, - 0x18, 0xc6, 0x5b, 0x20, 0x24, 0xd6, 0x44, 0xa5, 0x61, 0x28, 0x98, 0xb4, 0x84, 0xa9, 0xd1, 0xd8, - 0xb3, 0xba, 0xb1, 0x09, 0xc6, 0xc9, 0x10, 0xc2, 0xe8, 0xd2, 0x5c, 0xcb, 0x59, 0x2e, 0xb6, 0x7d, - 0x9b, 0xde, 0x81, 0x32, 0xfb, 0x05, 0x4c, 0x5c, 0x1c, 0x9d, 0xfd, 0x24, 0x8c, 0x8c, 0x4e, 0x68, - 0xe0, 0x1b, 0xf8, 0x09, 0x4c, 0xef, 0xce, 0x84, 0xc4, 0xe9, 0xfe, 0xfc, 0xde, 0xe7, 0x7d, 0x9f, - 0xbc, 0x8f, 0x71, 0x9c, 0xd1, 0x90, 0x16, 0x33, 0xc4, 0x72, 0xe0, 0x68, 0xee, 0xa3, 0x1c, 0x17, - 0x38, 0x65, 0x5e, 0x5e, 0x00, 0x07, 0xf3, 0x40, 0x42, 0xaf, 0x84, 0xde, 0xdc, 0x6f, 0x37, 0x63, - 0x88, 0x41, 0x20, 0x54, 0xde, 0x64, 0x55, 0xdb, 0x8e, 0x80, 0xa5, 0xc0, 0x50, 0x88, 0x19, 0x41, - 0x73, 0x3f, 0x24, 0x1c, 0xfb, 0x28, 0x02, 0x9a, 0x29, 0xde, 0x92, 0x3c, 0x90, 0x42, 0xf9, 0x90, - 0xa8, 0xfb, 0x5c, 0x31, 0xea, 0x23, 0x31, 0xd1, 0x3c, 0x37, 0x9a, 0x8c, 0xe3, 0x82, 0xd3, 0x2c, - 0x0e, 0x72, 0x80, 0x24, 0xc8, 0x66, 0x69, 0x48, 0x0a, 0x4b, 0xef, 0xe8, 0x6e, 0x6d, 0x6c, 0xfe, - 0xb1, 0x11, 0x40, 0x32, 0x14, 0xc4, 0x7c, 0xd5, 0x8d, 0x86, 0xa8, 0x8c, 0x0a, 0x82, 0x39, 0x85, - 0x2c, 0xb8, 0x27, 0xc4, 0xaa, 0x74, 0xaa, 0xee, 0xfe, 0x45, 0xcb, 0x53, 0x73, 0x4a, 0x53, 0x9e, - 0x32, 0xe5, 0x0d, 0x80, 0x66, 0xfd, 0xdb, 0xe5, 0xda, 0xd1, 0x7e, 0xd6, 0x8e, 0xb5, 0xc0, 0x69, - 0xd2, 0xeb, 0xfe, 0xeb, 0xd0, 0xfd, 0xf8, 0x72, 0xdc, 0x98, 0xf2, 0xe9, 0x2c, 0xf4, 0x22, 0x48, - 0x95, 0x61, 0x75, 0x9c, 0xb1, 0xc9, 0x03, 0xe2, 0x8b, 0x9c, 0x30, 0xd1, 0x8c, 0x8d, 0x0f, 0x4b, - 0xfd, 0x40, 0xc9, 0x6f, 0x08, 0x31, 0x4f, 0x8d, 0xc6, 0xe3, 0x94, 0x72, 0x92, 0x50, 0xc6, 0xc9, - 0x24, 0xc0, 0x8c, 0x11, 0x6e, 0x55, 0x3b, 0x55, 0x77, 0x6f, 0x7c, 0xb4, 0x03, 0xae, 0xca, 0xff, - 0x5e, 0xed, 0xed, 0xdd, 0xd1, 0xfa, 0xd7, 0xcb, 0x8d, 0xad, 0xaf, 0x36, 0xb6, 0xfe, 0xbd, 0xb1, - 0xf5, 0x97, 0xad, 0xad, 0xad, 0xb6, 0xb6, 0xf6, 0xb9, 0xb5, 0xb5, 0xbb, 0x93, 0x1d, 0x1f, 0x43, - 0x91, 0xc5, 0x60, 0x8a, 0x69, 0x86, 0x54, 0x68, 0x4f, 0x32, 0x36, 0xe1, 0x27, 0xac, 0x8b, 0x95, - 0x5e, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xf4, 0x89, 0x01, 0xd2, 0x01, 0x00, 0x00, -} - -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.WhitelistedAsset) > 0 { - for iNdEx := len(m.WhitelistedAsset) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.WhitelistedAsset[iNdEx]) - copy(dAtA[i:], m.WhitelistedAsset[iNdEx]) - i = encodeVarintParams(dAtA, i, uint64(len(m.WhitelistedAsset[iNdEx]))) - i-- - dAtA[i] = 0x1a - } - } - if len(m.PoolCreationFee) > 0 { - for iNdEx := len(m.PoolCreationFee) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PoolCreationFee[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintParams(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.StartingPoolNumber != 0 { - i = encodeVarintParams(dAtA, i, uint64(m.StartingPoolNumber)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintParams(dAtA []byte, offset int, v uint64) int { - offset -= sovParams(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.StartingPoolNumber != 0 { - n += 1 + sovParams(uint64(m.StartingPoolNumber)) - } - if len(m.PoolCreationFee) > 0 { - for _, e := range m.PoolCreationFee { - l = e.Size() - n += 1 + l + sovParams(uint64(l)) - } - } - if len(m.WhitelistedAsset) > 0 { - for _, s := range m.WhitelistedAsset { - l = len(s) - n += 1 + l + sovParams(uint64(l)) - } - } - return n -} - -func sovParams(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozParams(x uint64) (n int) { - return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartingPoolNumber", wireType) - } - m.StartingPoolNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StartingPoolNumber |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolCreationFee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PoolCreationFee = append(m.PoolCreationFee, types.Coin{}) - if err := m.PoolCreationFee[len(m.PoolCreationFee)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WhitelistedAsset", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowParams - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthParams - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthParams - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WhitelistedAsset = append(m.WhitelistedAsset, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipParams(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthParams - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipParams(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowParams - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthParams - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupParams - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthParams - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/pool.go b/x/spot/types/pool.go deleted file mode 100644 index 7144ec620..000000000 --- a/x/spot/types/pool.go +++ /dev/null @@ -1,504 +0,0 @@ -package types - -import ( - "errors" - "fmt" - "math" - - sdkmath "cosmossdk.io/math" - - "github.com/holiman/uint256" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -/* -Returns the *base* denomination of a pool share token for a given poolId. - -args: - - poolId: the pool id number - -ret: - - poolDenom: the pool denomination name of the poolId -*/ -func GetPoolShareBaseDenom(poolId uint64) (poolDenom string) { - return fmt.Sprintf("nibiru/pool/%d", poolId) -} - -/* -Returns the *display* denomination of a pool share token for a given poolId. -Display denom means the denomination showed to the user, which could be many exponents greater than the base denom. -e.g. 1 atom is the display denom, but 10^6 uatom is the base denom. - -In Nibiru, a display denom is 10^18 base denoms. - -args: - - poolId: the pool id number - -ret: - - poolDenom: the pool denomination name of the poolId -*/ -func GetPoolShareDisplayDenom(poolId uint64) (poolDenom string) { - return fmt.Sprintf("NIBIRU-POOL-%d", poolId) -} - -/* -Creates a new pool and sets the initial assets. - -args: - - poolId: the pool numeric id - poolAccountAddr: the pool's account address for holding funds - poolParams: pool configuration options - poolAssets: the initial pool assets and weights - -ret: - - pool: a new pool - err: error if any -*/ -func NewPool( - poolId uint64, - poolAccountAddr sdk.Address, - poolParams PoolParams, - poolAssets []PoolAsset, -) (pool Pool, err error) { - pool = Pool{ - Id: poolId, - Address: poolAccountAddr.String(), - PoolParams: poolParams, - PoolAssets: nil, - TotalWeight: sdk.ZeroInt(), - TotalShares: sdk.NewCoin(GetPoolShareBaseDenom(poolId), InitPoolSharesSupply), - } - - err = pool.setInitialPoolAssets(poolAssets) - if err != nil { - return Pool{}, err - } - - return pool, nil -} - -/* -Ensure the denoms of the tokens in are assets of the pool - -args: - - - tokensIn: the tokens to check - -ret: - - - ok: true if all the denom from tokens in tokens in are in the pool -*/ -func (pool Pool) AreTokensInDenomInPoolAssets(tokensIn sdk.Coins) bool { - for _, asset := range tokensIn { - _, _, err := pool.getPoolAssetAndIndex(asset.Denom) - if err != nil { - return false - } - } - return true -} - -/* -AddTokensToPool Adds tokens to a pool and updates the pool balances (i.e. liquidity). - -args: - - tokensIn: the tokens to add to the pool - -ret: - - numShares: the number of LP shares given to the user for the deposit - - remCoins: the number of coins remaining after the deposit - - err: error if any -*/ -func (pool *Pool) AddTokensToPool(tokensIn sdk.Coins) ( - numShares sdkmath.Int, remCoins sdk.Coins, err error, -) { - if pool.TotalShares.Amount.IsZero() { - // Mint the initial 100.000000000000000000 pool share tokens to the sender - numShares = InitPoolSharesSupply - remCoins = sdk.Coins{} - } else if pool.PoolParams.PoolType == PoolType_STABLESWAP { - numShares, err = pool.numSharesOutFromTokensInStableSwap(tokensIn) - remCoins = sdk.Coins{} - } else { - numShares, remCoins, err = pool.numSharesOutFromTokensIn(tokensIn) - } - if err != nil { - return sdk.ZeroInt(), sdk.Coins{}, err - } - - tokensIn.Sort() - if err := pool.incrementBalances(numShares, tokensIn.Sub(remCoins...)); err != nil { - return sdk.ZeroInt(), sdk.Coins{}, err - } - - return numShares, remCoins, nil -} - -/* -AddAllTokensToPool Adds tokens to a pool optimizing the amount of shares (swap + join) and updates the pool balances (i.e. liquidity). -We maximally join with both tokens first, and then perform a single asset join with the remaining assets. - -This function is only necessary for balancer pool. Stableswap pool already takes all the deposit from the user. - -args: - - tokensIn: the tokens to add to the pool - -ret: - - numShares: the number of LP shares given to the user for the deposit - - remCoins: the number of coins remaining after the deposit - - err: error if any -*/ -func (pool *Pool) AddAllTokensToPool(tokensIn sdk.Coins) ( - numShares sdkmath.Int, remCoins sdk.Coins, err error, -) { - if pool.PoolParams.PoolType == PoolType_STABLESWAP { - err = ErrInvalidPoolType - return - } - - remCoins = tokensIn - if tokensIn.Len() > 1 { - numShares, remCoins, err = pool.AddTokensToPool(tokensIn) - } else { - numShares = sdk.ZeroInt() - } - - if remCoins.Empty() { - return - } - - numShares2nd, _, err := pool.AddTokensToPool(remCoins) - if err != nil { - return - } - - numShares = numShares2nd.Add(numShares) - remCoins = sdk.NewCoins() - return -} - -/* -GetAddress Fetch the pool's address as an sdk.Address. -*/ -func (pool Pool) GetAddress() (addr sdk.AccAddress) { - addr, err := sdk.AccAddressFromBech32(pool.Address) - if err != nil { - panic(fmt.Sprintf("could not bech32 decode address of pool with id: %d", pool.Id)) - } - return addr -} - -/* -ExitPool Given the amount of pool shares to exit, calculates the amount of coins to exit -from the pool and modifies the pool. Accounts for an exit fee, if any, on the pool. - -args: - - exitingShares: the number of pool shares to exit from the pool -*/ -func (pool *Pool) ExitPool(exitingShares sdkmath.Int) ( - exitedCoins sdk.Coins, fees sdk.Coins, err error, -) { - if exitingShares.GT(pool.TotalShares.Amount) { - return sdk.Coins{}, sdk.Coins{}, errors.New("too many shares out") - } - - exitedCoins, fees, err = pool.TokensOutFromPoolSharesIn(exitingShares) - if err != nil { - return sdk.Coins{}, sdk.Coins{}, err - } - - if !exitedCoins.IsValid() { - minShares := pool.MinSharesInForTokensOut() - return sdk.Coins{}, sdk.Coins{}, fmt.Errorf("not enough pool shares to withdraw - please provide at least %v shares", minShares) - } - - // update the pool's balances - for _, exitedCoin := range exitedCoins { - err = pool.SubtractPoolAssetBalance(exitedCoin.Denom, exitedCoin.Amount) - if err != nil { - return sdk.Coins{}, sdk.Coins{}, err - } - } - - pool.TotalShares = sdk.NewCoin(pool.TotalShares.Denom, pool.TotalShares.Amount.Sub(exitingShares)) - return exitedCoins, fees, nil -} - -/* -Updates the pool's asset liquidity using the provided tokens. - -args: - - tokens: the new token liquidity in the pool - -ret: - - err: error if any -*/ -func (pool *Pool) updatePoolAssetBalances(tokens ...sdk.Coin) (err error) { - // Ensures that there are no duplicate denoms, all denom's are valid, - // and amount is > 0 - for _, coin := range tokens { - if coin.Amount.LT(sdk.ZeroInt()) { - return fmt.Errorf("provided coins are invalid, %v", tokens) - } - assetIndex, existingAsset, err := pool.getPoolAssetAndIndex(coin.Denom) - if err != nil { - return err - } - existingAsset.Token = coin - pool.PoolAssets[assetIndex].Token = coin - } - - return nil -} - -// setInitialPoolAssets sets the PoolAssets in the pool. -// It is only designed to be called at the pool's creation. -// If the same denom's PoolAsset exists, will return error. -// The list of PoolAssets must be sorted. This is done to enable fast searching for a PoolAsset by denomination. -func (pool *Pool) setInitialPoolAssets(poolAssets []PoolAsset) (err error) { - exists := make(map[string]bool) - - newTotalWeight := sdk.ZeroInt() - scaledPoolAssets := make([]PoolAsset, 0, len(poolAssets)) - - for _, asset := range poolAssets { - if err = asset.Validate(); err != nil { - return err - } - - if exists[asset.Token.Denom] { - return fmt.Errorf("same PoolAsset already exists") - } - exists[asset.Token.Denom] = true - - // Scale weight from the user provided weight to the correct internal weight - asset.Weight = asset.Weight.MulRaw(GuaranteedWeightPrecision) - scaledPoolAssets = append(scaledPoolAssets, asset) - newTotalWeight = newTotalWeight.Add(asset.Weight) - } - - pool.PoolAssets = scaledPoolAssets - sortPoolAssetsByDenom(pool.PoolAssets) - - pool.TotalWeight = newTotalWeight - - return nil -} - -// For a stableswap pool, compute the D invariant value in non-overflowing integer operations iteratively -// A * sum(x_i) * n**n + D = A * D * n**n + D**(n+1) / (n**n * prod(x_i)) -// Converging solution: -// D[j+1] = (A * n**n * sum(x_i) - D[j]**(n+1) / (n**n prod(x_i))) / (A * n**n - 1) -func (pool Pool) GetD(poolAssets []PoolAsset) (*uint256.Int, error) { - nCoins := uint256.NewInt(uint64(len(poolAssets))) - - S := new(uint256.Int) - - Amp := uint256.NewInt(uint64(pool.PoolParams.A.Int64())) - - Ann := new(uint256.Int) - - nCoinsFloat := float64(len(poolAssets)) - Ann.Mul(Amp, uint256.NewInt(uint64(math.Pow(nCoinsFloat, nCoinsFloat)))) - - var poolAssetsTokens []*uint256.Int - for _, token := range poolAssets { - if token.Token.Amount.IsZero() { - // Pool is borked and one asset is missing. Users can only withdraw funds. - return new(uint256.Int), ErrBorkedPool - } - amount := uint256.NewInt(token.Token.Amount.Uint64()) - poolAssetsTokens = append(poolAssetsTokens, amount) - S.Add(S, amount) - } - - D := new(uint256.Int).Set(S) - - for i := 0; i < 255; i++ { - D_P := new(uint256.Int).Set(D) - for _, token := range poolAssetsTokens { - // We ensure before that token is always != 0 - D_P.Div( - new(uint256.Int).Mul(D_P, D), - new(uint256.Int).Mul(token, nCoins), - ) - } - previousD := new(uint256.Int).Set(D) - - // D = (Ann * S + D_P * N_COINS) * D / ((Ann - 1) * D + (N_COINS + 1) * D_P) - num := new(uint256.Int).Mul( - new(uint256.Int).Add( - new(uint256.Int).Mul(Ann, S), - new(uint256.Int).Mul(D_P, nCoins), - ), - D, - ) - denom := new(uint256.Int).Add( - new(uint256.Int).Mul( - new(uint256.Int).Add( - nCoins, - uint256.NewInt(1), - ), - D_P, - ), - new(uint256.Int).Mul( - new(uint256.Int).Sub(Ann, uint256.NewInt(1)), - D, - ), - ) - - // D = (Ann * S + D_P * N_COINS) * D / ((Ann - 1) * D + (N_COINS + 1) * D_P) - absDifference := new(uint256.Int) - D.Div(num, denom) - - absDifference.Abs(new(uint256.Int).Sub(D, previousD)) - if absDifference.Lt(uint256.NewInt(2)) { // absDifference LTE 1 -> absDifference LT 2 - break - } - } - - return D, nil -} - -// getA returns the amplification factor of the pool -func (pool Pool) getA() (Amp *uint256.Int) { - Amp = uint256.NewInt(uint64(pool.PoolParams.A.Int64())) - return -} - -// Search for the i and j indices for a swap like x[j] if one makes x[i] = x -func (pool Pool) getIJforSwap(denomIn, denomOut string) (i int, j int, err error) { - i, _, err = pool.getPoolAssetAndIndex(denomIn) - if err != nil { - return - } - - j, _, err = pool.getPoolAssetAndIndex(denomOut) - if err != nil { - return - } - - return i, j, nil -} - -func MustSdkIntToUint256(num sdkmath.Int) *uint256.Int { - return uint256.NewInt(uint64(num.Int64())) -} - -// Calculate the amount of token out -func (pool Pool) Exchange(tokenIn sdk.Coin, tokenOutDenom string) (dy sdkmath.Int, err error) { - _, poolAssetIn, err := pool.getPoolAssetAndIndex(tokenIn.Denom) - if err != nil { - return - } - _, poolAssetOut, err := pool.getPoolAssetAndIndex(tokenOutDenom) - if err != nil { - return - } - - dx := poolAssetIn.Token.Add(tokenIn) - - yAmount, err := pool.SolveStableswapInvariant(dx, tokenOutDenom) - if err != nil { - return - } - - y := sdk.NewCoin(tokenOutDenom, yAmount) - dy = poolAssetOut.Token.Sub(y).Amount - return -} - -// Calculate y if one makes x = tokenIn -// Done by solving quadratic equation iteratively. -// x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n+1)/(n ** (2 * n) * prod' * A) -// x_1**2 + b*x_1 = c -// x_1 = (x_1**2 + c) / (2*x_1 + b - D) -func (pool Pool) SolveStableswapInvariant(tokenIn sdk.Coin, tokenOutDenom string) (yAmount sdkmath.Int, err error) { - A := pool.getA() - D, err := pool.GetD(pool.PoolAssets) - if err != nil { - return - } - - Ann := new(uint256.Int) - nCoins := uint256.NewInt(uint64(len(pool.PoolAssets))) - - nCoinsFloat := float64(len(pool.PoolAssets)) - Ann.Mul(A, uint256.NewInt(uint64(math.Pow(nCoinsFloat, nCoinsFloat)))) - - c := new(uint256.Int).Set(D) - S := new(uint256.Int) - var _x *uint256.Int - - i, j, err := pool.getIJforSwap(tokenIn.Denom, tokenOutDenom) - if err != nil { - return - } - - for _i := 0; _i < len(pool.PoolAssets); _i++ { - if _i == i { - _x = MustSdkIntToUint256(tokenIn.Amount) - } else if _i != j { - _x = MustSdkIntToUint256(pool.PoolAssets[_i].Token.Amount) - } else { - continue - } - - S.Add(S, _x) - - c.Div( - new(uint256.Int).Mul(c, D), - new(uint256.Int).Mul(_x, nCoins), - ) - } - - // c = c * D * A_PRECISION / (Ann * N_COINS) - c.Div( - new(uint256.Int).Mul(c, D), - new(uint256.Int).Mul(Ann, nCoins), - ) - - // b = S + D / Ann - b := new(uint256.Int).Add( - S, - new(uint256.Int).Div( - D, - Ann, - ), - ) - - y := new(uint256.Int).Set(D) - y_prev := new(uint256.Int) - - for _i := 0; _i < 255; _i++ { - y_prev.Set(y) - - y.Div( - new(uint256.Int).Add(new(uint256.Int).Mul(y, y), c), - new(uint256.Int).Sub( - new(uint256.Int).Add( - new(uint256.Int).Mul(uint256.NewInt(2), - y, - ), - b, - ), - D, - ), - ) - - absDifference := new(uint256.Int) - absDifference.Abs(new(uint256.Int).Sub(y, y_prev)) - if absDifference.Lt(uint256.NewInt(2)) { // LTE 1 - break - } - } - - return sdk.NewIntFromUint64(y.Uint64()), nil -} diff --git a/x/spot/types/pool.pb.go b/x/spot/types/pool.pb.go deleted file mode 100644 index d921d1738..000000000 --- a/x/spot/types/pool.pb.go +++ /dev/null @@ -1,1123 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/pool.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/cosmos-proto" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// - `balancer`: Balancer are pools defined by the equation xy=k, extended by -// the weighs introduced by Balancer. -// - `stableswap`: Stableswap pools are defined by a combination of -// constant-product and constant-sum pool -type PoolType int32 - -const ( - PoolType_BALANCER PoolType = 0 - PoolType_STABLESWAP PoolType = 1 -) - -var PoolType_name = map[int32]string{ - 0: "BALANCER", - 1: "STABLESWAP", -} - -var PoolType_value = map[string]int32{ - "BALANCER": 0, - "STABLESWAP": 1, -} - -func (x PoolType) String() string { - return proto.EnumName(PoolType_name, int32(x)) -} - -func (PoolType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_cf0eee5bfc2c3a2b, []int{0} -} - -// Configuration parameters for the pool. -type PoolParams struct { - SwapFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=swap_fee,json=swapFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"swap_fee" yaml:"swap_fee"` - ExitFee github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=exit_fee,json=exitFee,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"exit_fee" yaml:"exit_fee"` - // Amplification Parameter (A): Larger value of A make the curve better - // resemble a straight line in the center (when pool is near balance). Highly - // volatile assets should use a lower value, while assets that are closer - // together may be best with a higher value. This is only used if the - // pool_type is set to 1 (stableswap) - A github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=A,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"A" yaml:"amplification"` - PoolType PoolType `protobuf:"varint,4,opt,name=pool_type,json=poolType,proto3,enum=nibiru.spot.v1.PoolType" json:"pool_type,omitempty" yaml:"pool_type"` -} - -func (m *PoolParams) Reset() { *m = PoolParams{} } -func (m *PoolParams) String() string { return proto.CompactTextString(m) } -func (*PoolParams) ProtoMessage() {} -func (*PoolParams) Descriptor() ([]byte, []int) { - return fileDescriptor_cf0eee5bfc2c3a2b, []int{0} -} -func (m *PoolParams) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PoolParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PoolParams.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PoolParams) XXX_Merge(src proto.Message) { - xxx_messageInfo_PoolParams.Merge(m, src) -} -func (m *PoolParams) XXX_Size() int { - return m.Size() -} -func (m *PoolParams) XXX_DiscardUnknown() { - xxx_messageInfo_PoolParams.DiscardUnknown(m) -} - -var xxx_messageInfo_PoolParams proto.InternalMessageInfo - -func (m *PoolParams) GetPoolType() PoolType { - if m != nil { - return m.PoolType - } - return PoolType_BALANCER -} - -// Which assets the pool contains. -type PoolAsset struct { - // Coins we are talking about, - // the denomination must be unique amongst all PoolAssets for this pool. - Token types.Coin `protobuf:"bytes,1,opt,name=token,proto3" json:"token" yaml:"token"` - // Weight that is not normalized. This weight must be less than 2^50 - Weight github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=weight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"weight" yaml:"weight"` -} - -func (m *PoolAsset) Reset() { *m = PoolAsset{} } -func (m *PoolAsset) String() string { return proto.CompactTextString(m) } -func (*PoolAsset) ProtoMessage() {} -func (*PoolAsset) Descriptor() ([]byte, []int) { - return fileDescriptor_cf0eee5bfc2c3a2b, []int{1} -} -func (m *PoolAsset) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *PoolAsset) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_PoolAsset.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *PoolAsset) XXX_Merge(src proto.Message) { - xxx_messageInfo_PoolAsset.Merge(m, src) -} -func (m *PoolAsset) XXX_Size() int { - return m.Size() -} -func (m *PoolAsset) XXX_DiscardUnknown() { - xxx_messageInfo_PoolAsset.DiscardUnknown(m) -} - -var xxx_messageInfo_PoolAsset proto.InternalMessageInfo - -func (m *PoolAsset) GetToken() types.Coin { - if m != nil { - return m.Token - } - return types.Coin{} -} - -type Pool struct { - // The pool id. - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - // The pool account address. - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty" yaml:"address"` - // Fees and other pool-specific parameters. - PoolParams PoolParams `protobuf:"bytes,3,opt,name=pool_params,json=poolParams,proto3" json:"pool_params" yaml:"pool_params"` - // These are assumed to be sorted by denomiation. - // They contain the pool asset and the information about the weight - PoolAssets []PoolAsset `protobuf:"bytes,4,rep,name=pool_assets,json=poolAssets,proto3" json:"pool_assets" yaml:"pool_assets"` - // sum of all non-normalized pool weights - TotalWeight github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=total_weight,json=totalWeight,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"total_weight" yaml:"total_weight"` - // sum of all LP tokens sent out - TotalShares types.Coin `protobuf:"bytes,6,opt,name=total_shares,json=totalShares,proto3" json:"total_shares" yaml:"total_shares"` -} - -func (m *Pool) Reset() { *m = Pool{} } -func (m *Pool) String() string { return proto.CompactTextString(m) } -func (*Pool) ProtoMessage() {} -func (*Pool) Descriptor() ([]byte, []int) { - return fileDescriptor_cf0eee5bfc2c3a2b, []int{2} -} -func (m *Pool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Pool.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Pool) XXX_Merge(src proto.Message) { - xxx_messageInfo_Pool.Merge(m, src) -} -func (m *Pool) XXX_Size() int { - return m.Size() -} -func (m *Pool) XXX_DiscardUnknown() { - xxx_messageInfo_Pool.DiscardUnknown(m) -} - -var xxx_messageInfo_Pool proto.InternalMessageInfo - -func init() { - proto.RegisterEnum("nibiru.spot.v1.PoolType", PoolType_name, PoolType_value) - proto.RegisterType((*PoolParams)(nil), "nibiru.spot.v1.PoolParams") - proto.RegisterType((*PoolAsset)(nil), "nibiru.spot.v1.PoolAsset") - proto.RegisterType((*Pool)(nil), "nibiru.spot.v1.Pool") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/pool.proto", fileDescriptor_cf0eee5bfc2c3a2b) } - -var fileDescriptor_cf0eee5bfc2c3a2b = []byte{ - // 620 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x94, 0xcd, 0x6a, 0xdb, 0x40, - 0x10, 0xc7, 0x25, 0xc7, 0x49, 0x9c, 0x75, 0xea, 0x86, 0xad, 0x0f, 0x8a, 0x0b, 0x52, 0xd8, 0x43, - 0x09, 0xa1, 0x95, 0x70, 0x7a, 0xcb, 0xa5, 0x48, 0x89, 0x03, 0xa5, 0x21, 0x04, 0x25, 0xd4, 0xb4, - 0x14, 0xcc, 0xda, 0xde, 0xd8, 0x4b, 0x6c, 0xad, 0xf0, 0x6e, 0x3e, 0xfc, 0x06, 0x3d, 0xf6, 0x11, - 0x7a, 0xef, 0x4b, 0xf4, 0x98, 0x63, 0x8e, 0xa5, 0x07, 0x51, 0xec, 0x63, 0x6f, 0x7e, 0x82, 0xb2, - 0x1f, 0x6a, 0x12, 0x30, 0x14, 0xd3, 0x93, 0x76, 0xf8, 0xcf, 0xfc, 0xb4, 0xf3, 0x9f, 0x61, 0xc1, - 0x66, 0x42, 0xdb, 0x74, 0x74, 0x19, 0xf0, 0x94, 0x89, 0xe0, 0xaa, 0x1e, 0xa4, 0x8c, 0x0d, 0xfc, - 0x74, 0xc4, 0x04, 0x83, 0x15, 0x2d, 0xf9, 0x52, 0xf2, 0xaf, 0xea, 0xb5, 0x6a, 0x8f, 0xf5, 0x98, - 0x92, 0x02, 0x79, 0xd2, 0x59, 0x35, 0xb7, 0xc3, 0xf8, 0x90, 0xf1, 0xa0, 0x8d, 0x39, 0x09, 0xae, - 0xea, 0x6d, 0x22, 0x70, 0x3d, 0xe8, 0x30, 0x9a, 0x18, 0x7d, 0x53, 0xeb, 0x2d, 0x5d, 0xa8, 0x03, - 0x2d, 0xa1, 0xdf, 0x05, 0x00, 0x4e, 0x18, 0x1b, 0x9c, 0xe0, 0x11, 0x1e, 0x72, 0xf8, 0x09, 0x94, - 0xf8, 0x35, 0x4e, 0x5b, 0xe7, 0x84, 0x38, 0xf6, 0x96, 0xbd, 0xbd, 0x16, 0x85, 0xb7, 0x99, 0x67, - 0xfd, 0xcc, 0xbc, 0x17, 0x3d, 0x2a, 0xfa, 0x97, 0x6d, 0xbf, 0xc3, 0x86, 0x86, 0x60, 0x3e, 0xaf, - 0x78, 0xf7, 0x22, 0x10, 0xe3, 0x94, 0x70, 0xff, 0x80, 0x74, 0x66, 0x99, 0xf7, 0x74, 0x8c, 0x87, - 0x83, 0x3d, 0x94, 0x73, 0x50, 0xbc, 0x2a, 0x8f, 0x87, 0x84, 0x48, 0x3a, 0xb9, 0xa1, 0x42, 0xd1, - 0x0b, 0xff, 0x47, 0xcf, 0x39, 0x28, 0x5e, 0x95, 0x47, 0x49, 0x3f, 0x03, 0x76, 0xe8, 0x2c, 0x29, - 0xec, 0xe1, 0x02, 0xd8, 0xb7, 0x89, 0x98, 0x65, 0x5e, 0x55, 0x63, 0xf1, 0x30, 0x1d, 0xd0, 0x73, - 0xda, 0xc1, 0x82, 0xb2, 0x04, 0xc5, 0x76, 0x08, 0xdf, 0x81, 0x35, 0x39, 0x8f, 0x96, 0x4c, 0x76, - 0x8a, 0x5b, 0xf6, 0x76, 0x65, 0xd7, 0xf1, 0x1f, 0x4f, 0xc5, 0x97, 0x06, 0x9e, 0x8d, 0x53, 0x12, - 0x55, 0x67, 0x99, 0xb7, 0xa1, 0x49, 0x7f, 0x8b, 0x50, 0x5c, 0x4a, 0x8d, 0x8e, 0xbe, 0xd9, 0x60, - 0x4d, 0x26, 0x87, 0x9c, 0x13, 0x01, 0x1b, 0x60, 0x59, 0xb0, 0x0b, 0x92, 0x28, 0xa7, 0xcb, 0xbb, - 0x9b, 0xbe, 0x99, 0x8c, 0x1c, 0xa3, 0x6f, 0xc6, 0xe8, 0xef, 0x33, 0x9a, 0x44, 0x55, 0xd9, 0xcf, - 0x2c, 0xf3, 0xd6, 0x35, 0x5b, 0x55, 0xa1, 0x58, 0x57, 0xc3, 0x26, 0x58, 0xb9, 0x26, 0xb4, 0xd7, - 0x17, 0xc6, 0xd3, 0x37, 0x0b, 0x37, 0xff, 0x44, 0x63, 0x35, 0x05, 0xc5, 0x06, 0x87, 0xbe, 0x2f, - 0x81, 0xa2, 0xbc, 0x2d, 0xac, 0x80, 0x02, 0xed, 0xaa, 0x5b, 0x16, 0xe3, 0x02, 0xed, 0xc2, 0x97, - 0x60, 0x15, 0x77, 0xbb, 0x23, 0xc2, 0xb9, 0xf9, 0x25, 0x9c, 0x65, 0x5e, 0xc5, 0x38, 0xa8, 0x05, - 0x14, 0xe7, 0x29, 0xb0, 0x09, 0xca, 0xca, 0x8c, 0x54, 0xad, 0x98, 0x9a, 0x50, 0x79, 0xb7, 0x36, - 0xcf, 0x43, 0xbd, 0x84, 0x51, 0xcd, 0x74, 0x0b, 0x1f, 0x38, 0xa9, 0x8b, 0x51, 0x0c, 0xd2, 0xfb, - 0x65, 0x7d, 0x6f, 0xc0, 0x58, 0xba, 0xc9, 0x9d, 0xe2, 0xd6, 0x92, 0x72, 0x71, 0x0e, 0x58, 0xf9, - 0x3d, 0x97, 0xab, 0x6b, 0x0d, 0x57, 0xa5, 0x71, 0xd8, 0x07, 0xeb, 0x82, 0x09, 0x3c, 0x68, 0x19, - 0x5b, 0x97, 0x55, 0x8f, 0x8d, 0x85, 0x6d, 0x7d, 0x96, 0x4f, 0xeb, 0x9e, 0x85, 0xe2, 0xb2, 0x0a, - 0x9b, 0x2a, 0x82, 0x1f, 0xf2, 0x3f, 0xf1, 0x3e, 0x1e, 0x11, 0xee, 0xac, 0xfc, 0x6b, 0x11, 0x9e, - 0x9b, 0x16, 0x1e, 0xa1, 0x75, 0x71, 0x8e, 0x3e, 0x55, 0xd1, 0x5e, 0xf1, 0xf3, 0x57, 0xcf, 0xda, - 0xd9, 0x06, 0xa5, 0x7c, 0x39, 0xe1, 0x3a, 0x28, 0x45, 0xe1, 0x51, 0x78, 0xbc, 0xdf, 0x88, 0x37, - 0x2c, 0x58, 0x01, 0xe0, 0xf4, 0x2c, 0x8c, 0x8e, 0x1a, 0xa7, 0xcd, 0xf0, 0x64, 0xc3, 0x8e, 0x0e, - 0x6e, 0x27, 0xae, 0x7d, 0x37, 0x71, 0xed, 0x5f, 0x13, 0xd7, 0xfe, 0x32, 0x75, 0xad, 0xbb, 0xa9, - 0x6b, 0xfd, 0x98, 0xba, 0xd6, 0xc7, 0x9d, 0x07, 0x0d, 0x1f, 0x2b, 0x6f, 0xf7, 0xfb, 0x98, 0x26, - 0x81, 0x79, 0xb5, 0x6e, 0xf4, 0xbb, 0xa5, 0x1a, 0x6f, 0xaf, 0xa8, 0x57, 0xe5, 0xf5, 0x9f, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x0e, 0x8e, 0x88, 0xaa, 0xd3, 0x04, 0x00, 0x00, -} - -func (m *PoolParams) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PoolParams) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PoolParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolType != 0 { - i = encodeVarintPool(dAtA, i, uint64(m.PoolType)) - i-- - dAtA[i] = 0x20 - } - { - size := m.A.Size() - i -= size - if _, err := m.A.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.ExitFee.Size() - i -= size - if _, err := m.ExitFee.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.SwapFee.Size() - i -= size - if _, err := m.SwapFee.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *PoolAsset) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PoolAsset) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PoolAsset) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.Weight.Size() - i -= size - if _, err := m.Weight.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Token.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Pool) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Pool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.TotalShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size := m.TotalWeight.Size() - i -= size - if _, err := m.TotalWeight.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - if len(m.PoolAssets) > 0 { - for iNdEx := len(m.PoolAssets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PoolAssets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - { - size, err := m.PoolParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintPool(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if len(m.Address) > 0 { - i -= len(m.Address) - copy(dAtA[i:], m.Address) - i = encodeVarintPool(dAtA, i, uint64(len(m.Address))) - i-- - dAtA[i] = 0x12 - } - if m.Id != 0 { - i = encodeVarintPool(dAtA, i, uint64(m.Id)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintPool(dAtA []byte, offset int, v uint64) int { - offset -= sovPool(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *PoolParams) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.SwapFee.Size() - n += 1 + l + sovPool(uint64(l)) - l = m.ExitFee.Size() - n += 1 + l + sovPool(uint64(l)) - l = m.A.Size() - n += 1 + l + sovPool(uint64(l)) - if m.PoolType != 0 { - n += 1 + sovPool(uint64(m.PoolType)) - } - return n -} - -func (m *PoolAsset) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Token.Size() - n += 1 + l + sovPool(uint64(l)) - l = m.Weight.Size() - n += 1 + l + sovPool(uint64(l)) - return n -} - -func (m *Pool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Id != 0 { - n += 1 + sovPool(uint64(m.Id)) - } - l = len(m.Address) - if l > 0 { - n += 1 + l + sovPool(uint64(l)) - } - l = m.PoolParams.Size() - n += 1 + l + sovPool(uint64(l)) - if len(m.PoolAssets) > 0 { - for _, e := range m.PoolAssets { - l = e.Size() - n += 1 + l + sovPool(uint64(l)) - } - } - l = m.TotalWeight.Size() - n += 1 + l + sovPool(uint64(l)) - l = m.TotalShares.Size() - n += 1 + l + sovPool(uint64(l)) - return n -} - -func sovPool(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozPool(x uint64) (n int) { - return sovPool(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *PoolParams) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PoolParams: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PoolParams: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SwapFee", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SwapFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExitFee", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExitFee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field A", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.A.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolType", wireType) - } - m.PoolType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolType |= PoolType(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipPool(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPool - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PoolAsset) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: PoolAsset: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PoolAsset: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Token", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Token.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Weight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPool(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPool - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Pool) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Pool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Pool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - m.Id = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Id |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Address = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolParams", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolAssets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PoolAssets = append(m.PoolAssets, PoolAsset{}) - if err := m.PoolAssets[len(m.PoolAssets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalWeight", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TotalWeight.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPool - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthPool - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthPool - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TotalShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipPool(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthPool - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipPool(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowPool - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowPool - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowPool - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthPool - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupPool - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthPool - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthPool = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowPool = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupPool = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/pool_asset.go b/x/spot/types/pool_asset.go deleted file mode 100644 index d81673cda..000000000 --- a/x/spot/types/pool_asset.go +++ /dev/null @@ -1,50 +0,0 @@ -package types - -import ( - "errors" - fmt "fmt" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// Validates a PoolAsset amount and weights. -func (poolAsset PoolAsset) Validate() error { - if poolAsset.Token.Amount.LTE(sdk.ZeroInt()) { - return fmt.Errorf("can't add the zero or negative balance of token") - } - - if poolAsset.Weight.LTE(sdk.ZeroInt()) { - return fmt.Errorf("a token's weight in the pool must be greater than 0") - } - - if poolAsset.Weight.GTE(MaxUserSpecifiedWeight.MulRaw(GuaranteedWeightPrecision)) { - return fmt.Errorf("a token's weight in the pool must be less than 1^50") - } - - return nil -} - -/* -Subtracts an amount of coins from a pool's assets. -Throws an error if the final amount is less than zero. -*/ -func (pool *Pool) SubtractPoolAssetBalance(assetDenom string, subAmt sdkmath.Int) (err error) { - if subAmt.LT(sdk.ZeroInt()) { - return errors.New("can't subtract a negative amount") - } - - index, poolAsset, err := pool.getPoolAssetAndIndex(assetDenom) - if err != nil { - return err - } - - // Update the supply of the asset - poolAsset.Token.Amount = poolAsset.Token.Amount.Sub(subAmt) - if poolAsset.Token.Amount.LT(sdk.ZeroInt()) { - return errors.New("can't set the pool's balance of a token to be zero or negative") - } - pool.PoolAssets[index] = poolAsset - return nil -} diff --git a/x/spot/types/pool_asset_test.go b/x/spot/types/pool_asset_test.go deleted file mode 100644 index 780656d21..000000000 --- a/x/spot/types/pool_asset_test.go +++ /dev/null @@ -1,118 +0,0 @@ -package types - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common" -) - -func TestPoolAssetValidateError(t *testing.T) { - tests := []struct { - name string - pa PoolAsset - errMsg string - }{ - { - name: "coin amount too little", - pa: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 0), - Weight: sdk.OneInt(), - }, - errMsg: "can't add the zero or negative balance of token", - }, - { - name: "weight too little", - pa: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 1), - Weight: sdk.ZeroInt(), - }, - errMsg: "can't add the zero or negative balance of token", - }, - { - name: "weight too high", - pa: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 1), - Weight: sdk.NewInt(1 << 50), - }, - errMsg: "a token's weight in the pool must be less than 1^50", - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - require.Errorf(t, tc.pa.Validate(), tc.errMsg) - }) - } -} - -func TestPoolAssetValidateSuccess(t *testing.T) { - tests := []struct { - name string - pa PoolAsset - }{ - { - name: "successful validation", - pa: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 1), - Weight: sdk.OneInt(), - }, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - require.NoError(t, tc.pa.Validate()) - }) - } -} - -func TestSubtractPoolAssetBalance(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokenDenom string - subAmt sdkmath.Int - expectedCoins sdk.Coins - }{ - { - name: "subtract liquidity", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1*common.TO_MICRO), - }, - }, - }, - tokenDenom: "aaa", - subAmt: sdk.NewInt(1_000), - expectedCoins: sdk.NewCoins(sdk.NewInt64Coin("aaa", 999_000)), - }, - { - name: "subtract all liquidity", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1*common.TO_MICRO), - }, - }, - }, - tokenDenom: "aaa", - subAmt: sdk.NewInt(1 * common.TO_MICRO), - expectedCoins: sdk.NewCoins(), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - require.NoError(t, tc.pool.SubtractPoolAssetBalance(tc.tokenDenom, tc.subAmt)) - actualCoins := tc.pool.PoolBalances() - require.Equal(t, tc.expectedCoins, actualCoins) - }) - } -} diff --git a/x/spot/types/pool_test.go b/x/spot/types/pool_test.go deleted file mode 100644 index a8b54b3e0..000000000 --- a/x/spot/types/pool_test.go +++ /dev/null @@ -1,987 +0,0 @@ -package types - -import ( - "encoding/csv" - "encoding/json" - fmt "fmt" - "log" - "os" - "strconv" - "testing" - - sdkmath "cosmossdk.io/math" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/testutil" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestGetPoolShareBaseDenom(t *testing.T) { - require.Equal(t, "nibiru/pool/123", GetPoolShareBaseDenom(123)) -} - -func TestGetPoolShareDisplayDenom(t *testing.T) { - require.Equal(t, "NIBIRU-POOL-123", GetPoolShareDisplayDenom(123)) -} - -func TestGetAddress(t *testing.T) { - tests := []struct { - name string - pool Pool - expectPanic bool - }{ - { - name: "empty address", - pool: Pool{ - Address: "", - }, - expectPanic: true, - }, - { - name: "invalid address", - pool: Pool{ - Address: "asdf", - }, - expectPanic: true, - }, - { - name: "valid address", - pool: Pool{ - Address: testutil.AccAddress().String(), - }, - expectPanic: false, - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - if tc.expectPanic { - require.Panics(t, func() { - tc.pool.GetAddress() - }) - } else { - require.NotPanics(t, func() { - tc.pool.GetAddress() - }) - } - }) - } -} - -func TestMinSharesInForTokensOut(t *testing.T) { - poolAccountAddr := testutil.AccAddress() - poolParams := PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - } - poolAssets := []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 123124124124), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 13224112312124124), - Weight: sdk.OneInt(), - }, - } - - pool, err := NewPool(1 /*=poold*/, poolAccountAddr, poolParams, poolAssets) - require.NoError(t, err) - - tokenOut, _, err := pool.TokensOutFromPoolSharesIn(pool.MinSharesInForTokensOut()) - require.NoError(t, err) - require.True(t, tokenOut.IsValid()) -} - -func TestNewPool(t *testing.T) { - poolAccountAddr := testutil.AccAddress() - poolParams := PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - } - poolAssets := []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - } - - pool, err := NewPool(1 /*=poold*/, poolAccountAddr, poolParams, poolAssets) - require.NoError(t, err) - require.Equal(t, Pool{ - Id: 1, - Address: poolAccountAddr.String(), - PoolParams: poolParams, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalWeight: sdk.NewInt(2 << 30), - TotalShares: sdk.NewCoin("nibiru/pool/1", sdkmath.NewIntWithDecimal(100, 18)), - }, pool) -} - -func TestJoinPoolHappyPath(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokensIn sdk.Coins - expectedNumShares sdkmath.Int - expectedRemCoins sdk.Coins - expectedPool Pool - }{ - { - name: "all coins deposited", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 20), - ), - expectedNumShares: sdk.NewInt(10), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 110), - }, - { - Token: sdk.NewInt64Coin("bbb", 220), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 110), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - }, - { - name: "all coins deposited - stableswap", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_STABLESWAP}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 20), - ), - expectedNumShares: sdk.NewInt(10), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 110), - }, - { - Token: sdk.NewInt64Coin("bbb", 220), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 110), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_STABLESWAP}, - }, - }, - { - name: "partial coins deposited", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 10), - ), - expectedNumShares: sdk.NewInt(5), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 5), - ), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 105), - }, - { - Token: sdk.NewInt64Coin("bbb", 210), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 105), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - }, - { - name: "difficult numbers", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_498_579), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_403_945), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1*common.TO_MICRO), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 4859), // 0.138885 % of pool - sdk.NewInt64Coin("bbb", 1345), // 0.09580147 % of pool - ), - expectedNumShares: sdk.NewInt(958), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 1507), - ), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_501_931), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_405_290), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1_000_958), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_BALANCER}, - }, - }, - { - name: "difficult numbers ~ stableswap", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_498_579), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_403_945), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1*common.TO_MICRO), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_STABLESWAP}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 4859), // 0.138885 % of pool - sdk.NewInt64Coin("bbb", 1345), // 0.09580147 % of pool - ), - expectedRemCoins: sdk.NewCoins(), - expectedNumShares: sdk.NewInt(1264), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_503_438), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_405_290), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1_001_264), - PoolParams: PoolParams{A: sdk.NewInt(100), PoolType: PoolType_STABLESWAP}, - }, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - numShares, remCoins, err := tc.pool.AddTokensToPool(tc.tokensIn) - require.NoError(t, err) - require.Equal(t, tc.expectedNumShares.String(), numShares.String()) - require.Equal(t, tc.expectedRemCoins.String(), remCoins.String()) - require.Equal(t, tc.expectedPool.String(), tc.pool.String()) - }) - } -} - -func TestJoinPoolAllTokens(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokensIn sdk.Coins - expectedNumShares sdkmath.Int - expectedRemCoins sdk.Coins - expectedPool Pool - }{ - { - name: "all coins deposited", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 20), - ), - expectedNumShares: sdk.NewInt(10), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 110), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 220), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 110), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - }, - { - name: "partial coins deposited", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 10), - ), - expectedNumShares: sdk.NewInt(7), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 110), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 210), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 107), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - }, - { - name: "difficult numbers", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_498_579), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_403_945), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1*common.TO_MICRO), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 4_859), // 0.138885 % of pool - sdk.NewInt64Coin("bbb", 1_345), // 0.09580147 % of pool - ), - expectedNumShares: sdk.NewInt(1173), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_503_438), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_405_290), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1_001_173), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - }, - { - name: "difficult numbers - single asset join", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_498_579), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_403_945), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1*common.TO_MICRO), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 4_859), // 0.138885 % of pool - ), - expectedNumShares: sdk.NewInt(694), - expectedRemCoins: sdk.NewCoins(), - expectedPool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3_503_438), - Weight: sdk.NewInt(1 << 30), - }, - { - Token: sdk.NewInt64Coin("bbb", 1_403_945), - Weight: sdk.NewInt(1 << 30), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1_000_694), - TotalWeight: sdk.NewInt(2 << 30), - PoolParams: PoolParams{PoolType: PoolType_BALANCER, SwapFee: sdk.ZeroDec()}, - }, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - numShares, remCoins, err := tc.pool.AddAllTokensToPool(tc.tokensIn) - require.NoError(t, err) - require.Equal(t, tc.expectedNumShares, numShares) - require.Equal(t, tc.expectedRemCoins, remCoins) - require.Equal(t, tc.expectedPool, tc.pool) - }) - } -} - -func TestExitPoolError(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - exitingShares sdk.Coin - expectedCoins sdk.Coins - expectedRemainingShares sdk.Coin - expectedExitedCoins sdk.Coins - }{ - { - name: "all coins withdrawn, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1000000), - }, - { - Token: sdk.NewInt64Coin("bbb", 2000000), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 10000000000000), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.ZeroDec(), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 0), - expectedCoins: nil, - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 200), - ), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - _, _, err := tc.pool.ExitPool(sdk.OneInt()) - require.Error(t, err) - expectedErrorMsg := fmt.Sprintf("not enough pool shares to withdraw - please provide at least %v shares", tc.pool.MinSharesInForTokensOut()) - require.Contains(t, err.Error(), expectedErrorMsg) - - _, _, err = tc.pool.ExitPool(tc.pool.MinSharesInForTokensOut()) - require.NoError(t, err) - }) - } -} - -func TestExitPoolHappyPath(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - exitingShares sdk.Coin - expectedCoins sdk.Coins - expectedRemainingShares sdk.Coin - expectedExitedCoins sdk.Coins - expectedFees sdk.Coins - }{ - { - name: "all coins withdrawn, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.ZeroDec(), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 0), - expectedCoins: sdk.NewCoins(), - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 200), - ), - expectedFees: sdk.NewCoins( - sdk.NewCoin("aaa", sdk.ZeroInt()), - sdk.NewCoin("bbb", sdk.ZeroInt()), - ), - }, - { - name: "all coins withdrawn, exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.MustNewDecFromStr("0.5"), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 0), - expectedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - }, - { - name: "some coins withdrawn, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.ZeroDec(), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - expectedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - expectedFees: sdk.NewCoins( - sdk.NewCoin("aaa", sdk.ZeroInt()), - sdk.NewCoin("bbb", sdk.ZeroInt()), - ), - }, - { - name: "some coins withdrawn, exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.MustNewDecFromStr("0.5"), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - expectedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 75), - sdk.NewInt64Coin("bbb", 150), - ), - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 25), - sdk.NewInt64Coin("bbb", 50), - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 25), - sdk.NewInt64Coin("bbb", 50), - ), - }, - { - name: "real numbers", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 34_586_245), - }, - { - Token: sdk.NewInt64Coin("bbb", 65_469_884), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 2_347_652), - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - ExitFee: sdk.MustNewDecFromStr("0.003"), - }, - }, - exitingShares: sdk.NewInt64Coin("nibiru/pool/1", 74_747), - expectedRemainingShares: sdk.NewInt64Coin("nibiru/pool/1", 2_272_905), - expectedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 33_488_356), - sdk.NewInt64Coin("bbb", 63_391_639), - ), - expectedExitedCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 1_097_889), - sdk.NewInt64Coin("bbb", 2_078_245), - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 3304), - sdk.NewInt64Coin("bbb", 6253), - ), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - exitedCoins, fees, err := tc.pool.ExitPool(tc.exitingShares.Amount) - require.NoError(t, err) - require.Equal(t, tc.expectedCoins, tc.pool.PoolBalances()) - // Comparing zero initialized sdk.Int with zero value sdk.Int leads to different results - if tc.expectedRemainingShares.IsZero() { - require.True(t, tc.pool.TotalShares.IsZero()) - } else { - require.Equal(t, tc.expectedRemainingShares, tc.pool.TotalShares) - } - require.Equal(t, tc.expectedExitedCoins, exitedCoins) - require.Equal(t, tc.expectedFees, fees) - }) - } -} - -// helper function to create dummy test pools -func MockPool(assets []PoolAsset) Pool { - return Pool{ - Id: 1, - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.SmallestDec(), - ExitFee: sdk.SmallestDec(), - }, - PoolAssets: assets, - TotalShares: sdk.NewInt64Coin(GetPoolShareBaseDenom(1), 100), - TotalWeight: sdk.NewInt(2), - } -} - -func TestUpdatePoolAssetTokens(t *testing.T) { - for _, tc := range []struct { - name string - poolAssets []PoolAsset - newAssets []sdk.Coin - expectedPoolAssets []PoolAsset - }{ - { - name: "update pool asset balances", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - newAssets: []sdk.Coin{ - sdk.NewInt64Coin("aaa", 150), - sdk.NewInt64Coin("bbb", 125), - }, - expectedPoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 150), - }, - { - Token: sdk.NewInt64Coin("bbb", 125), - }, - }, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - pool := MockPool(tc.poolAssets) - require.NoError(t, pool.updatePoolAssetBalances(tc.newAssets...)) - require.Equal(t, tc.expectedPoolAssets, pool.PoolAssets) - }) - } -} - -func TestGetD(t *testing.T) { - for _, tc := range []struct { - name string - poolAssets []PoolAsset - amplificationParameter sdkmath.Int - expectedErr error - expectedD uint64 - }{ - { - name: "Compute D - 3 assets - tested against Curve contracts code..", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 200), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - { - Token: sdk.NewInt64Coin("ccc", 100), - }, - }, - amplificationParameter: sdk.OneInt(), - expectedErr: nil, - expectedD: 397, - }, - { - name: "Compute D - 2 assets - tested against Curve contracts code..", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 200), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - amplificationParameter: sdk.OneInt(), - expectedErr: nil, - expectedD: 294, - }, - { - name: "Compute D - 2 assets, A big - tested against Curve contracts code..", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 200), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - amplificationParameter: sdk.NewInt(4000), - expectedErr: nil, - expectedD: 299, - }, - { - name: "Compute D - 2 assets, A big, high values - tested against Curve contracts code..", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 200*common.TO_MICRO), - }, - { - Token: sdk.NewInt64Coin("bbb", 100*common.TO_MICRO), - }, - }, - amplificationParameter: sdk.NewInt(4000), - expectedErr: nil, - expectedD: 299997656, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - PoolAssets: tc.poolAssets, - PoolParams: PoolParams{A: tc.amplificationParameter}, - } - - D, err := pool.GetD(pool.PoolAssets) - require.NoError(t, err) - require.EqualValues(t, fmt.Sprint(tc.expectedD), fmt.Sprint(D.Uint64())) - }) - } -} - -type TestCaseDy struct { - balance []uint64 - amplification sdkmath.Int - send int - receive int - dx sdkmath.Int - expectedDy sdkmath.Int -} - -/* -createTestCases reads the data from the csv file generated with the python curve model and load them into a TestCaseDy -object. - -Columns schema of the file: - - balances: the balance of the pool - - amplification: the amplification parameter for the pool - - send: the id of the token sent to the pool for the swap - - recv: the id of the token expected out of the pool - - dx: the number of token sent for the swap - - dy: the expected number of token from the curve python model. -*/ -func createTestCases(data [][]string) (testCases []TestCaseDy, err error) { - for i, line := range data { - if i > 0 { // omit header line - var rec TestCaseDy - - err := json.Unmarshal([]byte(line[0]), &rec.balance) - if err != nil { - return testCases, err - } - - amplification, err := strconv.ParseInt(line[1], 10, 64) - if err != nil { - return testCases, err - } - - rec.amplification = sdk.NewInt(amplification) - - rec.send, _ = strconv.Atoi(line[2]) - rec.receive, _ = strconv.Atoi(line[3]) - - dx, err := strconv.ParseInt(line[4], 10, 64) - if err != nil { - return testCases, err - } - - expectedDy, err := strconv.ParseInt(line[5], 10, 64) - if err != nil { - return testCases, err - } - - rec.dx = sdk.NewInt(dx) - rec.expectedDy = sdk.NewInt(expectedDy) - - testCases = append(testCases, rec) - } - } - return testCases, nil -} - -func TestSolveStableswapInvariant(t *testing.T) { - t.Run("Test csv file", func(t *testing.T) { - f, err := os.Open("misc/stabletests.csv") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - // read csv values using csv.Reader - csvReader := csv.NewReader(f) - data, err := csvReader.ReadAll() - if err != nil { - log.Fatal(err) - } - - testCases, err := createTestCases(data) - if err != nil { - log.Fatal(err) - } - - for _, tc := range testCases { - tc := tc - - var poolAssets []PoolAsset - - for i, balance := range tc.balance { - poolAssets = append(poolAssets, PoolAsset{Token: sdk.NewCoin("token"+strconv.Itoa(i), sdk.NewIntFromUint64(balance))}) - } - - pool := Pool{ - PoolAssets: poolAssets, - PoolParams: PoolParams{A: tc.amplification}, - } - denomIn := "token" + strconv.Itoa(tc.send) - denomOut := "token" + strconv.Itoa(tc.receive) - - _, poolAssetIn, err := pool.getPoolAssetAndIndex(denomIn) - require.NoError(t, err) - - dy, err := pool.SolveStableswapInvariant( - /* tokenIn = */ sdk.NewCoin(denomIn, tc.dx).Add(poolAssetIn.Token), - /* tokenOutDenom = */ denomOut, - ) - require.NoError(t, err) - - _, poolAssetOut, err := pool.getPoolAssetAndIndex(denomOut) - require.NoError(t, err) - - require.NoError(t, err) - require.Equal(t, tc.expectedDy, poolAssetOut.Token.Amount.Sub(dy)) - } - }) -} diff --git a/x/spot/types/price.go b/x/spot/types/price.go deleted file mode 100644 index e07cbcab5..000000000 --- a/x/spot/types/price.go +++ /dev/null @@ -1,22 +0,0 @@ -package types - -import sdk "github.com/cosmos/cosmos-sdk/types" - -// CalcSpotPrice calculates the spot price based on weight. -// spotPrice = (BalanceIn / WeightIn) / (BalanceOut / WeightOut) -func (pool Pool) CalcSpotPrice(tokenIn, tokenOut string) (sdk.Dec, error) { - _, poolAssetIn, err := pool.getPoolAssetAndIndex(tokenIn) - if err != nil { - return sdk.Dec{}, err - } - - _, poolAssetOut, err := pool.getPoolAssetAndIndex(tokenOut) - if err != nil { - return sdk.Dec{}, err - } - - weightedBalanceIn := sdk.NewDecFromInt(poolAssetIn.Token.Amount).Quo(sdk.NewDecFromInt(poolAssetIn.Weight)) - weightedBalanceOut := sdk.NewDecFromInt(poolAssetOut.Token.Amount).Quo(sdk.NewDecFromInt(poolAssetOut.Weight)) - - return weightedBalanceIn.Quo(weightedBalanceOut), nil -} diff --git a/x/spot/types/price_test.go b/x/spot/types/price_test.go deleted file mode 100644 index f64d20a7f..000000000 --- a/x/spot/types/price_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package types - -import ( - "testing" - - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/testutil" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestCalSpotPrice(t *testing.T) { - tests := []struct { - name string - poolAssets []PoolAsset - expectedPrice sdk.Dec - }{ - { - "equal weight: 2 tokens", - []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 2*common.TO_MICRO), - Weight: sdk.NewInt(100), - }, - { - Token: sdk.NewInt64Coin("bar", 1*common.TO_MICRO), - Weight: sdk.NewInt(100), - }, - }, - sdk.MustNewDecFromStr("2"), - }, - { - "different weight: 2 tokens", - []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 2*common.TO_MICRO), - Weight: sdk.NewInt(80), - }, - { - Token: sdk.NewInt64Coin("bar", 1*common.TO_MICRO), - Weight: sdk.NewInt(20), - }, - }, - sdk.MustNewDecFromStr("0.5"), - }, - { - "equal weight: 3 tokens", - []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 2*common.TO_MICRO), - Weight: sdk.NewInt(100), - }, - { - Token: sdk.NewInt64Coin("goo", 1*common.TO_MICRO), - Weight: sdk.NewInt(100), - }, - { - Token: sdk.NewInt64Coin("bar", 1*common.TO_MICRO), - Weight: sdk.NewInt(100), - }, - }, - sdk.MustNewDecFromStr("2"), - }, - { - "different weight: 3 tokens", - []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 2*common.TO_MICRO), - Weight: sdk.NewInt(60), - }, - { - Token: sdk.NewInt64Coin("bar", 1*common.TO_MICRO), - Weight: sdk.NewInt(20), - }, - { - Token: sdk.NewInt64Coin("foobar", 1*common.TO_MICRO), - Weight: sdk.NewInt(20), - }, - }, - sdk.MustNewDecFromStr("0.666666666666666667"), - }, - } - - for _, tc := range tests { - tc := tc - t.Run(tc.name, func(t *testing.T) { - poolAccountAddr := testutil.AccAddress() - poolParams := PoolParams{ - SwapFee: sdk.NewDecWithPrec(3, 2), - ExitFee: sdk.NewDecWithPrec(3, 2), - PoolType: PoolType_BALANCER, - } - - pool, err := NewPool(1, poolAccountAddr, poolParams, tc.poolAssets) - require.NoError(t, err) - - actualPrice, err := pool.CalcSpotPrice(tc.poolAssets[0].Token.Denom, tc.poolAssets[1].Token.Denom) - require.NoError(t, err) - - require.Equal(t, tc.expectedPrice, actualPrice) - }) - } -} diff --git a/x/spot/types/query.pb.go b/x/spot/types/query.pb.go deleted file mode 100644 index e7e5041ce..000000000 --- a/x/spot/types/query.pb.go +++ /dev/null @@ -1,6584 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - query "github.com/cosmos/cosmos-sdk/types/query" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params holds all the parameters of this module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -type QueryPoolNumberRequest struct { -} - -func (m *QueryPoolNumberRequest) Reset() { *m = QueryPoolNumberRequest{} } -func (m *QueryPoolNumberRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPoolNumberRequest) ProtoMessage() {} -func (*QueryPoolNumberRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{2} -} -func (m *QueryPoolNumberRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolNumberRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolNumberRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolNumberRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolNumberRequest.Merge(m, src) -} -func (m *QueryPoolNumberRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolNumberRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolNumberRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolNumberRequest proto.InternalMessageInfo - -type QueryPoolNumberResponse struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryPoolNumberResponse) Reset() { *m = QueryPoolNumberResponse{} } -func (m *QueryPoolNumberResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPoolNumberResponse) ProtoMessage() {} -func (*QueryPoolNumberResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{3} -} -func (m *QueryPoolNumberResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolNumberResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolNumberResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolNumberResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolNumberResponse.Merge(m, src) -} -func (m *QueryPoolNumberResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolNumberResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolNumberResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolNumberResponse proto.InternalMessageInfo - -func (m *QueryPoolNumberResponse) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryPoolRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryPoolRequest) Reset() { *m = QueryPoolRequest{} } -func (m *QueryPoolRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPoolRequest) ProtoMessage() {} -func (*QueryPoolRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{4} -} -func (m *QueryPoolRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolRequest.Merge(m, src) -} -func (m *QueryPoolRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolRequest proto.InternalMessageInfo - -func (m *QueryPoolRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryPoolResponse struct { - Pool *Pool `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` -} - -func (m *QueryPoolResponse) Reset() { *m = QueryPoolResponse{} } -func (m *QueryPoolResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPoolResponse) ProtoMessage() {} -func (*QueryPoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{5} -} -func (m *QueryPoolResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolResponse.Merge(m, src) -} -func (m *QueryPoolResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolResponse proto.InternalMessageInfo - -func (m *QueryPoolResponse) GetPool() *Pool { - if m != nil { - return m.Pool - } - return nil -} - -type QueryPoolsRequest struct { - // pagination defines an optional pagination for the request. - Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryPoolsRequest) Reset() { *m = QueryPoolsRequest{} } -func (m *QueryPoolsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPoolsRequest) ProtoMessage() {} -func (*QueryPoolsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{6} -} -func (m *QueryPoolsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolsRequest.Merge(m, src) -} -func (m *QueryPoolsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolsRequest proto.InternalMessageInfo - -func (m *QueryPoolsRequest) GetPagination() *query.PageRequest { - if m != nil { - return m.Pagination - } - return nil -} - -type QueryPoolsResponse struct { - Pools []*Pool `protobuf:"bytes,1,rep,name=pools,proto3" json:"pools,omitempty"` - // pagination defines the pagination in the response. - Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} - -func (m *QueryPoolsResponse) Reset() { *m = QueryPoolsResponse{} } -func (m *QueryPoolsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPoolsResponse) ProtoMessage() {} -func (*QueryPoolsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{7} -} -func (m *QueryPoolsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolsResponse.Merge(m, src) -} -func (m *QueryPoolsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolsResponse proto.InternalMessageInfo - -func (m *QueryPoolsResponse) GetPools() []*Pool { - if m != nil { - return m.Pools - } - return nil -} - -func (m *QueryPoolsResponse) GetPagination() *query.PageResponse { - if m != nil { - return m.Pagination - } - return nil -} - -type QueryPoolParamsRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryPoolParamsRequest) Reset() { *m = QueryPoolParamsRequest{} } -func (m *QueryPoolParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPoolParamsRequest) ProtoMessage() {} -func (*QueryPoolParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{8} -} -func (m *QueryPoolParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolParamsRequest.Merge(m, src) -} -func (m *QueryPoolParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolParamsRequest proto.InternalMessageInfo - -func (m *QueryPoolParamsRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryPoolParamsResponse struct { - PoolParams *PoolParams `protobuf:"bytes,1,opt,name=pool_params,json=poolParams,proto3" json:"pool_params,omitempty"` -} - -func (m *QueryPoolParamsResponse) Reset() { *m = QueryPoolParamsResponse{} } -func (m *QueryPoolParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPoolParamsResponse) ProtoMessage() {} -func (*QueryPoolParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{9} -} -func (m *QueryPoolParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPoolParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPoolParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPoolParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPoolParamsResponse.Merge(m, src) -} -func (m *QueryPoolParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPoolParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPoolParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPoolParamsResponse proto.InternalMessageInfo - -func (m *QueryPoolParamsResponse) GetPoolParams() *PoolParams { - if m != nil { - return m.PoolParams - } - return nil -} - -type QueryNumPoolsRequest struct { -} - -func (m *QueryNumPoolsRequest) Reset() { *m = QueryNumPoolsRequest{} } -func (m *QueryNumPoolsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryNumPoolsRequest) ProtoMessage() {} -func (*QueryNumPoolsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{10} -} -func (m *QueryNumPoolsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryNumPoolsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryNumPoolsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryNumPoolsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryNumPoolsRequest.Merge(m, src) -} -func (m *QueryNumPoolsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryNumPoolsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryNumPoolsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryNumPoolsRequest proto.InternalMessageInfo - -type QueryNumPoolsResponse struct { - NumPools uint64 `protobuf:"varint,1,opt,name=num_pools,json=numPools,proto3" json:"num_pools,omitempty"` -} - -func (m *QueryNumPoolsResponse) Reset() { *m = QueryNumPoolsResponse{} } -func (m *QueryNumPoolsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryNumPoolsResponse) ProtoMessage() {} -func (*QueryNumPoolsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{11} -} -func (m *QueryNumPoolsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryNumPoolsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryNumPoolsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryNumPoolsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryNumPoolsResponse.Merge(m, src) -} -func (m *QueryNumPoolsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryNumPoolsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryNumPoolsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryNumPoolsResponse proto.InternalMessageInfo - -func (m *QueryNumPoolsResponse) GetNumPools() uint64 { - if m != nil { - return m.NumPools - } - return 0 -} - -// -------------------------------------------- -// Query total liquidity the protocol -type QueryTotalLiquidityRequest struct { -} - -func (m *QueryTotalLiquidityRequest) Reset() { *m = QueryTotalLiquidityRequest{} } -func (m *QueryTotalLiquidityRequest) String() string { return proto.CompactTextString(m) } -func (*QueryTotalLiquidityRequest) ProtoMessage() {} -func (*QueryTotalLiquidityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{12} -} -func (m *QueryTotalLiquidityRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalLiquidityRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalLiquidityRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalLiquidityRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalLiquidityRequest.Merge(m, src) -} -func (m *QueryTotalLiquidityRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalLiquidityRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalLiquidityRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalLiquidityRequest proto.InternalMessageInfo - -type QueryTotalLiquidityResponse struct { - Liquidity github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=liquidity,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"liquidity" yaml:"liquidity"` -} - -func (m *QueryTotalLiquidityResponse) Reset() { *m = QueryTotalLiquidityResponse{} } -func (m *QueryTotalLiquidityResponse) String() string { return proto.CompactTextString(m) } -func (*QueryTotalLiquidityResponse) ProtoMessage() {} -func (*QueryTotalLiquidityResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{13} -} -func (m *QueryTotalLiquidityResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalLiquidityResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalLiquidityResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalLiquidityResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalLiquidityResponse.Merge(m, src) -} -func (m *QueryTotalLiquidityResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalLiquidityResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalLiquidityResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalLiquidityResponse proto.InternalMessageInfo - -func (m *QueryTotalLiquidityResponse) GetLiquidity() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.Liquidity - } - return nil -} - -// -------------------------------------------- -// Query total liquidity for a pool -type QueryTotalPoolLiquidityRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryTotalPoolLiquidityRequest) Reset() { *m = QueryTotalPoolLiquidityRequest{} } -func (m *QueryTotalPoolLiquidityRequest) String() string { return proto.CompactTextString(m) } -func (*QueryTotalPoolLiquidityRequest) ProtoMessage() {} -func (*QueryTotalPoolLiquidityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{14} -} -func (m *QueryTotalPoolLiquidityRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalPoolLiquidityRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalPoolLiquidityRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalPoolLiquidityRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalPoolLiquidityRequest.Merge(m, src) -} -func (m *QueryTotalPoolLiquidityRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalPoolLiquidityRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalPoolLiquidityRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalPoolLiquidityRequest proto.InternalMessageInfo - -func (m *QueryTotalPoolLiquidityRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryTotalPoolLiquidityResponse struct { - Liquidity github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=liquidity,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"liquidity" yaml:"liquidity"` -} - -func (m *QueryTotalPoolLiquidityResponse) Reset() { *m = QueryTotalPoolLiquidityResponse{} } -func (m *QueryTotalPoolLiquidityResponse) String() string { return proto.CompactTextString(m) } -func (*QueryTotalPoolLiquidityResponse) ProtoMessage() {} -func (*QueryTotalPoolLiquidityResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{15} -} -func (m *QueryTotalPoolLiquidityResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalPoolLiquidityResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalPoolLiquidityResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalPoolLiquidityResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalPoolLiquidityResponse.Merge(m, src) -} -func (m *QueryTotalPoolLiquidityResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalPoolLiquidityResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalPoolLiquidityResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalPoolLiquidityResponse proto.InternalMessageInfo - -func (m *QueryTotalPoolLiquidityResponse) GetLiquidity() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.Liquidity - } - return nil -} - -type QueryTotalSharesRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryTotalSharesRequest) Reset() { *m = QueryTotalSharesRequest{} } -func (m *QueryTotalSharesRequest) String() string { return proto.CompactTextString(m) } -func (*QueryTotalSharesRequest) ProtoMessage() {} -func (*QueryTotalSharesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{16} -} -func (m *QueryTotalSharesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalSharesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalSharesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalSharesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalSharesRequest.Merge(m, src) -} -func (m *QueryTotalSharesRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalSharesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalSharesRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalSharesRequest proto.InternalMessageInfo - -func (m *QueryTotalSharesRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryTotalSharesResponse struct { - // sum of all LP tokens sent out - TotalShares types.Coin `protobuf:"bytes,1,opt,name=total_shares,json=totalShares,proto3" json:"total_shares" yaml:"total_shares"` -} - -func (m *QueryTotalSharesResponse) Reset() { *m = QueryTotalSharesResponse{} } -func (m *QueryTotalSharesResponse) String() string { return proto.CompactTextString(m) } -func (*QueryTotalSharesResponse) ProtoMessage() {} -func (*QueryTotalSharesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{17} -} -func (m *QueryTotalSharesResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryTotalSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryTotalSharesResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryTotalSharesResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryTotalSharesResponse.Merge(m, src) -} -func (m *QueryTotalSharesResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryTotalSharesResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryTotalSharesResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryTotalSharesResponse proto.InternalMessageInfo - -func (m *QueryTotalSharesResponse) GetTotalShares() types.Coin { - if m != nil { - return m.TotalShares - } - return types.Coin{} -} - -// Returns the amount of tokenInDenom to produce 1 tokenOutDenom -// For example, if the price of NIBI = 9.123 NUSD, then setting -// tokenInDenom=NUSD and tokenOutDenom=NIBI would give "9.123". -type QuerySpotPriceRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` - // the denomination of the token you are giving into the pool - TokenInDenom string `protobuf:"bytes,2,opt,name=token_in_denom,json=tokenInDenom,proto3" json:"token_in_denom,omitempty"` - // the denomination of the token you are taking out of the pool - TokenOutDenom string `protobuf:"bytes,3,opt,name=token_out_denom,json=tokenOutDenom,proto3" json:"token_out_denom,omitempty"` -} - -func (m *QuerySpotPriceRequest) Reset() { *m = QuerySpotPriceRequest{} } -func (m *QuerySpotPriceRequest) String() string { return proto.CompactTextString(m) } -func (*QuerySpotPriceRequest) ProtoMessage() {} -func (*QuerySpotPriceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{18} -} -func (m *QuerySpotPriceRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySpotPriceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySpotPriceRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySpotPriceRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySpotPriceRequest.Merge(m, src) -} -func (m *QuerySpotPriceRequest) XXX_Size() int { - return m.Size() -} -func (m *QuerySpotPriceRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySpotPriceRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySpotPriceRequest proto.InternalMessageInfo - -func (m *QuerySpotPriceRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *QuerySpotPriceRequest) GetTokenInDenom() string { - if m != nil { - return m.TokenInDenom - } - return "" -} - -func (m *QuerySpotPriceRequest) GetTokenOutDenom() string { - if m != nil { - return m.TokenOutDenom - } - return "" -} - -type QuerySpotPriceResponse struct { - SpotPrice string `protobuf:"bytes,1,opt,name=spot_price,json=spotPrice,proto3" json:"spot_price,omitempty"` -} - -func (m *QuerySpotPriceResponse) Reset() { *m = QuerySpotPriceResponse{} } -func (m *QuerySpotPriceResponse) String() string { return proto.CompactTextString(m) } -func (*QuerySpotPriceResponse) ProtoMessage() {} -func (*QuerySpotPriceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{19} -} -func (m *QuerySpotPriceResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySpotPriceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySpotPriceResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySpotPriceResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySpotPriceResponse.Merge(m, src) -} -func (m *QuerySpotPriceResponse) XXX_Size() int { - return m.Size() -} -func (m *QuerySpotPriceResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySpotPriceResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySpotPriceResponse proto.InternalMessageInfo - -func (m *QuerySpotPriceResponse) GetSpotPrice() string { - if m != nil { - return m.SpotPrice - } - return "" -} - -// Given an exact amount of tokens in and a target tokenOutDenom, calculates -// the expected amount of tokens out received from a swap. -type QuerySwapExactAmountInRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` - TokenIn types.Coin `protobuf:"bytes,2,opt,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` - TokenOutDenom string `protobuf:"bytes,3,opt,name=token_out_denom,json=tokenOutDenom,proto3" json:"token_out_denom,omitempty"` -} - -func (m *QuerySwapExactAmountInRequest) Reset() { *m = QuerySwapExactAmountInRequest{} } -func (m *QuerySwapExactAmountInRequest) String() string { return proto.CompactTextString(m) } -func (*QuerySwapExactAmountInRequest) ProtoMessage() {} -func (*QuerySwapExactAmountInRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{20} -} -func (m *QuerySwapExactAmountInRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySwapExactAmountInRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySwapExactAmountInRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySwapExactAmountInRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySwapExactAmountInRequest.Merge(m, src) -} -func (m *QuerySwapExactAmountInRequest) XXX_Size() int { - return m.Size() -} -func (m *QuerySwapExactAmountInRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySwapExactAmountInRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySwapExactAmountInRequest proto.InternalMessageInfo - -func (m *QuerySwapExactAmountInRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *QuerySwapExactAmountInRequest) GetTokenIn() types.Coin { - if m != nil { - return m.TokenIn - } - return types.Coin{} -} - -func (m *QuerySwapExactAmountInRequest) GetTokenOutDenom() string { - if m != nil { - return m.TokenOutDenom - } - return "" -} - -type QuerySwapExactAmountInResponse struct { - TokenOut types.Coin `protobuf:"bytes,2,opt,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` - Fee types.Coin `protobuf:"bytes,3,opt,name=fee,proto3" json:"fee" yaml:"fee"` -} - -func (m *QuerySwapExactAmountInResponse) Reset() { *m = QuerySwapExactAmountInResponse{} } -func (m *QuerySwapExactAmountInResponse) String() string { return proto.CompactTextString(m) } -func (*QuerySwapExactAmountInResponse) ProtoMessage() {} -func (*QuerySwapExactAmountInResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{21} -} -func (m *QuerySwapExactAmountInResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySwapExactAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySwapExactAmountInResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySwapExactAmountInResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySwapExactAmountInResponse.Merge(m, src) -} -func (m *QuerySwapExactAmountInResponse) XXX_Size() int { - return m.Size() -} -func (m *QuerySwapExactAmountInResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySwapExactAmountInResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySwapExactAmountInResponse proto.InternalMessageInfo - -func (m *QuerySwapExactAmountInResponse) GetTokenOut() types.Coin { - if m != nil { - return m.TokenOut - } - return types.Coin{} -} - -func (m *QuerySwapExactAmountInResponse) GetFee() types.Coin { - if m != nil { - return m.Fee - } - return types.Coin{} -} - -// Given an exact amount of tokens out and a target tokenInDenom, calculates -// the expected amount of tokens in required to do the swap. -type QuerySwapExactAmountOutRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` - TokenOut types.Coin `protobuf:"bytes,2,opt,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` - TokenInDenom string `protobuf:"bytes,3,opt,name=token_in_denom,json=tokenInDenom,proto3" json:"token_in_denom,omitempty"` -} - -func (m *QuerySwapExactAmountOutRequest) Reset() { *m = QuerySwapExactAmountOutRequest{} } -func (m *QuerySwapExactAmountOutRequest) String() string { return proto.CompactTextString(m) } -func (*QuerySwapExactAmountOutRequest) ProtoMessage() {} -func (*QuerySwapExactAmountOutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{22} -} -func (m *QuerySwapExactAmountOutRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySwapExactAmountOutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySwapExactAmountOutRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySwapExactAmountOutRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySwapExactAmountOutRequest.Merge(m, src) -} -func (m *QuerySwapExactAmountOutRequest) XXX_Size() int { - return m.Size() -} -func (m *QuerySwapExactAmountOutRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySwapExactAmountOutRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySwapExactAmountOutRequest proto.InternalMessageInfo - -func (m *QuerySwapExactAmountOutRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *QuerySwapExactAmountOutRequest) GetTokenOut() types.Coin { - if m != nil { - return m.TokenOut - } - return types.Coin{} -} - -func (m *QuerySwapExactAmountOutRequest) GetTokenInDenom() string { - if m != nil { - return m.TokenInDenom - } - return "" -} - -type QuerySwapExactAmountOutResponse struct { - TokenIn types.Coin `protobuf:"bytes,2,opt,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` -} - -func (m *QuerySwapExactAmountOutResponse) Reset() { *m = QuerySwapExactAmountOutResponse{} } -func (m *QuerySwapExactAmountOutResponse) String() string { return proto.CompactTextString(m) } -func (*QuerySwapExactAmountOutResponse) ProtoMessage() {} -func (*QuerySwapExactAmountOutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{23} -} -func (m *QuerySwapExactAmountOutResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySwapExactAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySwapExactAmountOutResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySwapExactAmountOutResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySwapExactAmountOutResponse.Merge(m, src) -} -func (m *QuerySwapExactAmountOutResponse) XXX_Size() int { - return m.Size() -} -func (m *QuerySwapExactAmountOutResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySwapExactAmountOutResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySwapExactAmountOutResponse proto.InternalMessageInfo - -func (m *QuerySwapExactAmountOutResponse) GetTokenIn() types.Coin { - if m != nil { - return m.TokenIn - } - return types.Coin{} -} - -type QueryJoinExactAmountInRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` - TokensIn github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=tokens_in,json=tokensIn,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_in" yaml:"tokens_in"` -} - -func (m *QueryJoinExactAmountInRequest) Reset() { *m = QueryJoinExactAmountInRequest{} } -func (m *QueryJoinExactAmountInRequest) String() string { return proto.CompactTextString(m) } -func (*QueryJoinExactAmountInRequest) ProtoMessage() {} -func (*QueryJoinExactAmountInRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{24} -} -func (m *QueryJoinExactAmountInRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryJoinExactAmountInRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryJoinExactAmountInRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryJoinExactAmountInRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryJoinExactAmountInRequest.Merge(m, src) -} -func (m *QueryJoinExactAmountInRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryJoinExactAmountInRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryJoinExactAmountInRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryJoinExactAmountInRequest proto.InternalMessageInfo - -func (m *QueryJoinExactAmountInRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *QueryJoinExactAmountInRequest) GetTokensIn() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.TokensIn - } - return nil -} - -type QueryJoinExactAmountInResponse struct { - // amount of pool shares returned to user after join - PoolSharesOut github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,1,opt,name=pool_shares_out,json=poolSharesOut,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"pool_shares_out" yaml:"pool_shares_out"` - // coins remaining after pool join - RemCoins github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=rem_coins,json=remCoins,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"rem_coins" yaml:"rem_coins"` -} - -func (m *QueryJoinExactAmountInResponse) Reset() { *m = QueryJoinExactAmountInResponse{} } -func (m *QueryJoinExactAmountInResponse) String() string { return proto.CompactTextString(m) } -func (*QueryJoinExactAmountInResponse) ProtoMessage() {} -func (*QueryJoinExactAmountInResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{25} -} -func (m *QueryJoinExactAmountInResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryJoinExactAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryJoinExactAmountInResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryJoinExactAmountInResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryJoinExactAmountInResponse.Merge(m, src) -} -func (m *QueryJoinExactAmountInResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryJoinExactAmountInResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryJoinExactAmountInResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryJoinExactAmountInResponse proto.InternalMessageInfo - -func (m *QueryJoinExactAmountInResponse) GetRemCoins() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.RemCoins - } - return nil -} - -type QueryJoinExactAmountOutRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryJoinExactAmountOutRequest) Reset() { *m = QueryJoinExactAmountOutRequest{} } -func (m *QueryJoinExactAmountOutRequest) String() string { return proto.CompactTextString(m) } -func (*QueryJoinExactAmountOutRequest) ProtoMessage() {} -func (*QueryJoinExactAmountOutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{26} -} -func (m *QueryJoinExactAmountOutRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryJoinExactAmountOutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryJoinExactAmountOutRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryJoinExactAmountOutRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryJoinExactAmountOutRequest.Merge(m, src) -} -func (m *QueryJoinExactAmountOutRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryJoinExactAmountOutRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryJoinExactAmountOutRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryJoinExactAmountOutRequest proto.InternalMessageInfo - -func (m *QueryJoinExactAmountOutRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryJoinExactAmountOutResponse struct { -} - -func (m *QueryJoinExactAmountOutResponse) Reset() { *m = QueryJoinExactAmountOutResponse{} } -func (m *QueryJoinExactAmountOutResponse) String() string { return proto.CompactTextString(m) } -func (*QueryJoinExactAmountOutResponse) ProtoMessage() {} -func (*QueryJoinExactAmountOutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{27} -} -func (m *QueryJoinExactAmountOutResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryJoinExactAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryJoinExactAmountOutResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryJoinExactAmountOutResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryJoinExactAmountOutResponse.Merge(m, src) -} -func (m *QueryJoinExactAmountOutResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryJoinExactAmountOutResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryJoinExactAmountOutResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryJoinExactAmountOutResponse proto.InternalMessageInfo - -type QueryExitExactAmountInRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` - // amount of pool shares to return to pool - PoolSharesIn github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=pool_shares_in,json=poolSharesIn,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"pool_shares_in" yaml:"pool_shares_in"` -} - -func (m *QueryExitExactAmountInRequest) Reset() { *m = QueryExitExactAmountInRequest{} } -func (m *QueryExitExactAmountInRequest) String() string { return proto.CompactTextString(m) } -func (*QueryExitExactAmountInRequest) ProtoMessage() {} -func (*QueryExitExactAmountInRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{28} -} -func (m *QueryExitExactAmountInRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExitExactAmountInRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExitExactAmountInRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExitExactAmountInRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExitExactAmountInRequest.Merge(m, src) -} -func (m *QueryExitExactAmountInRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryExitExactAmountInRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExitExactAmountInRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExitExactAmountInRequest proto.InternalMessageInfo - -func (m *QueryExitExactAmountInRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryExitExactAmountInResponse struct { - // coins obtained after exiting - TokensOut github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,1,rep,name=tokens_out,json=tokensOut,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"tokens_out" yaml:"tokens_out"` - Fees github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,2,rep,name=fees,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"fees" yaml:"fees"` -} - -func (m *QueryExitExactAmountInResponse) Reset() { *m = QueryExitExactAmountInResponse{} } -func (m *QueryExitExactAmountInResponse) String() string { return proto.CompactTextString(m) } -func (*QueryExitExactAmountInResponse) ProtoMessage() {} -func (*QueryExitExactAmountInResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{29} -} -func (m *QueryExitExactAmountInResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExitExactAmountInResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExitExactAmountInResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExitExactAmountInResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExitExactAmountInResponse.Merge(m, src) -} -func (m *QueryExitExactAmountInResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryExitExactAmountInResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExitExactAmountInResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExitExactAmountInResponse proto.InternalMessageInfo - -func (m *QueryExitExactAmountInResponse) GetTokensOut() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.TokensOut - } - return nil -} - -func (m *QueryExitExactAmountInResponse) GetFees() github_com_cosmos_cosmos_sdk_types.Coins { - if m != nil { - return m.Fees - } - return nil -} - -type QueryExitExactAmountOutRequest struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *QueryExitExactAmountOutRequest) Reset() { *m = QueryExitExactAmountOutRequest{} } -func (m *QueryExitExactAmountOutRequest) String() string { return proto.CompactTextString(m) } -func (*QueryExitExactAmountOutRequest) ProtoMessage() {} -func (*QueryExitExactAmountOutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{30} -} -func (m *QueryExitExactAmountOutRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExitExactAmountOutRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExitExactAmountOutRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExitExactAmountOutRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExitExactAmountOutRequest.Merge(m, src) -} -func (m *QueryExitExactAmountOutRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryExitExactAmountOutRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExitExactAmountOutRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExitExactAmountOutRequest proto.InternalMessageInfo - -func (m *QueryExitExactAmountOutRequest) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -type QueryExitExactAmountOutResponse struct { -} - -func (m *QueryExitExactAmountOutResponse) Reset() { *m = QueryExitExactAmountOutResponse{} } -func (m *QueryExitExactAmountOutResponse) String() string { return proto.CompactTextString(m) } -func (*QueryExitExactAmountOutResponse) ProtoMessage() {} -func (*QueryExitExactAmountOutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_15e32191d06b2665, []int{31} -} -func (m *QueryExitExactAmountOutResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryExitExactAmountOutResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryExitExactAmountOutResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryExitExactAmountOutResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryExitExactAmountOutResponse.Merge(m, src) -} -func (m *QueryExitExactAmountOutResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryExitExactAmountOutResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryExitExactAmountOutResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryExitExactAmountOutResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "nibiru.spot.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "nibiru.spot.v1.QueryParamsResponse") - proto.RegisterType((*QueryPoolNumberRequest)(nil), "nibiru.spot.v1.QueryPoolNumberRequest") - proto.RegisterType((*QueryPoolNumberResponse)(nil), "nibiru.spot.v1.QueryPoolNumberResponse") - proto.RegisterType((*QueryPoolRequest)(nil), "nibiru.spot.v1.QueryPoolRequest") - proto.RegisterType((*QueryPoolResponse)(nil), "nibiru.spot.v1.QueryPoolResponse") - proto.RegisterType((*QueryPoolsRequest)(nil), "nibiru.spot.v1.QueryPoolsRequest") - proto.RegisterType((*QueryPoolsResponse)(nil), "nibiru.spot.v1.QueryPoolsResponse") - proto.RegisterType((*QueryPoolParamsRequest)(nil), "nibiru.spot.v1.QueryPoolParamsRequest") - proto.RegisterType((*QueryPoolParamsResponse)(nil), "nibiru.spot.v1.QueryPoolParamsResponse") - proto.RegisterType((*QueryNumPoolsRequest)(nil), "nibiru.spot.v1.QueryNumPoolsRequest") - proto.RegisterType((*QueryNumPoolsResponse)(nil), "nibiru.spot.v1.QueryNumPoolsResponse") - proto.RegisterType((*QueryTotalLiquidityRequest)(nil), "nibiru.spot.v1.QueryTotalLiquidityRequest") - proto.RegisterType((*QueryTotalLiquidityResponse)(nil), "nibiru.spot.v1.QueryTotalLiquidityResponse") - proto.RegisterType((*QueryTotalPoolLiquidityRequest)(nil), "nibiru.spot.v1.QueryTotalPoolLiquidityRequest") - proto.RegisterType((*QueryTotalPoolLiquidityResponse)(nil), "nibiru.spot.v1.QueryTotalPoolLiquidityResponse") - proto.RegisterType((*QueryTotalSharesRequest)(nil), "nibiru.spot.v1.QueryTotalSharesRequest") - proto.RegisterType((*QueryTotalSharesResponse)(nil), "nibiru.spot.v1.QueryTotalSharesResponse") - proto.RegisterType((*QuerySpotPriceRequest)(nil), "nibiru.spot.v1.QuerySpotPriceRequest") - proto.RegisterType((*QuerySpotPriceResponse)(nil), "nibiru.spot.v1.QuerySpotPriceResponse") - proto.RegisterType((*QuerySwapExactAmountInRequest)(nil), "nibiru.spot.v1.QuerySwapExactAmountInRequest") - proto.RegisterType((*QuerySwapExactAmountInResponse)(nil), "nibiru.spot.v1.QuerySwapExactAmountInResponse") - proto.RegisterType((*QuerySwapExactAmountOutRequest)(nil), "nibiru.spot.v1.QuerySwapExactAmountOutRequest") - proto.RegisterType((*QuerySwapExactAmountOutResponse)(nil), "nibiru.spot.v1.QuerySwapExactAmountOutResponse") - proto.RegisterType((*QueryJoinExactAmountInRequest)(nil), "nibiru.spot.v1.QueryJoinExactAmountInRequest") - proto.RegisterType((*QueryJoinExactAmountInResponse)(nil), "nibiru.spot.v1.QueryJoinExactAmountInResponse") - proto.RegisterType((*QueryJoinExactAmountOutRequest)(nil), "nibiru.spot.v1.QueryJoinExactAmountOutRequest") - proto.RegisterType((*QueryJoinExactAmountOutResponse)(nil), "nibiru.spot.v1.QueryJoinExactAmountOutResponse") - proto.RegisterType((*QueryExitExactAmountInRequest)(nil), "nibiru.spot.v1.QueryExitExactAmountInRequest") - proto.RegisterType((*QueryExitExactAmountInResponse)(nil), "nibiru.spot.v1.QueryExitExactAmountInResponse") - proto.RegisterType((*QueryExitExactAmountOutRequest)(nil), "nibiru.spot.v1.QueryExitExactAmountOutRequest") - proto.RegisterType((*QueryExitExactAmountOutResponse)(nil), "nibiru.spot.v1.QueryExitExactAmountOutResponse") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/query.proto", fileDescriptor_15e32191d06b2665) } - -var fileDescriptor_15e32191d06b2665 = []byte{ - // 1522 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6f, 0x14, 0xc7, - 0x16, 0x75, 0x63, 0x63, 0x3c, 0x65, 0x30, 0x50, 0x36, 0xc6, 0x6e, 0xc3, 0x18, 0x0a, 0xb0, 0xfd, - 0x6c, 0x31, 0xad, 0x01, 0xde, 0x43, 0xbc, 0x04, 0xa1, 0x18, 0x1c, 0xe2, 0x7c, 0x80, 0x33, 0x44, - 0x91, 0x92, 0x2c, 0x46, 0x6d, 0xbb, 0x3c, 0x34, 0xb8, 0xbb, 0x9a, 0xe9, 0x6a, 0xb0, 0x15, 0x48, - 0xa4, 0x6c, 0xa2, 0x64, 0x13, 0x22, 0xb6, 0x59, 0x64, 0x13, 0x45, 0xca, 0x26, 0x89, 0x22, 0x45, - 0x59, 0xe4, 0x07, 0xb0, 0x44, 0xca, 0x26, 0xca, 0xc2, 0x89, 0x20, 0xbf, 0x80, 0x5f, 0x10, 0x55, - 0xd5, 0xed, 0x9e, 0xfe, 0x9c, 0xee, 0x91, 0x58, 0x64, 0xc5, 0xb8, 0xea, 0xde, 0x7b, 0xce, 0x3d, - 0x75, 0xba, 0xfb, 0x16, 0x48, 0x77, 0xac, 0x55, 0xab, 0xed, 0x1b, 0x9e, 0xcb, 0xb8, 0x71, 0xb7, - 0x6e, 0xdc, 0xf1, 0x69, 0x7b, 0xbb, 0xe6, 0xb6, 0x19, 0x67, 0x78, 0x44, 0xed, 0xd5, 0xc4, 0x5e, - 0xed, 0x6e, 0x5d, 0x1f, 0x6b, 0xb1, 0x16, 0x93, 0x5b, 0x86, 0xf8, 0xa5, 0xa2, 0xf4, 0x23, 0x2d, - 0xc6, 0x5a, 0x9b, 0xd4, 0x30, 0x5d, 0xcb, 0x30, 0x1d, 0x87, 0x71, 0x93, 0x5b, 0xcc, 0xf1, 0x60, - 0x77, 0x7e, 0x8d, 0x79, 0x36, 0xf3, 0x8c, 0x55, 0xd3, 0xa3, 0xaa, 0xb8, 0x71, 0xb7, 0xbe, 0x4a, - 0xb9, 0x59, 0x37, 0x5c, 0xb3, 0x65, 0x39, 0x32, 0x18, 0x62, 0xa7, 0x12, 0x5c, 0x5c, 0xb3, 0x6d, - 0xda, 0x41, 0xa1, 0xc9, 0xe4, 0x26, 0x63, 0x9b, 0xb0, 0x55, 0x8d, 0x62, 0x04, 0xd5, 0xd7, 0x98, - 0x05, 0x75, 0xc9, 0x18, 0xc2, 0x6f, 0x0b, 0xe4, 0x15, 0x59, 0xaf, 0x41, 0xef, 0xf8, 0xd4, 0xe3, - 0xe4, 0x0d, 0x34, 0x1a, 0x5b, 0xf5, 0x5c, 0xe6, 0x78, 0x14, 0x9f, 0x43, 0x83, 0x0a, 0x77, 0x42, - 0x3b, 0xa6, 0xcd, 0x0d, 0x9f, 0x19, 0xaf, 0xc5, 0x55, 0xa8, 0xa9, 0xf8, 0xc5, 0x81, 0xc7, 0x3b, - 0xd3, 0x7d, 0x0d, 0x88, 0x25, 0x13, 0x68, 0x5c, 0x15, 0x63, 0x6c, 0xf3, 0x9a, 0x6f, 0xaf, 0xd2, - 0x76, 0x00, 0x73, 0x06, 0x1d, 0x4e, 0xed, 0x00, 0xd4, 0x61, 0xb4, 0x47, 0x74, 0xd1, 0xb4, 0xd6, - 0x25, 0xd6, 0x40, 0x63, 0x50, 0xfc, 0xb9, 0xbc, 0x4e, 0x16, 0xd0, 0x81, 0x30, 0x07, 0xea, 0xe4, - 0x07, 0x5f, 0x44, 0x07, 0x23, 0xc1, 0x50, 0x7a, 0x0e, 0x0d, 0x88, 0x6d, 0xe8, 0x61, 0x2c, 0xd5, - 0x83, 0x88, 0x95, 0x11, 0xe4, 0x83, 0x48, 0x7a, 0xa0, 0x0d, 0x7e, 0x15, 0xa1, 0xce, 0xe9, 0x40, - 0x91, 0x99, 0x9a, 0x92, 0xb9, 0x26, 0x64, 0xae, 0x29, 0x9f, 0x80, 0xd8, 0xb5, 0x15, 0xb3, 0x45, - 0x21, 0xb7, 0x11, 0xc9, 0x24, 0x9f, 0x69, 0x81, 0xf4, 0xaa, 0x3a, 0xb0, 0x9b, 0x47, 0xbb, 0x05, - 0xb6, 0x90, 0xb8, 0x3f, 0x97, 0x9e, 0x0a, 0xc1, 0x57, 0x63, 0x54, 0x76, 0x49, 0x2a, 0xb3, 0x85, - 0x54, 0x14, 0x50, 0x8c, 0x4b, 0x3d, 0x72, 0x44, 0x31, 0x27, 0xe4, 0x4b, 0xfb, 0x6e, 0xe4, 0xec, - 0x12, 0x36, 0x79, 0x09, 0x0d, 0xcb, 0x9c, 0x98, 0x57, 0xf4, 0xac, 0x46, 0x20, 0x11, 0xb9, 0xe1, - 0x6f, 0x32, 0x8e, 0xc6, 0x64, 0xdd, 0x6b, 0xbe, 0x1d, 0x95, 0x9d, 0x9c, 0x43, 0x87, 0x12, 0xeb, - 0x80, 0x36, 0x85, 0x2a, 0x8e, 0x6f, 0x37, 0x03, 0xd1, 0x04, 0xc7, 0x21, 0x07, 0x82, 0xc8, 0x11, - 0xa4, 0xcb, 0xac, 0x77, 0x18, 0x37, 0x37, 0xdf, 0xb4, 0xee, 0xf8, 0xd6, 0xba, 0xc5, 0xb7, 0x83, - 0x9a, 0x5f, 0x69, 0x68, 0x2a, 0x73, 0x1b, 0x4a, 0x3f, 0x40, 0x95, 0xcd, 0x60, 0x11, 0xce, 0x63, - 0x32, 0x26, 0x6f, 0x20, 0xec, 0x65, 0x66, 0x39, 0x8b, 0x57, 0x84, 0xeb, 0x9f, 0xef, 0x4c, 0x1f, - 0xd8, 0x36, 0xed, 0xcd, 0xff, 0x93, 0x30, 0x93, 0x7c, 0xf7, 0xe7, 0xf4, 0x5c, 0xcb, 0xe2, 0x37, - 0xfd, 0xd5, 0xda, 0x1a, 0xb3, 0x0d, 0x78, 0x22, 0xd5, 0x3f, 0xa7, 0xbd, 0xf5, 0xdb, 0x06, 0xdf, - 0x76, 0xa9, 0x27, 0x8b, 0x78, 0x8d, 0x0e, 0x22, 0xb9, 0x80, 0xaa, 0x1d, 0x76, 0xa2, 0x9f, 0x64, - 0x03, 0xf9, 0xa7, 0xf3, 0xb5, 0x86, 0xa6, 0x73, 0x73, 0xff, 0x1d, 0xdd, 0x05, 0x0f, 0xbf, 0x64, - 0x78, 0xe3, 0xa6, 0xd9, 0xa6, 0xc5, 0xa6, 0xf3, 0xd1, 0x44, 0x3a, 0x07, 0xda, 0x79, 0x0f, 0xed, - 0xe5, 0x62, 0xb9, 0xe9, 0xc9, 0x75, 0xb0, 0x5d, 0x97, 0x8e, 0xa6, 0xa0, 0xa3, 0x51, 0xd5, 0x51, - 0x34, 0x99, 0x34, 0x86, 0x79, 0x07, 0x82, 0x7c, 0x04, 0xde, 0xbb, 0xe1, 0x32, 0xbe, 0xd2, 0xb6, - 0xd6, 0x68, 0x11, 0x51, 0x7c, 0x12, 0x8d, 0x70, 0x76, 0x9b, 0x3a, 0x4d, 0xcb, 0x69, 0xae, 0x53, - 0x87, 0xd9, 0xf2, 0xe9, 0xac, 0x34, 0xf6, 0xca, 0xd5, 0x65, 0xe7, 0x8a, 0x58, 0xc3, 0x33, 0x68, - 0xbf, 0x8a, 0x62, 0x3e, 0x87, 0xb0, 0x7e, 0x19, 0xb6, 0x4f, 0x2e, 0x5f, 0xf7, 0xb9, 0x8c, 0x23, - 0xe7, 0xe1, 0xf1, 0x8c, 0xe0, 0x43, 0xd3, 0x47, 0x11, 0x12, 0xcf, 0x53, 0xd3, 0x15, 0xab, 0x92, - 0x43, 0xa5, 0x51, 0xf1, 0x82, 0x30, 0xf2, 0xbd, 0x86, 0x8e, 0xaa, 0xcc, 0x7b, 0xa6, 0xbb, 0xb4, - 0x65, 0xae, 0xf1, 0x57, 0x6c, 0xe6, 0x3b, 0x7c, 0xd9, 0x29, 0xec, 0xe0, 0x2d, 0x34, 0x14, 0x74, - 0x00, 0x6f, 0x96, 0x2e, 0x52, 0x1e, 0x06, 0x29, 0xf7, 0x07, 0x52, 0xaa, 0x44, 0xd2, 0xd8, 0x03, - 0xfd, 0x96, 0x6e, 0xf5, 0x27, 0x0d, 0x4c, 0x9f, 0xc1, 0x18, 0x7a, 0x5e, 0x41, 0x95, 0xb0, 0x54, - 0x31, 0xb5, 0x89, 0xb8, 0x6f, 0xc3, 0x4c, 0xd2, 0x18, 0x0a, 0x90, 0xf1, 0x25, 0xd4, 0xbf, 0x41, - 0xa9, 0x24, 0xd4, 0xb5, 0x16, 0x86, 0x5a, 0x48, 0xd5, 0xda, 0xa0, 0x94, 0x34, 0x44, 0x26, 0xf9, - 0x31, 0x87, 0xf5, 0x75, 0x9f, 0x17, 0x0a, 0xfd, 0xe2, 0xdb, 0x49, 0x9b, 0xaf, 0x3f, 0x6d, 0x3e, - 0xe2, 0xc2, 0x1b, 0x22, 0x8b, 0x32, 0x28, 0xfd, 0x62, 0x3d, 0x40, 0x7e, 0x0e, 0xdc, 0xf8, 0x3a, - 0xb3, 0x9c, 0xde, 0xdc, 0x78, 0x1f, 0x44, 0xf2, 0x14, 0x95, 0xde, 0xde, 0x55, 0x61, 0x66, 0x6f, - 0xef, 0x2a, 0xd5, 0xbb, 0xb7, 0xec, 0x90, 0x87, 0xbb, 0xe0, 0x78, 0x33, 0x88, 0x83, 0x54, 0x2e, - 0xda, 0x2f, 0x99, 0xab, 0xf7, 0x87, 0x3c, 0x4b, 0xf9, 0x34, 0x2e, 0xbe, 0x26, 0xb8, 0xfc, 0xb1, - 0x33, 0x3d, 0x53, 0x02, 0x77, 0xd9, 0xe1, 0xcf, 0x77, 0xa6, 0xc7, 0x15, 0xeb, 0x44, 0x39, 0xd2, - 0xd8, 0x27, 0x56, 0xd4, 0x1b, 0x49, 0x9c, 0xf2, 0x7d, 0x54, 0x69, 0x53, 0xbb, 0x29, 0x66, 0x39, - 0xaf, 0x67, 0x49, 0xc2, 0xcc, 0x1e, 0x25, 0x69, 0x53, 0x5b, 0xfe, 0x0a, 0xbf, 0x4d, 0x09, 0x45, - 0x4a, 0x18, 0x9e, 0x1c, 0x07, 0xe3, 0x65, 0xa5, 0x2a, 0x35, 0xc9, 0xb7, 0x81, 0x53, 0x96, 0xb6, - 0x2c, 0xde, 0x9b, 0x53, 0x6c, 0x34, 0x12, 0x55, 0x0e, 0x9c, 0x5b, 0x59, 0xbc, 0xda, 0xf3, 0x39, - 0x1c, 0x4a, 0x9f, 0x83, 0xb0, 0xf3, 0xde, 0xce, 0x31, 0x2c, 0x3b, 0xe4, 0xcb, 0xc0, 0x1a, 0x19, - 0x4c, 0xc1, 0x1a, 0x1f, 0x23, 0x04, 0x0e, 0x54, 0xae, 0x28, 0x38, 0xa9, 0x25, 0x38, 0xa9, 0x83, - 0x31, 0xf3, 0x0a, 0x07, 0xf4, 0xf6, 0xa5, 0x55, 0x89, 0xc2, 0x29, 0x0e, 0x1a, 0xd8, 0xa0, 0xb4, - 0x84, 0x49, 0x2e, 0x01, 0xf4, 0x70, 0xf8, 0x7e, 0xeb, 0xd1, 0x1f, 0x12, 0x27, 0xf4, 0x46, 0x42, - 0x92, 0x5e, 0xbc, 0x91, 0x95, 0xaa, 0xe4, 0x3c, 0xf3, 0xcd, 0x28, 0xda, 0x2d, 0x63, 0xb0, 0x83, - 0x06, 0xd5, 0xd0, 0x88, 0x49, 0x72, 0xb8, 0x4c, 0xdf, 0x69, 0xf4, 0x13, 0x5d, 0x63, 0xc0, 0x78, - 0x53, 0x9f, 0xfc, 0xf6, 0xf7, 0xa3, 0x5d, 0x87, 0xf0, 0xa8, 0x11, 0xbd, 0x52, 0xa9, 0x41, 0x56, - 0x1c, 0x64, 0xe7, 0xa6, 0x82, 0x67, 0xb2, 0xeb, 0x25, 0x2f, 0x39, 0xfa, 0x6c, 0x61, 0x1c, 0x60, - 0x1f, 0x93, 0xd8, 0x3a, 0x9e, 0x88, 0x63, 0x0b, 0x9d, 0x1c, 0x05, 0xb9, 0x81, 0x06, 0x44, 0x1e, - 0x3e, 0x96, 0x5b, 0x32, 0x00, 0x3d, 0xde, 0x25, 0x02, 0xe0, 0x26, 0x25, 0xdc, 0x28, 0x3e, 0x98, - 0x82, 0xc3, 0xb7, 0xd0, 0x6e, 0x39, 0x3e, 0xe3, 0xfc, 0x32, 0xa1, 0xac, 0xa4, 0x5b, 0x08, 0x40, - 0xe9, 0x12, 0x6a, 0x0c, 0xe3, 0x14, 0x94, 0x87, 0x3f, 0xd7, 0x94, 0xaa, 0x70, 0x92, 0xf9, 0xaa, - 0xc6, 0x4f, 0x73, 0xb6, 0x30, 0x0e, 0xb0, 0x17, 0x24, 0xf6, 0x29, 0x7c, 0x22, 0x8d, 0x6d, 0x7c, - 0x08, 0x26, 0x7c, 0x10, 0x9c, 0xf0, 0x3d, 0x34, 0x14, 0xdc, 0x2f, 0xf0, 0xc9, 0x4c, 0x84, 0xc4, - 0xb5, 0x44, 0x3f, 0x55, 0x10, 0x05, 0x2c, 0xaa, 0x92, 0xc5, 0x04, 0x1e, 0x8f, 0xb1, 0x08, 0xef, - 0x2d, 0xf8, 0x0b, 0x0d, 0x8d, 0xc4, 0x2f, 0x21, 0x78, 0x3e, 0xb3, 0x72, 0xe6, 0x45, 0x46, 0x5f, - 0x28, 0x15, 0x0b, 0x5c, 0x4e, 0x4a, 0x2e, 0x55, 0x7c, 0x24, 0xc6, 0x45, 0x8d, 0xbf, 0xe1, 0x78, - 0x8e, 0x7f, 0xd0, 0x10, 0x4e, 0x5f, 0x1e, 0x70, 0x2d, 0x1f, 0x29, 0xeb, 0x86, 0xa2, 0x1b, 0xa5, - 0xe3, 0x81, 0xdd, 0x05, 0xc9, 0xee, 0x2c, 0xae, 0x77, 0x3d, 0x2f, 0xc5, 0x56, 0xfe, 0xd9, 0xa1, - 0xfc, 0x48, 0x43, 0xc3, 0x91, 0x9b, 0x01, 0x9e, 0xcd, 0xc7, 0x8e, 0xdd, 0x37, 0xf4, 0xb9, 0xe2, - 0x40, 0x60, 0x57, 0x97, 0xec, 0x16, 0xf0, 0x7f, 0x4a, 0xb0, 0x53, 0xdf, 0x0c, 0xfc, 0xa9, 0x86, - 0x2a, 0xe1, 0xe0, 0x8e, 0xb3, 0xfd, 0x92, 0xbc, 0x58, 0xe8, 0x33, 0x45, 0x61, 0xbd, 0xb9, 0x5b, - 0xe4, 0x78, 0xf8, 0x17, 0x0d, 0x4d, 0x2e, 0x79, 0xdc, 0xb2, 0x4d, 0x4e, 0x53, 0xe3, 0x35, 0x3e, - 0x9d, 0x0d, 0x99, 0x73, 0x71, 0xd0, 0x6b, 0x65, 0xc3, 0x81, 0xe9, 0xcb, 0x92, 0xe9, 0xff, 0xf0, - 0xb9, 0x18, 0xd3, 0x0e, 0x47, 0x0a, 0xc4, 0x0c, 0xef, 0x9e, 0xe9, 0x36, 0xa9, 0xa8, 0xd1, 0x34, - 0x65, 0x91, 0xa6, 0xe5, 0xe0, 0x5f, 0x35, 0xa4, 0xe7, 0x50, 0x17, 0x5f, 0xb8, 0x52, 0x64, 0x3a, - 0xdf, 0x9f, 0x1c, 0x57, 0xe6, 0x4f, 0xc2, 0xe4, 0xa2, 0x64, 0x7f, 0x1e, 0xff, 0xb7, 0x77, 0xf6, - 0xcc, 0xe7, 0x31, 0xe5, 0x53, 0x33, 0x64, 0x8e, 0xf2, 0x79, 0x43, 0x72, 0x8e, 0xf2, 0xb9, 0xa3, - 0x69, 0x79, 0xe5, 0x6f, 0x31, 0xcb, 0xe9, 0xaa, 0x7c, 0x7a, 0x62, 0xc3, 0xa5, 0xc8, 0x14, 0x2a, - 0xdf, 0x65, 0x14, 0x2c, 0xad, 0x7c, 0x9a, 0x7d, 0x52, 0xf9, 0xd4, 0x88, 0x96, 0xa3, 0x7c, 0xde, - 0xd0, 0x99, 0xa3, 0x7c, 0xee, 0xe4, 0x57, 0x5e, 0x79, 0xba, 0x65, 0xf1, 0xae, 0xca, 0xa7, 0xe7, - 0x21, 0x5c, 0x8a, 0x4c, 0xa1, 0xf2, 0xf9, 0x83, 0x56, 0x79, 0xe5, 0xd3, 0xec, 0x99, 0xcf, 0x17, - 0xaf, 0x3c, 0x7e, 0x5a, 0xd5, 0x9e, 0x3c, 0xad, 0x6a, 0x7f, 0x3d, 0xad, 0x6a, 0x0f, 0x9f, 0x55, - 0xfb, 0x9e, 0x3c, 0xab, 0xf6, 0xfd, 0xfe, 0xac, 0xda, 0xf7, 0xfe, 0x7c, 0x64, 0x9e, 0xbc, 0x26, - 0x4b, 0x5f, 0xbe, 0x69, 0x5a, 0x4e, 0x00, 0xb3, 0x05, 0x1f, 0x24, 0x31, 0x57, 0xae, 0x0e, 0xca, - 0xff, 0xa6, 0x3e, 0xfb, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6, 0x32, 0xfc, 0x09, 0x8c, 0x17, - 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Parameters of the spot module. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) - // Next available pool id number. - PoolNumber(ctx context.Context, in *QueryPoolNumberRequest, opts ...grpc.CallOption) (*QueryPoolNumberResponse, error) - // Fetch a pool by id. - Pool(ctx context.Context, in *QueryPoolRequest, opts ...grpc.CallOption) (*QueryPoolResponse, error) - // Returns all pools. - Pools(ctx context.Context, in *QueryPoolsRequest, opts ...grpc.CallOption) (*QueryPoolsResponse, error) - // Parameters of a single pool. - PoolParams(ctx context.Context, in *QueryPoolParamsRequest, opts ...grpc.CallOption) (*QueryPoolParamsResponse, error) - // Number of pools. - NumPools(ctx context.Context, in *QueryNumPoolsRequest, opts ...grpc.CallOption) (*QueryNumPoolsResponse, error) - // Total liquidity across all pools. - TotalLiquidity(ctx context.Context, in *QueryTotalLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalLiquidityResponse, error) - // Total liquidity in a single pool. - TotalPoolLiquidity(ctx context.Context, in *QueryTotalPoolLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalPoolLiquidityResponse, error) - // Total shares in a single pool. - TotalShares(ctx context.Context, in *QueryTotalSharesRequest, opts ...grpc.CallOption) (*QueryTotalSharesResponse, error) - // Instantaneous price of an asset in a pool. - SpotPrice(ctx context.Context, in *QuerySpotPriceRequest, opts ...grpc.CallOption) (*QuerySpotPriceResponse, error) - // Estimates the amount of assets returned given an exact amount of tokens to - // swap. - EstimateSwapExactAmountIn(ctx context.Context, in *QuerySwapExactAmountInRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountInResponse, error) - // Estimates the amount of tokens required to return the exact amount of - // assets requested. - EstimateSwapExactAmountOut(ctx context.Context, in *QuerySwapExactAmountOutRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountOutResponse, error) - // Estimates the amount of pool shares returned given an amount of tokens to - // join. - EstimateJoinExactAmountIn(ctx context.Context, in *QueryJoinExactAmountInRequest, opts ...grpc.CallOption) (*QueryJoinExactAmountInResponse, error) - // Estimates the amount of tokens required to obtain an exact amount of pool - // shares. - EstimateJoinExactAmountOut(ctx context.Context, in *QueryJoinExactAmountOutRequest, opts ...grpc.CallOption) (*QueryJoinExactAmountOutResponse, error) - // Estimates the amount of tokens returned to the user given an exact amount - // of pool shares. - EstimateExitExactAmountIn(ctx context.Context, in *QueryExitExactAmountInRequest, opts ...grpc.CallOption) (*QueryExitExactAmountInResponse, error) - // Estimates the amount of pool shares required to extract an exact amount of - // tokens from the pool. - EstimateExitExactAmountOut(ctx context.Context, in *QueryExitExactAmountOutRequest, opts ...grpc.CallOption) (*QueryExitExactAmountOutResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) PoolNumber(ctx context.Context, in *QueryPoolNumberRequest, opts ...grpc.CallOption) (*QueryPoolNumberResponse, error) { - out := new(QueryPoolNumberResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/PoolNumber", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Pool(ctx context.Context, in *QueryPoolRequest, opts ...grpc.CallOption) (*QueryPoolResponse, error) { - out := new(QueryPoolResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/Pool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Pools(ctx context.Context, in *QueryPoolsRequest, opts ...grpc.CallOption) (*QueryPoolsResponse, error) { - out := new(QueryPoolsResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/Pools", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) PoolParams(ctx context.Context, in *QueryPoolParamsRequest, opts ...grpc.CallOption) (*QueryPoolParamsResponse, error) { - out := new(QueryPoolParamsResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/PoolParams", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) NumPools(ctx context.Context, in *QueryNumPoolsRequest, opts ...grpc.CallOption) (*QueryNumPoolsResponse, error) { - out := new(QueryNumPoolsResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/NumPools", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) TotalLiquidity(ctx context.Context, in *QueryTotalLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalLiquidityResponse, error) { - out := new(QueryTotalLiquidityResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/TotalLiquidity", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) TotalPoolLiquidity(ctx context.Context, in *QueryTotalPoolLiquidityRequest, opts ...grpc.CallOption) (*QueryTotalPoolLiquidityResponse, error) { - out := new(QueryTotalPoolLiquidityResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/TotalPoolLiquidity", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) TotalShares(ctx context.Context, in *QueryTotalSharesRequest, opts ...grpc.CallOption) (*QueryTotalSharesResponse, error) { - out := new(QueryTotalSharesResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/TotalShares", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) SpotPrice(ctx context.Context, in *QuerySpotPriceRequest, opts ...grpc.CallOption) (*QuerySpotPriceResponse, error) { - out := new(QuerySpotPriceResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/SpotPrice", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateSwapExactAmountIn(ctx context.Context, in *QuerySwapExactAmountInRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountInResponse, error) { - out := new(QuerySwapExactAmountInResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateSwapExactAmountIn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateSwapExactAmountOut(ctx context.Context, in *QuerySwapExactAmountOutRequest, opts ...grpc.CallOption) (*QuerySwapExactAmountOutResponse, error) { - out := new(QuerySwapExactAmountOutResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateSwapExactAmountOut", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateJoinExactAmountIn(ctx context.Context, in *QueryJoinExactAmountInRequest, opts ...grpc.CallOption) (*QueryJoinExactAmountInResponse, error) { - out := new(QueryJoinExactAmountInResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateJoinExactAmountIn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateJoinExactAmountOut(ctx context.Context, in *QueryJoinExactAmountOutRequest, opts ...grpc.CallOption) (*QueryJoinExactAmountOutResponse, error) { - out := new(QueryJoinExactAmountOutResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateJoinExactAmountOut", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateExitExactAmountIn(ctx context.Context, in *QueryExitExactAmountInRequest, opts ...grpc.CallOption) (*QueryExitExactAmountInResponse, error) { - out := new(QueryExitExactAmountInResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateExitExactAmountIn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EstimateExitExactAmountOut(ctx context.Context, in *QueryExitExactAmountOutRequest, opts ...grpc.CallOption) (*QueryExitExactAmountOutResponse, error) { - out := new(QueryExitExactAmountOutResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Query/EstimateExitExactAmountOut", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Parameters of the spot module. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) - // Next available pool id number. - PoolNumber(context.Context, *QueryPoolNumberRequest) (*QueryPoolNumberResponse, error) - // Fetch a pool by id. - Pool(context.Context, *QueryPoolRequest) (*QueryPoolResponse, error) - // Returns all pools. - Pools(context.Context, *QueryPoolsRequest) (*QueryPoolsResponse, error) - // Parameters of a single pool. - PoolParams(context.Context, *QueryPoolParamsRequest) (*QueryPoolParamsResponse, error) - // Number of pools. - NumPools(context.Context, *QueryNumPoolsRequest) (*QueryNumPoolsResponse, error) - // Total liquidity across all pools. - TotalLiquidity(context.Context, *QueryTotalLiquidityRequest) (*QueryTotalLiquidityResponse, error) - // Total liquidity in a single pool. - TotalPoolLiquidity(context.Context, *QueryTotalPoolLiquidityRequest) (*QueryTotalPoolLiquidityResponse, error) - // Total shares in a single pool. - TotalShares(context.Context, *QueryTotalSharesRequest) (*QueryTotalSharesResponse, error) - // Instantaneous price of an asset in a pool. - SpotPrice(context.Context, *QuerySpotPriceRequest) (*QuerySpotPriceResponse, error) - // Estimates the amount of assets returned given an exact amount of tokens to - // swap. - EstimateSwapExactAmountIn(context.Context, *QuerySwapExactAmountInRequest) (*QuerySwapExactAmountInResponse, error) - // Estimates the amount of tokens required to return the exact amount of - // assets requested. - EstimateSwapExactAmountOut(context.Context, *QuerySwapExactAmountOutRequest) (*QuerySwapExactAmountOutResponse, error) - // Estimates the amount of pool shares returned given an amount of tokens to - // join. - EstimateJoinExactAmountIn(context.Context, *QueryJoinExactAmountInRequest) (*QueryJoinExactAmountInResponse, error) - // Estimates the amount of tokens required to obtain an exact amount of pool - // shares. - EstimateJoinExactAmountOut(context.Context, *QueryJoinExactAmountOutRequest) (*QueryJoinExactAmountOutResponse, error) - // Estimates the amount of tokens returned to the user given an exact amount - // of pool shares. - EstimateExitExactAmountIn(context.Context, *QueryExitExactAmountInRequest) (*QueryExitExactAmountInResponse, error) - // Estimates the amount of pool shares required to extract an exact amount of - // tokens from the pool. - EstimateExitExactAmountOut(context.Context, *QueryExitExactAmountOutRequest) (*QueryExitExactAmountOutResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} -func (*UnimplementedQueryServer) PoolNumber(ctx context.Context, req *QueryPoolNumberRequest) (*QueryPoolNumberResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PoolNumber not implemented") -} -func (*UnimplementedQueryServer) Pool(ctx context.Context, req *QueryPoolRequest) (*QueryPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Pool not implemented") -} -func (*UnimplementedQueryServer) Pools(ctx context.Context, req *QueryPoolsRequest) (*QueryPoolsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Pools not implemented") -} -func (*UnimplementedQueryServer) PoolParams(ctx context.Context, req *QueryPoolParamsRequest) (*QueryPoolParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method PoolParams not implemented") -} -func (*UnimplementedQueryServer) NumPools(ctx context.Context, req *QueryNumPoolsRequest) (*QueryNumPoolsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method NumPools not implemented") -} -func (*UnimplementedQueryServer) TotalLiquidity(ctx context.Context, req *QueryTotalLiquidityRequest) (*QueryTotalLiquidityResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TotalLiquidity not implemented") -} -func (*UnimplementedQueryServer) TotalPoolLiquidity(ctx context.Context, req *QueryTotalPoolLiquidityRequest) (*QueryTotalPoolLiquidityResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TotalPoolLiquidity not implemented") -} -func (*UnimplementedQueryServer) TotalShares(ctx context.Context, req *QueryTotalSharesRequest) (*QueryTotalSharesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TotalShares not implemented") -} -func (*UnimplementedQueryServer) SpotPrice(ctx context.Context, req *QuerySpotPriceRequest) (*QuerySpotPriceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SpotPrice not implemented") -} -func (*UnimplementedQueryServer) EstimateSwapExactAmountIn(ctx context.Context, req *QuerySwapExactAmountInRequest) (*QuerySwapExactAmountInResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateSwapExactAmountIn not implemented") -} -func (*UnimplementedQueryServer) EstimateSwapExactAmountOut(ctx context.Context, req *QuerySwapExactAmountOutRequest) (*QuerySwapExactAmountOutResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateSwapExactAmountOut not implemented") -} -func (*UnimplementedQueryServer) EstimateJoinExactAmountIn(ctx context.Context, req *QueryJoinExactAmountInRequest) (*QueryJoinExactAmountInResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateJoinExactAmountIn not implemented") -} -func (*UnimplementedQueryServer) EstimateJoinExactAmountOut(ctx context.Context, req *QueryJoinExactAmountOutRequest) (*QueryJoinExactAmountOutResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateJoinExactAmountOut not implemented") -} -func (*UnimplementedQueryServer) EstimateExitExactAmountIn(ctx context.Context, req *QueryExitExactAmountInRequest) (*QueryExitExactAmountInResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateExitExactAmountIn not implemented") -} -func (*UnimplementedQueryServer) EstimateExitExactAmountOut(ctx context.Context, req *QueryExitExactAmountOutRequest) (*QueryExitExactAmountOutResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EstimateExitExactAmountOut not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_PoolNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPoolNumberRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).PoolNumber(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/PoolNumber", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).PoolNumber(ctx, req.(*QueryPoolNumberRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Pool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPoolRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Pool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/Pool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Pool(ctx, req.(*QueryPoolRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Pools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPoolsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Pools(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/Pools", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Pools(ctx, req.(*QueryPoolsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_PoolParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPoolParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).PoolParams(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/PoolParams", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).PoolParams(ctx, req.(*QueryPoolParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_NumPools_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryNumPoolsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).NumPools(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/NumPools", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).NumPools(ctx, req.(*QueryNumPoolsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_TotalLiquidity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTotalLiquidityRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).TotalLiquidity(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/TotalLiquidity", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).TotalLiquidity(ctx, req.(*QueryTotalLiquidityRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_TotalPoolLiquidity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTotalPoolLiquidityRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).TotalPoolLiquidity(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/TotalPoolLiquidity", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).TotalPoolLiquidity(ctx, req.(*QueryTotalPoolLiquidityRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_TotalShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTotalSharesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).TotalShares(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/TotalShares", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).TotalShares(ctx, req.(*QueryTotalSharesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_SpotPrice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QuerySpotPriceRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).SpotPrice(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/SpotPrice", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).SpotPrice(ctx, req.(*QuerySpotPriceRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateSwapExactAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QuerySwapExactAmountInRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateSwapExactAmountIn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateSwapExactAmountIn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateSwapExactAmountIn(ctx, req.(*QuerySwapExactAmountInRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateSwapExactAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QuerySwapExactAmountOutRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateSwapExactAmountOut(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateSwapExactAmountOut", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateSwapExactAmountOut(ctx, req.(*QuerySwapExactAmountOutRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateJoinExactAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryJoinExactAmountInRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateJoinExactAmountIn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateJoinExactAmountIn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateJoinExactAmountIn(ctx, req.(*QueryJoinExactAmountInRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateJoinExactAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryJoinExactAmountOutRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateJoinExactAmountOut(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateJoinExactAmountOut", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateJoinExactAmountOut(ctx, req.(*QueryJoinExactAmountOutRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateExitExactAmountIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryExitExactAmountInRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateExitExactAmountIn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateExitExactAmountIn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateExitExactAmountIn(ctx, req.(*QueryExitExactAmountInRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EstimateExitExactAmountOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryExitExactAmountOutRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EstimateExitExactAmountOut(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Query/EstimateExitExactAmountOut", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EstimateExitExactAmountOut(ctx, req.(*QueryExitExactAmountOutRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.spot.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - { - MethodName: "PoolNumber", - Handler: _Query_PoolNumber_Handler, - }, - { - MethodName: "Pool", - Handler: _Query_Pool_Handler, - }, - { - MethodName: "Pools", - Handler: _Query_Pools_Handler, - }, - { - MethodName: "PoolParams", - Handler: _Query_PoolParams_Handler, - }, - { - MethodName: "NumPools", - Handler: _Query_NumPools_Handler, - }, - { - MethodName: "TotalLiquidity", - Handler: _Query_TotalLiquidity_Handler, - }, - { - MethodName: "TotalPoolLiquidity", - Handler: _Query_TotalPoolLiquidity_Handler, - }, - { - MethodName: "TotalShares", - Handler: _Query_TotalShares_Handler, - }, - { - MethodName: "SpotPrice", - Handler: _Query_SpotPrice_Handler, - }, - { - MethodName: "EstimateSwapExactAmountIn", - Handler: _Query_EstimateSwapExactAmountIn_Handler, - }, - { - MethodName: "EstimateSwapExactAmountOut", - Handler: _Query_EstimateSwapExactAmountOut_Handler, - }, - { - MethodName: "EstimateJoinExactAmountIn", - Handler: _Query_EstimateJoinExactAmountIn_Handler, - }, - { - MethodName: "EstimateJoinExactAmountOut", - Handler: _Query_EstimateJoinExactAmountOut_Handler, - }, - { - MethodName: "EstimateExitExactAmountIn", - Handler: _Query_EstimateExitExactAmountIn_Handler, - }, - { - MethodName: "EstimateExitExactAmountOut", - Handler: _Query_EstimateExitExactAmountOut_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/spot/v1/query.proto", -} - -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryPoolNumberRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolNumberRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolNumberRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryPoolNumberResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolNumberResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolNumberResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pool != nil { - { - size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Pagination != nil { - { - size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Pools) > 0 { - for iNdEx := len(m.Pools) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Pools[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryPoolParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPoolParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPoolParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolParams != nil { - { - size, err := m.PoolParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QueryNumPoolsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryNumPoolsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryNumPoolsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryNumPoolsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryNumPoolsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryNumPoolsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NumPools != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.NumPools)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryTotalLiquidityRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalLiquidityRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalLiquidityRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryTotalLiquidityResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalLiquidityResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalLiquidityResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Liquidity) > 0 { - for iNdEx := len(m.Liquidity) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Liquidity[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryTotalPoolLiquidityRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalPoolLiquidityRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalPoolLiquidityRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryTotalPoolLiquidityResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalPoolLiquidityResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalPoolLiquidityResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Liquidity) > 0 { - for iNdEx := len(m.Liquidity) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Liquidity[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryTotalSharesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalSharesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalSharesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryTotalSharesResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryTotalSharesResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryTotalSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.TotalShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QuerySpotPriceRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySpotPriceRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySpotPriceRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokenOutDenom) > 0 { - i -= len(m.TokenOutDenom) - copy(dAtA[i:], m.TokenOutDenom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenOutDenom))) - i-- - dAtA[i] = 0x1a - } - if len(m.TokenInDenom) > 0 { - i -= len(m.TokenInDenom) - copy(dAtA[i:], m.TokenInDenom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenInDenom))) - i-- - dAtA[i] = 0x12 - } - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QuerySpotPriceResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySpotPriceResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySpotPriceResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.SpotPrice) > 0 { - i -= len(m.SpotPrice) - copy(dAtA[i:], m.SpotPrice) - i = encodeVarintQuery(dAtA, i, uint64(len(m.SpotPrice))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *QuerySwapExactAmountInRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySwapExactAmountInRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySwapExactAmountInRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokenOutDenom) > 0 { - i -= len(m.TokenOutDenom) - copy(dAtA[i:], m.TokenOutDenom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenOutDenom))) - i-- - dAtA[i] = 0x1a - } - { - size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QuerySwapExactAmountInResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySwapExactAmountInResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySwapExactAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Fee.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - return len(dAtA) - i, nil -} - -func (m *QuerySwapExactAmountOutRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySwapExactAmountOutRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySwapExactAmountOutRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokenInDenom) > 0 { - i -= len(m.TokenInDenom) - copy(dAtA[i:], m.TokenInDenom) - i = encodeVarintQuery(dAtA, i, uint64(len(m.TokenInDenom))) - i-- - dAtA[i] = 0x1a - } - { - size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QuerySwapExactAmountOutResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySwapExactAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySwapExactAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - return len(dAtA) - i, nil -} - -func (m *QueryJoinExactAmountInRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryJoinExactAmountInRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryJoinExactAmountInRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokensIn) > 0 { - for iNdEx := len(m.TokensIn) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryJoinExactAmountInResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryJoinExactAmountInResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryJoinExactAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.RemCoins) > 0 { - for iNdEx := len(m.RemCoins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RemCoins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - { - size := m.PoolSharesOut.Size() - i -= size - if _, err := m.PoolSharesOut.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryJoinExactAmountOutRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryJoinExactAmountOutRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryJoinExactAmountOutRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryJoinExactAmountOutResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryJoinExactAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryJoinExactAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryExitExactAmountInRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExitExactAmountInRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExitExactAmountInRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.PoolSharesIn.Size() - i -= size - if _, err := m.PoolSharesIn.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryExitExactAmountInResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExitExactAmountInResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExitExactAmountInResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.Fees) > 0 { - for iNdEx := len(m.Fees) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Fees[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.TokensOut) > 0 { - for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *QueryExitExactAmountOutRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExitExactAmountOutRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExitExactAmountOutRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryExitExactAmountOutResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryExitExactAmountOutResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryExitExactAmountOutResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryPoolNumberRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryPoolNumberResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryPoolRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryPoolResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pool != nil { - l = m.Pool.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPoolsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPoolsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Pools) > 0 { - for _, e := range m.Pools { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - if m.Pagination != nil { - l = m.Pagination.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryPoolParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryPoolParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolParams != nil { - l = m.PoolParams.Size() - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QueryNumPoolsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryNumPoolsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NumPools != 0 { - n += 1 + sovQuery(uint64(m.NumPools)) - } - return n -} - -func (m *QueryTotalLiquidityRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryTotalLiquidityResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Liquidity) > 0 { - for _, e := range m.Liquidity { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryTotalPoolLiquidityRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryTotalPoolLiquidityResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Liquidity) > 0 { - for _, e := range m.Liquidity { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryTotalSharesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryTotalSharesResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.TotalShares.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QuerySpotPriceRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - l = len(m.TokenInDenom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - l = len(m.TokenOutDenom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QuerySpotPriceResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SpotPrice) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QuerySwapExactAmountInRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - l = m.TokenIn.Size() - n += 1 + l + sovQuery(uint64(l)) - l = len(m.TokenOutDenom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QuerySwapExactAmountInResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.TokenOut.Size() - n += 1 + l + sovQuery(uint64(l)) - l = m.Fee.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QuerySwapExactAmountOutRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - l = m.TokenOut.Size() - n += 1 + l + sovQuery(uint64(l)) - l = len(m.TokenInDenom) - if l > 0 { - n += 1 + l + sovQuery(uint64(l)) - } - return n -} - -func (m *QuerySwapExactAmountOutResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.TokenIn.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryJoinExactAmountInRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - if len(m.TokensIn) > 0 { - for _, e := range m.TokensIn { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryJoinExactAmountInResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.PoolSharesOut.Size() - n += 1 + l + sovQuery(uint64(l)) - if len(m.RemCoins) > 0 { - for _, e := range m.RemCoins { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryJoinExactAmountOutRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryJoinExactAmountOutResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryExitExactAmountInRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - l = m.PoolSharesIn.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryExitExactAmountInResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TokensOut) > 0 { - for _, e := range m.TokensOut { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - if len(m.Fees) > 0 { - for _, e := range m.Fees { - l = e.Size() - n += 1 + l + sovQuery(uint64(l)) - } - } - return n -} - -func (m *QueryExitExactAmountOutRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovQuery(uint64(m.PoolId)) - } - return n -} - -func (m *QueryExitExactAmountOutResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolNumberRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolNumberRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolNumberRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolNumberResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolNumberResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolNumberResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pool == nil { - m.Pool = &Pool{} - } - if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageRequest{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pools", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pools = append(m.Pools, &Pool{}) - if err := m.Pools[len(m.Pools)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pagination == nil { - m.Pagination = &query.PageResponse{} - } - if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPoolParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPoolParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPoolParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolParams", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PoolParams == nil { - m.PoolParams = &PoolParams{} - } - if err := m.PoolParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryNumPoolsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryNumPoolsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryNumPoolsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryNumPoolsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryNumPoolsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryNumPoolsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NumPools", wireType) - } - m.NumPools = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NumPools |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalLiquidityRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalLiquidityRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalLiquidityRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalLiquidityResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalLiquidityResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalLiquidityResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Liquidity", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Liquidity = append(m.Liquidity, types.Coin{}) - if err := m.Liquidity[len(m.Liquidity)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalPoolLiquidityRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalPoolLiquidityRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalPoolLiquidityRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalPoolLiquidityResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalPoolLiquidityResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalPoolLiquidityResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Liquidity", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Liquidity = append(m.Liquidity, types.Coin{}) - if err := m.Liquidity[len(m.Liquidity)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalSharesRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalSharesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalSharesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryTotalSharesResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryTotalSharesResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryTotalSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TotalShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySpotPriceRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySpotPriceRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySpotPriceRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenInDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenInDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOutDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenOutDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySpotPriceResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySpotPriceResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySpotPriceResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SpotPrice", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SpotPrice = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySwapExactAmountInRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySwapExactAmountInRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySwapExactAmountInRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOutDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenOutDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySwapExactAmountInResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySwapExactAmountInResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySwapExactAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fee", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Fee.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySwapExactAmountOutRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySwapExactAmountOutRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySwapExactAmountOutRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenInDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenInDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySwapExactAmountOutResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySwapExactAmountOutResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySwapExactAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryJoinExactAmountInRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryJoinExactAmountInRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryJoinExactAmountInRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensIn = append(m.TokensIn, types.Coin{}) - if err := m.TokensIn[len(m.TokensIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryJoinExactAmountInResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryJoinExactAmountInResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryJoinExactAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolSharesOut", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolSharesOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemCoins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RemCoins = append(m.RemCoins, types.Coin{}) - if err := m.RemCoins[len(m.RemCoins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryJoinExactAmountOutRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryJoinExactAmountOutRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryJoinExactAmountOutRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryJoinExactAmountOutResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryJoinExactAmountOutResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryJoinExactAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryExitExactAmountInRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExitExactAmountInRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExitExactAmountInRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolSharesIn", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolSharesIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryExitExactAmountInResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExitExactAmountInResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExitExactAmountInResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensOut = append(m.TokensOut, types.Coin{}) - if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fees", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Fees = append(m.Fees, types.Coin{}) - if err := m.Fees[len(m.Fees)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryExitExactAmountOutRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExitExactAmountOutRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExitExactAmountOutRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryExitExactAmountOutResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryExitExactAmountOutResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryExitExactAmountOutResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/query.pb.gw.go b/x/spot/types/query.pb.gw.go deleted file mode 100644 index 7669c197a..000000000 --- a/x/spot/types/query.pb.gw.go +++ /dev/null @@ -1,1614 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/spot/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_PoolNumber_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolNumberRequest - var metadata runtime.ServerMetadata - - msg, err := client.PoolNumber(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_PoolNumber_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolNumberRequest - var metadata runtime.ServerMetadata - - msg, err := server.PoolNumber(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_Pool_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Pool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Pool_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Pool(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_Pools_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Query_Pools_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pools_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Pools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Pools_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolsRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Pools_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Pools(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_PoolParams_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolParamsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := client.PoolParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_PoolParams_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPoolParamsRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := server.PoolParams(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_NumPools_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryNumPoolsRequest - var metadata runtime.ServerMetadata - - msg, err := client.NumPools(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_NumPools_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryNumPoolsRequest - var metadata runtime.ServerMetadata - - msg, err := server.NumPools(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_TotalLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalLiquidityRequest - var metadata runtime.ServerMetadata - - msg, err := client.TotalLiquidity(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_TotalLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalLiquidityRequest - var metadata runtime.ServerMetadata - - msg, err := server.TotalLiquidity(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_TotalPoolLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalPoolLiquidityRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := client.TotalPoolLiquidity(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_TotalPoolLiquidity_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalPoolLiquidityRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := server.TotalPoolLiquidity(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_TotalShares_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalSharesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := client.TotalShares(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_TotalShares_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryTotalSharesRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := server.TotalShares(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_SpotPrice_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_SpotPrice_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySpotPriceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SpotPrice_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.SpotPrice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_SpotPrice_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySpotPriceRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_SpotPrice_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.SpotPrice(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_EstimateSwapExactAmountIn_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_EstimateSwapExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySwapExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.EstimateSwapExactAmountIn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateSwapExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySwapExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.EstimateSwapExactAmountIn(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_EstimateSwapExactAmountOut_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_EstimateSwapExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySwapExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountOut_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.EstimateSwapExactAmountOut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateSwapExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySwapExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateSwapExactAmountOut_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.EstimateSwapExactAmountOut(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_EstimateJoinExactAmountIn_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_EstimateJoinExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryJoinExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateJoinExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.EstimateJoinExactAmountIn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateJoinExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryJoinExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateJoinExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.EstimateJoinExactAmountIn(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_EstimateJoinExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryJoinExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := client.EstimateJoinExactAmountOut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateJoinExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryJoinExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := server.EstimateJoinExactAmountOut(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Query_EstimateExitExactAmountIn_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Query_EstimateExitExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExitExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateExitExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.EstimateExitExactAmountIn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateExitExactAmountIn_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExitExactAmountInRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_EstimateExitExactAmountIn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.EstimateExitExactAmountIn(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_EstimateExitExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExitExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := client.EstimateExitExactAmountOut(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EstimateExitExactAmountOut_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryExitExactAmountOutRequest - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - msg, err := server.EstimateExitExactAmountOut(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PoolNumber_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PoolNumber_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PoolNumber_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Pool_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Pools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Pools_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Pools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PoolParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_PoolParams_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PoolParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_NumPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_NumPools_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_NumPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TotalLiquidity_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalPoolLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TotalPoolLiquidity_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalPoolLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_TotalShares_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SpotPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SpotPrice_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SpotPrice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateSwapExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateSwapExactAmountIn_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateSwapExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateSwapExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateSwapExactAmountOut_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateSwapExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateJoinExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateJoinExactAmountIn_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateJoinExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateJoinExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateJoinExactAmountOut_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateJoinExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateExitExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateExitExactAmountIn_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateExitExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateExitExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EstimateExitExactAmountOut_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateExitExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PoolNumber_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_PoolNumber_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PoolNumber_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Pool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Pool_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Pool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Pools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Pools_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Pools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_PoolParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_PoolParams_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_PoolParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_NumPools_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_NumPools_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_NumPools_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_TotalLiquidity_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalPoolLiquidity_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_TotalPoolLiquidity_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalPoolLiquidity_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_TotalShares_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_TotalShares_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_TotalShares_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SpotPrice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_SpotPrice_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SpotPrice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateSwapExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateSwapExactAmountIn_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateSwapExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateSwapExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateSwapExactAmountOut_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateSwapExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateJoinExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateJoinExactAmountIn_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateJoinExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateJoinExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateJoinExactAmountOut_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateJoinExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateExitExactAmountIn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateExitExactAmountIn_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateExitExactAmountIn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EstimateExitExactAmountOut_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EstimateExitExactAmountOut_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EstimateExitExactAmountOut_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "params"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_PoolNumber_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "pool_number"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Pool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "pool"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Pools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "pools"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_PoolParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"nibiru", "spot", "pools", "pool_id", "params"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_NumPools_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "num_pools"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_TotalLiquidity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "total_liquidity"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_TotalPoolLiquidity_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"nibiru", "spot", "pools", "pool_id", "total_pool_liquidity"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_TotalShares_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"nibiru", "spot", "pools", "pool_id", "total_shares"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_SpotPrice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"nibiru", "spot", "pools", "pool_id", "prices"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateSwapExactAmountIn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "swap_exact_amount_in"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateSwapExactAmountOut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "swap_exact_amount_out"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateJoinExactAmountIn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "join_exact_amount_in"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateJoinExactAmountOut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "join_exact_amount_out"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateExitExactAmountIn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "exit_exact_amount_in"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EstimateExitExactAmountOut_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3, 2, 4}, []string{"nibiru", "spot", "pool_id", "estimate", "exit_exact_amount_out"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage - - forward_Query_PoolNumber_0 = runtime.ForwardResponseMessage - - forward_Query_Pool_0 = runtime.ForwardResponseMessage - - forward_Query_Pools_0 = runtime.ForwardResponseMessage - - forward_Query_PoolParams_0 = runtime.ForwardResponseMessage - - forward_Query_NumPools_0 = runtime.ForwardResponseMessage - - forward_Query_TotalLiquidity_0 = runtime.ForwardResponseMessage - - forward_Query_TotalPoolLiquidity_0 = runtime.ForwardResponseMessage - - forward_Query_TotalShares_0 = runtime.ForwardResponseMessage - - forward_Query_SpotPrice_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateSwapExactAmountIn_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateSwapExactAmountOut_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateJoinExactAmountIn_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateJoinExactAmountOut_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateExitExactAmountIn_0 = runtime.ForwardResponseMessage - - forward_Query_EstimateExitExactAmountOut_0 = runtime.ForwardResponseMessage -) diff --git a/x/spot/types/shares.go b/x/spot/types/shares.go deleted file mode 100644 index b6a958b70..000000000 --- a/x/spot/types/shares.go +++ /dev/null @@ -1,242 +0,0 @@ -package types - -import ( - "errors" - - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -/* -Takes a pool and the amount of tokens desired to add to the pool, -and calculates the number of pool shares and remaining coins after theoretically -adding the tokensIn to the pool. - -Note that this function is pure/read-only. It only calculates the theoretical amoount -and doesn't modify the actual state. - -args: - - tokensIn: a slice of coins to add to the pool - -ret: - - numShares: the number of LP shares representing the maximal number of tokens added to the pool - - remCoins: the remaining number of coins after adding the tokens - - err: error if any -*/ -func (pool Pool) numSharesOutFromTokensIn(tokensIn sdk.Coins) ( - numShares sdkmath.Int, remCoins sdk.Coins, err error, -) { - coinShareRatios := make([]sdk.Dec, len(tokensIn)) - minShareRatio := sdk.MaxSortableDec - maxShareRatio := sdk.ZeroDec() - - poolLiquidity := pool.PoolBalances() - if len(tokensIn) == 1 { - // From balancer whitepaper, for 2 assets with the same weight, the shares issued are: - // P_{supply} * (sqrt(1+((1-f/2) * x_{in})/X)-1) - - one := sdk.OneDec() - - joinShare := sdk.NewDecFromInt(tokensIn[0].Amount).Mul(one.Sub(pool.PoolParams.SwapFee.Quo(sdk.NewDec(2)))).QuoInt( - poolLiquidity.AmountOfNoDenomValidation(tokensIn[0].Denom), - ).Add(one) - - joinShare, err = joinShare.ApproxSqrt() - if err != nil { - return - } - - numShares = joinShare.Sub(one).MulInt(pool.TotalShares.Amount).TruncateInt() - return - } - - for i, coin := range tokensIn { - shareRatio := sdk.NewDecFromInt(coin.Amount).QuoInt( - poolLiquidity.AmountOfNoDenomValidation(coin.Denom), - ) - if shareRatio.LT(minShareRatio) { - minShareRatio = shareRatio - } - if shareRatio.GT(maxShareRatio) { - maxShareRatio = shareRatio - } - coinShareRatios[i] = shareRatio - } - - if minShareRatio.Equal(sdk.MaxSortableDec) { - return sdk.ZeroInt(), sdk.NewCoins(), errors.New("unexpected error in balancer maximalExactRatioJoin") - } - - if minShareRatio.IsZero() { - return sdk.ZeroInt(), tokensIn, nil - } - - numShares = minShareRatio.MulInt(pool.TotalShares.Amount).TruncateInt() - remCoins = sdk.Coins{} - - // if we have multiple shares, calculate remCoins - if !minShareRatio.Equal(maxShareRatio) { - // we have to calculate remCoins - for i, coin := range tokensIn { - if !coinShareRatios[i].Equal(minShareRatio) { - usedAmount := minShareRatio.MulInt( - poolLiquidity.AmountOfNoDenomValidation(coin.Denom)).Ceil().TruncateInt() - remainingAmount := coin.Amount.Sub(usedAmount) - // add to RemCoins - if !remainingAmount.IsZero() { - remCoins = remCoins.Add(sdk.Coin{Denom: coin.Denom, Amount: remainingAmount}) - } - } - } - } - - return numShares, remCoins, nil -} - -/* -For a stableswap pool, takes the amount of tokens desired to add to the pool, -and calculates the number of pool shares and remaining coins after theoretically -adding the tokensIn to the pool. All tokens are used in this function. - -The delta in number of share follows the evolution of the constant of the pool. E.g. if someone bring tokens -to increase the value D of the pool by 10%, he will receive 10% of the existing token share. - -Note that this function is pure/read-only. It only calculates the theoretical amoount -and doesn't modify the actual state. - -args: - - tokensIn: a slice of coins to add to the pool - -ret: - - numShares: the number of LP shares representing the maximal number of tokens added to the pool - - remCoins: the remaining number of coins after adding the tokens - - err: error if any -*/ -func (pool Pool) numSharesOutFromTokensInStableSwap(tokensIn sdk.Coins) ( - numShares sdkmath.Int, err error, -) { - tokenSupply := pool.TotalShares.Amount - - D, err := pool.GetD(pool.PoolAssets) - if err != nil { - return - } - D0 := sdk.NewInt(int64(D.Uint64())) - - var newPoolAssets []PoolAsset - - for assetIndex, poolAsset := range pool.PoolAssets { - inAmount := tokensIn.AmountOf(poolAsset.Token.Denom) - - if !inAmount.IsZero() { - newAmount := pool.PoolAssets[assetIndex].Token.Amount.Add(inAmount) - - newPoolAssets = append(newPoolAssets, PoolAsset{Token: sdk.NewCoin(poolAsset.Token.Denom, newAmount)}) - } else { - newPoolAssets = append(newPoolAssets, poolAsset) - } - } - - newD, err := pool.GetD(newPoolAssets) - if err != nil { - return - } - D1 := sdk.NewInt(int64(newD.Uint64())) - if D1.LT(D0) { - // Should not happen - err = ErrInvariantLowerAfterJoining - return - } - - // Calculate, how much pool tokens to mint - numShares = tokenSupply.Mul(D1.Sub(D0)).Quo(D0) - - return -} - -/* -TokensOutFromPoolSharesIn Calculates the number of tokens to remove from liquidity given LP shares returned to the pool. - -Note that this function is pure/read-only. It only calculates the theoretical amoount -and doesn't modify the actual state. - -args: - - numSharesIn: number of LP shares to return to the pool - -ret: - - tokensOut: the tokens withdrawn from the pool - - fees: the fees collected - - err: error if any -*/ -func (pool Pool) TokensOutFromPoolSharesIn(numSharesIn sdkmath.Int) ( - tokensOut sdk.Coins, fees sdk.Coins, err error, -) { - if numSharesIn.IsZero() { - return nil, nil, errors.New("num shares in must be greater than zero") - } - - shareRatio := sdk.NewDecFromInt(numSharesIn).QuoInt(pool.TotalShares.Amount) - if shareRatio.IsZero() { - return nil, nil, errors.New("share ratio must be greater than zero") - } - if shareRatio.GT(sdk.OneDec()) { - return nil, nil, errors.New("share ratio cannot be greater than one") - } - - poolLiquidity := pool.PoolBalances() - tokensOut = make(sdk.Coins, len(poolLiquidity)) - fees = make(sdk.Coins, len(poolLiquidity)) - for i, coin := range poolLiquidity { - // tokenOut = shareRatio * poolTokenAmt * (1 - exitFee) - tokenAmount := shareRatio.MulInt(coin.Amount) - tokenOutAmt := tokenAmount.Mul( - sdk.OneDec().Sub(pool.PoolParams.ExitFee), - ).TruncateInt() - tokensOut[i] = sdk.NewCoin(coin.Denom, tokenOutAmt) - fees[i] = sdk.NewCoin(coin.Denom, tokenAmount.TruncateInt().Sub(tokenOutAmt)) - } - - return tokensOut, sdk.NewCoins(fees...), nil -} - -/* -Compute the minimum number of shares a user need to provide to get at least one u-token -*/ -func (pool Pool) MinSharesInForTokensOut() (minShares sdkmath.Int) { - poolLiquidity := pool.PoolBalances() - - minShares = sdk.ZeroInt() - - for _, coin := range poolLiquidity { - shareRatio := sdk.MustNewDecFromStr("2").Quo(sdk.NewDecFromInt(coin.Amount).Quo(sdk.OneDec().Sub(pool.PoolParams.ExitFee))) - - shares := shareRatio.MulInt(pool.TotalShares.Amount).TruncateInt() - - if minShares.IsZero() || minShares.LT(shares) { - minShares = shares - } - } - return -} - -/* -Adds new liquidity to the pool and increments the total number of shares. - -args: - - numShares: the number of LP shares to increment - - newLiquidity: the new tokens to deposit into the pool -*/ -func (pool *Pool) incrementBalances(numShares sdkmath.Int, newLiquidity sdk.Coins) ( - err error, -) { - for _, coin := range newLiquidity { - i, poolAsset, err := pool.getPoolAssetAndIndex(coin.Denom) - if err != nil { - return err - } - poolAsset.Token.Amount = poolAsset.Token.Amount.Add(coin.Amount) - pool.PoolAssets[i] = poolAsset - } - pool.TotalShares.Amount = pool.TotalShares.Amount.Add(numShares) - return nil -} diff --git a/x/spot/types/shares_test.go b/x/spot/types/shares_test.go deleted file mode 100644 index 8ca4e98f4..000000000 --- a/x/spot/types/shares_test.go +++ /dev/null @@ -1,499 +0,0 @@ -package types - -import ( - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestMaximalSharesFromExactRatioJoin(t *testing.T) { - for _, tc := range []struct { - name string - poolAssets []PoolAsset - existingShares int64 - tokensIn sdk.Coins - expectedNumShares sdkmath.Int - expectedRemCoins sdk.Coins - }{ - { - name: "all coins deposited", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - existingShares: 100, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 100), - ), - expectedNumShares: sdk.NewInt(100), - expectedRemCoins: sdk.NewCoins(), - }, - { - name: "some coins deposited", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - existingShares: 100, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 50), - ), - expectedNumShares: sdk.NewInt(50), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - ), - }, - { - name: "limited by smallest amount", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - existingShares: 100, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 1), - sdk.NewInt64Coin("bbb", 50), - ), - expectedNumShares: sdk.OneInt(), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("bbb", 49), - ), - }, - { - name: "limited by smallest amount - 2", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - existingShares: 100, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 10), - ), - expectedNumShares: sdk.NewInt(5), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 5), - ), - }, - { - name: "right number of LP shares", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 50), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - existingShares: 150, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 50), - ), - expectedNumShares: sdk.NewInt(75), - expectedRemCoins: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 25), - ), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - Id: 1, - Address: "some_address", - PoolParams: PoolParams{}, - PoolAssets: tc.poolAssets, - TotalWeight: sdk.OneInt(), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", tc.existingShares), - } - numShares, remCoins, _ := pool.numSharesOutFromTokensIn(tc.tokensIn) - require.Equal(t, tc.expectedNumShares, numShares) - require.Equal(t, tc.expectedRemCoins, remCoins) - }) - } -} - -func TestTokensOutFromExactSharesHappyPath(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - numSharesIn sdkmath.Int - expectedTokensOut sdk.Coins - expectedFees sdk.Coins - }{ - { - name: "all coins withdrawn, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - PoolParams: PoolParams{ - ExitFee: sdk.ZeroDec(), - }, - }, - numSharesIn: sdk.NewInt(50), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 200), - ), - expectedFees: sdk.Coins{}, - }, - { - name: "partial coins withdrawn, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - PoolParams: PoolParams{ - ExitFee: sdk.ZeroDec(), - }, - }, - numSharesIn: sdk.NewInt(25), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 100), - ), - expectedFees: sdk.Coins{}, - }, - { - name: "fractional coins withdrawn truncates to int, no exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 1000), - PoolParams: PoolParams{ - ExitFee: sdk.ZeroDec(), - }, - }, - numSharesIn: sdk.NewInt(25), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 2), - sdk.NewInt64Coin("foo", 5), - ), - expectedFees: sdk.Coins{}, - }, - { - name: "all coins withdrawn, with exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - PoolParams: PoolParams{ - ExitFee: sdk.MustNewDecFromStr("0.5"), - }, - }, - numSharesIn: sdk.NewInt(50), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 100), - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin("bar", 50), - sdk.NewInt64Coin("foo", 100), - ), - }, - { - name: "partial coins withdrawn, with exit fee", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - PoolParams: PoolParams{ - ExitFee: sdk.MustNewDecFromStr("0.5"), - }, - }, - numSharesIn: sdk.NewInt(25), - expectedTokensOut: sdk.NewCoins( - sdk.NewInt64Coin("bar", 25), - sdk.NewInt64Coin("foo", 50), - ), - expectedFees: sdk.NewCoins( - sdk.NewInt64Coin("bar", 25), - sdk.NewInt64Coin("foo", 50), - ), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - tokensOut, fees, err := tc.pool.TokensOutFromPoolSharesIn(tc.numSharesIn) - require.NoError(t, err) - require.Equal(t, tc.expectedTokensOut, tokensOut) - require.Equal(t, tc.expectedFees, fees) - }) - } -} - -func TestTokensOutFromExactSharesErrors(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - numSharesIn sdkmath.Int - }{ - { - name: "zero pool shares", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - }, - numSharesIn: sdk.ZeroInt(), - }, - { - name: "too many pool shares", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 50), - }, - numSharesIn: sdk.NewInt(51), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - _, _, err := tc.pool.TokensOutFromPoolSharesIn(tc.numSharesIn) - require.Error(t, err) - }) - } -} - -func TestUpdateLiquidityHappyPath(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - numShares sdkmath.Int - newLiquidity sdk.Coins - expectedNumShares sdkmath.Int - expectedNewPoolAssets []PoolAsset - }{ - { - name: "all coins deposited", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - numShares: sdk.NewInt(10), - newLiquidity: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 10), - sdk.NewInt64Coin("bbb", 20), - ), - expectedNumShares: sdk.NewInt(110), - expectedNewPoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 110), - }, - { - Token: sdk.NewInt64Coin("bbb", 220), - }, - }, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.pool.incrementBalances(tc.numShares, tc.newLiquidity) - require.NoError(t, err) - require.Equal(t, tc.expectedNumShares, tc.pool.TotalShares.Amount) - require.Equal(t, tc.expectedNewPoolAssets, tc.pool.PoolAssets) - }) - } -} - -func TestUpdateLiquidityInvalidInput(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - numShares sdkmath.Int - newLiquidity sdk.Coins - }{ - { - name: "add non-existent coin", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - }, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - numShares: sdk.NewInt(10), - newLiquidity: sdk.NewCoins( - sdk.NewInt64Coin("bbb", 20), - ), - }, - { - name: "no existing liquidity", - pool: Pool{ - PoolAssets: []PoolAsset{}, - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", 100), - }, - numShares: sdk.NewInt(10), - newLiquidity: sdk.NewCoins( - sdk.NewInt64Coin("bbb", 20), - ), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.pool.incrementBalances(tc.numShares, tc.newLiquidity) - require.Error(t, err) - }) - } -} - -func TestNumSharesOutStableswap(t *testing.T) { - for _, tc := range []struct { - name string - poolAssets []PoolAsset - existingShares int64 - tokensIn sdk.Coins - expectedNumShares sdkmath.Int - A sdkmath.Int - expectedError error - }{ - { - name: "all coins deposited", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - A: sdk.NewInt(2000), - existingShares: 50, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 100), - ), - expectedNumShares: sdk.NewInt(50), - }, - { - name: "all coins deposited - 3pool", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - { - Token: sdk.NewInt64Coin("ccc", 100), - }, - }, - A: sdk.NewInt(2000), - existingShares: 50, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 100), - sdk.NewInt64Coin("bbb", 100), - ), - expectedNumShares: sdk.NewInt(33), - }, - { - name: "all coins deposited - imbalance", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - }, - }, - A: sdk.NewInt(2000), - existingShares: 50, - tokensIn: sdk.NewCoins( - sdk.NewInt64Coin("aaa", 50), - sdk.NewInt64Coin("bbb", 100), - ), - expectedNumShares: sdk.NewInt(37), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - Id: 1, - Address: "some_address", - PoolParams: PoolParams{A: tc.A}, - PoolAssets: tc.poolAssets, - TotalWeight: sdk.OneInt(), - TotalShares: sdk.NewInt64Coin("nibiru/pool/1", tc.existingShares), - } - numShares, err := pool.numSharesOutFromTokensInStableSwap(tc.tokensIn) - if tc.expectedError != nil { - require.ErrorIs(t, err, tc.expectedError) - } else { - require.NoError(t, err) - require.Equal(t, tc.expectedNumShares, numShares) - } - }) - } -} diff --git a/x/spot/types/swap.go b/x/spot/types/swap.go deleted file mode 100644 index a73172b7f..000000000 --- a/x/spot/types/swap.go +++ /dev/null @@ -1,193 +0,0 @@ -package types - -import ( - "fmt" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/spot/math" -) - -/* -CalcOutAmtGivenIn Calculates the amount of tokenOut given tokenIn, deducting the swap fee. -Solved using the SolveConstantProductInvariant AMM curve. -Only supports single asset swaps. - -args: - - tokenIn: the amount of tokens to swap - - tokenOutDenom: the target token denom - - noFee: whether we want to bypass swap fee (for single asset join) - -ret: - - tokenOut: the tokens received from the swap - - fee: the fee deducted from the swap - - err: error if any -*/ -func (pool Pool) CalcOutAmtGivenIn(tokenIn sdk.Coin, tokenOutDenom string, noFee bool) ( - tokenOut sdk.Coin, fee sdk.Coin, err error, -) { - _, poolAssetIn, err := pool.getPoolAssetAndIndex(tokenIn.Denom) - if err != nil { - return tokenOut, fee, err - } - - _, poolAssetOut, err := pool.getPoolAssetAndIndex(tokenOutDenom) - if err != nil { - return tokenOut, fee, err - } - - var tokenAmountInAfterFee sdk.Dec - if noFee { - tokenAmountInAfterFee = sdk.NewDecFromInt(tokenIn.Amount) - } else { - tokenAmountInAfterFee = sdk.NewDecFromInt(tokenIn.Amount).Mul(sdk.OneDec().Sub(pool.PoolParams.SwapFee)) - } - feeAmount := sdk.NewDecFromInt(tokenIn.Amount).Sub(tokenAmountInAfterFee) - fee = sdk.NewCoin(tokenIn.Denom, feeAmount.TruncateInt()) - - poolTokenInBalance := sdk.NewDecFromInt(poolAssetIn.Token.Amount) - poolTokenInBalancePostSwap := poolTokenInBalance.Add(tokenAmountInAfterFee) - - // deduct swapfee on the in asset - // delta balanceOut is positive(tokens inside the pool decreases) - var tokenAmountOut sdkmath.Int - if pool.PoolParams.PoolType == PoolType_STABLESWAP { - tokenAmountOut, err = pool.Exchange(sdk.NewCoin(tokenIn.Denom, tokenAmountInAfterFee.TruncateInt()), tokenOutDenom) - - if err != nil { - return - } - } else if pool.PoolParams.PoolType == PoolType_BALANCER { - tokenAmountOut = math.SolveConstantProductInvariant( - /*xPrior=*/ poolTokenInBalance, - /*xAfter=*/ poolTokenInBalancePostSwap, - /*xWeight=*/ sdk.NewDecFromInt(poolAssetIn.Weight), - /*yPrior=*/ sdk.NewDecFromInt(poolAssetOut.Token.Amount), - /*yWeight=*/ sdk.NewDecFromInt(poolAssetOut.Weight), - ).TruncateInt() - } - - if tokenAmountOut.IsZero() { - return tokenOut, fee, fmt.Errorf("tokenIn (%s) must be higher to perform a swap", tokenIn.Denom) - } - - return sdk.NewCoin(tokenOutDenom, tokenAmountOut), fee, nil -} - -/* -Calculates the amount of tokenIn required to obtain tokenOut coins from a swap, -accounting for additional fees. -Only supports single asset swaps. -This function is the inverse of CalcOutAmtGivenIn. - -args: - - tokenOut: the amount of tokens to swap - - tokenInDenom: the target token denom - -ret: - - tokenIn: the tokens received from the swap - - err: error if any -*/ -func (pool Pool) CalcInAmtGivenOut(tokenOut sdk.Coin, tokenInDenom string) ( - tokenIn sdk.Coin, err error, -) { - if pool.PoolParams.PoolType == PoolType_BALANCER { - return pool.CalcInAmtGivenOutBalancer(tokenOut, tokenInDenom) - } else if pool.PoolParams.PoolType == PoolType_STABLESWAP { - return pool.CalcInAmtGivenOutStableswap(tokenOut, tokenInDenom) - } - return sdk.Coin{}, ErrInvalidPoolType -} - -/* -Calculates the amount of tokenIn required to obtain tokenOut coins from a swap, -accounting for additional fees. This is not implemented yet in curve and in Nibiru. -*/ -func (pool Pool) CalcInAmtGivenOutStableswap(tokenOut sdk.Coin, tokenInDenom string) ( - tokenIn sdk.Coin, err error, -) { - return sdk.Coin{}, ErrNotImplemented -} - -/* -Calculates the amount of tokenIn required to obtain tokenOut coins from a swap, -accounting for additional fees. -Only supports single asset swaps. -This function is the inverse of CalcOutAmtGivenIn. - -args: - - tokenOut: the amount of tokens to swap - - tokenInDenom: the target token denom - -ret: - - tokenIn: the tokens received from the swap - - err: error if any -*/ -func (pool Pool) CalcInAmtGivenOutBalancer(tokenOut sdk.Coin, tokenInDenom string) ( - tokenIn sdk.Coin, err error, -) { - _, poolAssetOut, err := pool.getPoolAssetAndIndex(tokenOut.Denom) - if err != nil { - return tokenIn, err - } - - _, poolAssetIn, err := pool.getPoolAssetAndIndex(tokenInDenom) - if err != nil { - return tokenIn, err - } - - // assuming the user wishes to withdraw 'tokenOut', the balance of 'tokenOut' post swap will be lower - poolTokenOutBalance := sdk.NewDecFromInt(poolAssetOut.Token.Amount) - poolTokenOutBalancePostSwap := poolTokenOutBalance.Sub(sdk.NewDecFromInt(tokenOut.Amount)) - // (x_0)(y_0) = (x_0 + in)(y_0 - out) - tokenAmountIn := math.SolveConstantProductInvariant( - /*xPrior=*/ poolTokenOutBalance, - /*xAfter=*/ poolTokenOutBalancePostSwap, - /*xWeight=*/ sdk.NewDecFromInt(poolAssetOut.Weight), - /*yPrior=*/ sdk.NewDecFromInt(poolAssetIn.Token.Amount), - /*yWeight=*/ sdk.NewDecFromInt(poolAssetIn.Weight), - ).Neg() - - // We deduct a swap fee on the input asset. The swap happens by following the invariant curve on the input * (1 - swap fee) - // and then the swap fee is added to the pool. - // Thus in order to give X amount out, we solve the invariant for the invariant input. However invariant input = (1 - swapfee) * trade input. - // Therefore we divide by (1 - swapfee) here - tokenAmountInBeforeFee := tokenAmountIn.Quo(sdk.OneDec().Sub(pool.PoolParams.SwapFee)).Ceil().TruncateInt() - return sdk.NewCoin(tokenInDenom, tokenAmountInBeforeFee), nil -} - -/* -Applies a swap to the pool by adding tokenIn and removing tokenOut from pool asset balances. - -args: - - tokenIn: the amount of token to deposit - - tokenOut: the amount of token to withdraw - -ret: - - err: error if any -*/ -func (pool *Pool) ApplySwap(tokenIn sdk.Coin, tokenOut sdk.Coin) (err error) { - if tokenIn.Amount.LTE(sdk.ZeroInt()) { - return fmt.Errorf("tokenIn (%s) cannot be zero", tokenIn.Denom) - } - if tokenOut.Amount.LTE(sdk.ZeroInt()) { - return fmt.Errorf("tokenOut (%s) cannot be zero", tokenOut.Denom) - } - - _, poolAssetIn, err := pool.getPoolAssetAndIndex(tokenIn.Denom) - if err != nil { - return err - } - - _, poolAssetOut, err := pool.getPoolAssetAndIndex(tokenOut.Denom) - if err != nil { - return err - } - - poolAssetIn.Token.Amount = poolAssetIn.Token.Amount.Add(tokenIn.Amount) - poolAssetOut.Token.Amount = poolAssetOut.Token.Amount.Sub(tokenOut.Amount) - - return pool.updatePoolAssetBalances(poolAssetIn.Token, poolAssetOut.Token) -} diff --git a/x/spot/types/swap_test.go b/x/spot/types/swap_test.go deleted file mode 100644 index 29ea241a2..000000000 --- a/x/spot/types/swap_test.go +++ /dev/null @@ -1,362 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common" -) - -func TestCalcOutAmtGivenIn(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokenIn sdk.Coin - tokenOutDenom string - expectedTokenOut sdk.Coin - expectedFee sdk.Coin - shouldError bool - }{ - { - name: "simple swap", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenIn: sdk.NewInt64Coin("aaa", 10), - tokenOutDenom: "bbb", - expectedTokenOut: sdk.NewInt64Coin("bbb", 9), - expectedFee: sdk.NewInt64Coin("aaa", 0), // 0.0003 * 10 = 0.003, truncated to 0 - }, - { - name: "big simple numbers", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 100*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenIn: sdk.NewInt64Coin("aaa", 10), - tokenOutDenom: "bbb", - expectedTokenOut: sdk.NewInt64Coin("bbb", 9), - expectedFee: sdk.NewInt64Coin("aaa", 0), // 0.0003 * 10 = 0.003, truncated to 0 - }, - { - name: "big simple numbers, huge swap fee", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.5"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenIn: sdk.NewInt64Coin("aaa", 10), - tokenOutDenom: "bbb", - expectedTokenOut: sdk.NewInt64Coin("bbb", 4), - expectedFee: sdk.NewInt64Coin("aaa", 5), // 0.5 * 10 = 5 - }, - { - name: "real numbers", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3498723457), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 23318504), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenIn: sdk.NewInt64Coin("aaa", 5844683), - tokenOutDenom: "bbb", - // solved with wolfram alpha (https://www.wolframalpha.com/input?i=23318504+-+%283498723457*23318504%29%2F+%283498723457%2B5844683*%281-0.0003%29%29) - expectedTokenOut: sdk.NewInt64Coin("bbb", 38877), - expectedFee: sdk.NewInt64Coin("aaa", 1753), // 0.0003 * 5844683 = 1753.4049, truncated to 1753 - }, - { - name: "swap with very low output token amount", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenIn: sdk.NewInt64Coin("aaa", 1), - tokenOutDenom: "bbb", - shouldError: true, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - tokenOut, fee, err := tc.pool.CalcOutAmtGivenIn(tc.tokenIn, tc.tokenOutDenom, false) - if tc.shouldError { - require.Error(t, err) - } else { - require.NoError(t, err) - require.Equal(t, tc.expectedTokenOut, tokenOut) - require.True(t, tc.expectedFee.Equal(fee)) - } - }) - } -} - -func TestCalcInAmtGivenOut(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokenOut sdk.Coin - tokenInDenom string - expectedTokenIn sdk.Coin - }{ - { - name: "simple swap", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 100), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenOut: sdk.NewInt64Coin("bbb", 9), - tokenInDenom: "aaa", - expectedTokenIn: sdk.NewInt64Coin("aaa", 10), - }, - { - name: "big simple numbers", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 100*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenOut: sdk.NewInt64Coin("bbb", 9), - tokenInDenom: "aaa", - expectedTokenIn: sdk.NewInt64Coin("aaa", 10), - }, - { - name: "big simple numbers, huge swap fee", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.5"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 1*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 1*common.TO_MICRO), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - tokenOut: sdk.NewInt64Coin("bbb", 4), - tokenInDenom: "aaa", - expectedTokenIn: sdk.NewInt64Coin("aaa", 9), - }, - { - name: "real numbers", - pool: Pool{ - PoolParams: PoolParams{ - PoolType: PoolType_BALANCER, - SwapFee: sdk.MustNewDecFromStr("0.0003"), - }, - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 3498723457), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bbb", 23318504), - Weight: sdk.OneInt(), - }, - }, - TotalWeight: sdk.NewInt(2), - }, - // solved with wolfram alpha (https://www.wolframalpha.com/input?i=%28%283498723457*23318504%29%2F+%2823318504-38877%29+-+3498723457%29%2F%281-0.0003%29) - tokenOut: sdk.NewInt64Coin("bbb", 38877), - tokenInDenom: "aaa", - expectedTokenIn: sdk.NewInt64Coin("aaa", 5844626), - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - // CalcInAmtGivenOut is the inverse, so we can use the same test inputs/outputs - tokenIn, err := tc.pool.CalcInAmtGivenOut(tc.tokenOut, tc.tokenInDenom) - require.NoError(t, err) - require.Equal(t, tc.expectedTokenIn, tokenIn) - }) - } -} - -func TestApplySwap(t *testing.T) { - for _, tc := range []struct { - name string - pool Pool - tokenIn sdk.Coin - tokenOut sdk.Coin - expectedPoolAssets []PoolAsset - shouldError bool - }{ - { - name: "apply simple swap", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - }, - tokenIn: sdk.NewInt64Coin("aaa", 50), - tokenOut: sdk.NewInt64Coin("bbb", 75), - expectedPoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 150), - }, - { - Token: sdk.NewInt64Coin("bbb", 125), - }, - }, - shouldError: false, - }, - { - name: "swap fails due to too large numbers", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - }, - tokenIn: sdk.NewInt64Coin("aaa", 1), - tokenOut: sdk.NewInt64Coin("bbb", 201), - shouldError: true, - }, - { - name: "swap fails due to zero tokenIn", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - }, - tokenIn: sdk.NewInt64Coin("aaa", 0), - tokenOut: sdk.NewInt64Coin("bbb", 100), - shouldError: true, - }, - { - name: "swap fails due to zero tokenOut", - pool: Pool{ - PoolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("aaa", 100), - }, - { - Token: sdk.NewInt64Coin("bbb", 200), - }, - }, - }, - tokenIn: sdk.NewInt64Coin("aaa", 100), - tokenOut: sdk.NewInt64Coin("bbb", 0), - shouldError: true, - }, - } { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.pool.ApplySwap(tc.tokenIn, tc.tokenOut) - if tc.shouldError { - require.Error(t, err) - } else { - require.NoError(t, err) - require.Equal(t, tc.expectedPoolAssets, tc.pool.PoolAssets) - } - }) - } -} diff --git a/x/spot/types/tx.pb.go b/x/spot/types/tx.pb.go deleted file mode 100644 index 1b992e1ac..000000000 --- a/x/spot/types/tx.pb.go +++ /dev/null @@ -1,2363 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/spot/v1/tx.proto - -package types - -import ( - context "context" - fmt "fmt" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -type MsgCreatePool struct { - Creator string `protobuf:"bytes,1,opt,name=creator,proto3" json:"creator,omitempty"` - PoolParams *PoolParams `protobuf:"bytes,2,opt,name=pool_params,json=poolParams,proto3" json:"pool_params,omitempty" yaml:"pool_params"` - PoolAssets []PoolAsset `protobuf:"bytes,3,rep,name=pool_assets,json=poolAssets,proto3" json:"pool_assets"` -} - -func (m *MsgCreatePool) Reset() { *m = MsgCreatePool{} } -func (m *MsgCreatePool) String() string { return proto.CompactTextString(m) } -func (*MsgCreatePool) ProtoMessage() {} -func (*MsgCreatePool) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{0} -} -func (m *MsgCreatePool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreatePool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreatePool.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreatePool) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreatePool.Merge(m, src) -} -func (m *MsgCreatePool) XXX_Size() int { - return m.Size() -} -func (m *MsgCreatePool) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreatePool.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreatePool proto.InternalMessageInfo - -func (m *MsgCreatePool) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *MsgCreatePool) GetPoolParams() *PoolParams { - if m != nil { - return m.PoolParams - } - return nil -} - -func (m *MsgCreatePool) GetPoolAssets() []PoolAsset { - if m != nil { - return m.PoolAssets - } - return nil -} - -type MsgCreatePoolResponse struct { - PoolId uint64 `protobuf:"varint,1,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty"` -} - -func (m *MsgCreatePoolResponse) Reset() { *m = MsgCreatePoolResponse{} } -func (m *MsgCreatePoolResponse) String() string { return proto.CompactTextString(m) } -func (*MsgCreatePoolResponse) ProtoMessage() {} -func (*MsgCreatePoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{1} -} -func (m *MsgCreatePoolResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgCreatePoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgCreatePoolResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgCreatePoolResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgCreatePoolResponse.Merge(m, src) -} -func (m *MsgCreatePoolResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgCreatePoolResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgCreatePoolResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgCreatePoolResponse proto.InternalMessageInfo - -func (m *MsgCreatePoolResponse) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -// Message to join a pool (identified by poolId) with a set of tokens to deposit. -type MsgJoinPool struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` - PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` - TokensIn []types.Coin `protobuf:"bytes,3,rep,name=tokens_in,json=tokensIn,proto3" json:"tokens_in" yaml:"tokens_in"` - UseAllCoins bool `protobuf:"varint,4,opt,name=use_all_coins,json=useAllCoins,proto3" json:"use_all_coins,omitempty" yaml:"use_all_coins"` -} - -func (m *MsgJoinPool) Reset() { *m = MsgJoinPool{} } -func (m *MsgJoinPool) String() string { return proto.CompactTextString(m) } -func (*MsgJoinPool) ProtoMessage() {} -func (*MsgJoinPool) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{2} -} -func (m *MsgJoinPool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgJoinPool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgJoinPool.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgJoinPool) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgJoinPool.Merge(m, src) -} -func (m *MsgJoinPool) XXX_Size() int { - return m.Size() -} -func (m *MsgJoinPool) XXX_DiscardUnknown() { - xxx_messageInfo_MsgJoinPool.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgJoinPool proto.InternalMessageInfo - -func (m *MsgJoinPool) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgJoinPool) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *MsgJoinPool) GetTokensIn() []types.Coin { - if m != nil { - return m.TokensIn - } - return nil -} - -func (m *MsgJoinPool) GetUseAllCoins() bool { - if m != nil { - return m.UseAllCoins - } - return false -} - -// Response when a user joins a pool. -type MsgJoinPoolResponse struct { - // the final state of the pool after a join - Pool *Pool `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` - // sum of LP tokens minted from the join - NumPoolSharesOut types.Coin `protobuf:"bytes,2,opt,name=num_pool_shares_out,json=numPoolSharesOut,proto3" json:"num_pool_shares_out" yaml:"num_pool_shares_out"` - // remaining tokens from attempting to join the pool - RemainingCoins []types.Coin `protobuf:"bytes,3,rep,name=remaining_coins,json=remainingCoins,proto3" json:"remaining_coins" yaml:"tokens_in"` -} - -func (m *MsgJoinPoolResponse) Reset() { *m = MsgJoinPoolResponse{} } -func (m *MsgJoinPoolResponse) String() string { return proto.CompactTextString(m) } -func (*MsgJoinPoolResponse) ProtoMessage() {} -func (*MsgJoinPoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{3} -} -func (m *MsgJoinPoolResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgJoinPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgJoinPoolResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgJoinPoolResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgJoinPoolResponse.Merge(m, src) -} -func (m *MsgJoinPoolResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgJoinPoolResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgJoinPoolResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgJoinPoolResponse proto.InternalMessageInfo - -func (m *MsgJoinPoolResponse) GetPool() *Pool { - if m != nil { - return m.Pool - } - return nil -} - -func (m *MsgJoinPoolResponse) GetNumPoolSharesOut() types.Coin { - if m != nil { - return m.NumPoolSharesOut - } - return types.Coin{} -} - -func (m *MsgJoinPoolResponse) GetRemainingCoins() []types.Coin { - if m != nil { - return m.RemainingCoins - } - return nil -} - -type MsgExitPool struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` - PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` - PoolShares types.Coin `protobuf:"bytes,3,opt,name=pool_shares,json=poolShares,proto3" json:"pool_shares" yaml:"pool_shares"` -} - -func (m *MsgExitPool) Reset() { *m = MsgExitPool{} } -func (m *MsgExitPool) String() string { return proto.CompactTextString(m) } -func (*MsgExitPool) ProtoMessage() {} -func (*MsgExitPool) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{4} -} -func (m *MsgExitPool) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgExitPool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgExitPool.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgExitPool) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgExitPool.Merge(m, src) -} -func (m *MsgExitPool) XXX_Size() int { - return m.Size() -} -func (m *MsgExitPool) XXX_DiscardUnknown() { - xxx_messageInfo_MsgExitPool.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgExitPool proto.InternalMessageInfo - -func (m *MsgExitPool) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgExitPool) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *MsgExitPool) GetPoolShares() types.Coin { - if m != nil { - return m.PoolShares - } - return types.Coin{} -} - -type MsgExitPoolResponse struct { - TokensOut []types.Coin `protobuf:"bytes,3,rep,name=tokens_out,json=tokensOut,proto3" json:"tokens_out" yaml:"tokens_out"` -} - -func (m *MsgExitPoolResponse) Reset() { *m = MsgExitPoolResponse{} } -func (m *MsgExitPoolResponse) String() string { return proto.CompactTextString(m) } -func (*MsgExitPoolResponse) ProtoMessage() {} -func (*MsgExitPoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{5} -} -func (m *MsgExitPoolResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgExitPoolResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgExitPoolResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgExitPoolResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgExitPoolResponse.Merge(m, src) -} -func (m *MsgExitPoolResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgExitPoolResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgExitPoolResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgExitPoolResponse proto.InternalMessageInfo - -func (m *MsgExitPoolResponse) GetTokensOut() []types.Coin { - if m != nil { - return m.TokensOut - } - return nil -} - -type MsgSwapAssets struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` - PoolId uint64 `protobuf:"varint,2,opt,name=pool_id,json=poolId,proto3" json:"pool_id,omitempty" yaml:"pool_id"` - TokenIn types.Coin `protobuf:"bytes,3,opt,name=token_in,json=tokenIn,proto3" json:"token_in" yaml:"token_in"` - TokenOutDenom string `protobuf:"bytes,4,opt,name=token_out_denom,json=tokenOutDenom,proto3" json:"token_out_denom,omitempty" yaml:"token_out_denom"` -} - -func (m *MsgSwapAssets) Reset() { *m = MsgSwapAssets{} } -func (m *MsgSwapAssets) String() string { return proto.CompactTextString(m) } -func (*MsgSwapAssets) ProtoMessage() {} -func (*MsgSwapAssets) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{6} -} -func (m *MsgSwapAssets) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSwapAssets) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSwapAssets.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgSwapAssets) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSwapAssets.Merge(m, src) -} -func (m *MsgSwapAssets) XXX_Size() int { - return m.Size() -} -func (m *MsgSwapAssets) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSwapAssets.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSwapAssets proto.InternalMessageInfo - -func (m *MsgSwapAssets) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgSwapAssets) GetPoolId() uint64 { - if m != nil { - return m.PoolId - } - return 0 -} - -func (m *MsgSwapAssets) GetTokenIn() types.Coin { - if m != nil { - return m.TokenIn - } - return types.Coin{} -} - -func (m *MsgSwapAssets) GetTokenOutDenom() string { - if m != nil { - return m.TokenOutDenom - } - return "" -} - -type MsgSwapAssetsResponse struct { - TokenOut types.Coin `protobuf:"bytes,3,opt,name=token_out,json=tokenOut,proto3" json:"token_out" yaml:"token_out"` -} - -func (m *MsgSwapAssetsResponse) Reset() { *m = MsgSwapAssetsResponse{} } -func (m *MsgSwapAssetsResponse) String() string { return proto.CompactTextString(m) } -func (*MsgSwapAssetsResponse) ProtoMessage() {} -func (*MsgSwapAssetsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_2ac7099e2729ab26, []int{7} -} -func (m *MsgSwapAssetsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgSwapAssetsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgSwapAssetsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgSwapAssetsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgSwapAssetsResponse.Merge(m, src) -} -func (m *MsgSwapAssetsResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgSwapAssetsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgSwapAssetsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgSwapAssetsResponse proto.InternalMessageInfo - -func (m *MsgSwapAssetsResponse) GetTokenOut() types.Coin { - if m != nil { - return m.TokenOut - } - return types.Coin{} -} - -func init() { - proto.RegisterType((*MsgCreatePool)(nil), "nibiru.spot.v1.MsgCreatePool") - proto.RegisterType((*MsgCreatePoolResponse)(nil), "nibiru.spot.v1.MsgCreatePoolResponse") - proto.RegisterType((*MsgJoinPool)(nil), "nibiru.spot.v1.MsgJoinPool") - proto.RegisterType((*MsgJoinPoolResponse)(nil), "nibiru.spot.v1.MsgJoinPoolResponse") - proto.RegisterType((*MsgExitPool)(nil), "nibiru.spot.v1.MsgExitPool") - proto.RegisterType((*MsgExitPoolResponse)(nil), "nibiru.spot.v1.MsgExitPoolResponse") - proto.RegisterType((*MsgSwapAssets)(nil), "nibiru.spot.v1.MsgSwapAssets") - proto.RegisterType((*MsgSwapAssetsResponse)(nil), "nibiru.spot.v1.MsgSwapAssetsResponse") -} - -func init() { proto.RegisterFile("nibiru/spot/v1/tx.proto", fileDescriptor_2ac7099e2729ab26) } - -var fileDescriptor_2ac7099e2729ab26 = []byte{ - // 832 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x55, 0x41, 0x6f, 0xe3, 0x44, - 0x14, 0xae, 0x9b, 0xa8, 0x4d, 0x27, 0x4a, 0xbb, 0x75, 0xcb, 0xd6, 0xf1, 0xb2, 0x49, 0x34, 0x2b, - 0xa4, 0x00, 0x92, 0x4d, 0xc2, 0x0d, 0x71, 0x60, 0x9d, 0xe5, 0x50, 0xa4, 0xd0, 0xca, 0x91, 0x38, - 0x20, 0xa4, 0x68, 0x92, 0x8c, 0xdc, 0x59, 0xec, 0x19, 0x93, 0x19, 0xb7, 0x59, 0x21, 0x2e, 0x5c, - 0xb9, 0x20, 0xf1, 0x7b, 0x90, 0x38, 0xee, 0x71, 0xa5, 0xbd, 0x70, 0x8a, 0x50, 0xcb, 0x2f, 0x88, - 0xc4, 0x85, 0x13, 0xf2, 0xcc, 0xd8, 0x75, 0x8a, 0xd5, 0x08, 0xa1, 0xde, 0x3c, 0xef, 0xbd, 0xf9, - 0xde, 0xfb, 0xbe, 0xf7, 0xde, 0x18, 0x9c, 0x50, 0x32, 0x21, 0xf3, 0xc4, 0xe5, 0x31, 0x13, 0xee, - 0x65, 0xcf, 0x15, 0x0b, 0x27, 0x9e, 0x33, 0xc1, 0xcc, 0x7d, 0xe5, 0x70, 0x52, 0x87, 0x73, 0xd9, - 0xb3, 0x9b, 0x77, 0x02, 0x63, 0xc6, 0x42, 0x15, 0x6a, 0x1f, 0x07, 0x2c, 0x60, 0xf2, 0xd3, 0x4d, - 0xbf, 0xb4, 0xb5, 0x35, 0x65, 0x3c, 0x62, 0xdc, 0x9d, 0x20, 0x8e, 0xdd, 0xcb, 0xde, 0x04, 0x0b, - 0xd4, 0x73, 0xa7, 0x8c, 0x50, 0xed, 0x7f, 0x37, 0x60, 0x2c, 0x08, 0xb1, 0x8b, 0x62, 0xe2, 0x22, - 0x4a, 0x99, 0x40, 0x82, 0x30, 0xca, 0x95, 0x17, 0xfe, 0x66, 0x80, 0xc6, 0x90, 0x07, 0x83, 0x39, - 0x46, 0x02, 0x9f, 0x33, 0x16, 0x9a, 0x16, 0xd8, 0x9d, 0xa6, 0x27, 0x36, 0xb7, 0x8c, 0x8e, 0xd1, - 0xdd, 0xf3, 0xb3, 0xa3, 0x39, 0x02, 0xf5, 0xb4, 0x9a, 0x71, 0x8c, 0xe6, 0x28, 0xe2, 0xd6, 0x76, - 0xc7, 0xe8, 0xd6, 0xfb, 0xb6, 0xb3, 0x4e, 0xc0, 0x49, 0x41, 0xce, 0x65, 0x84, 0xf7, 0x78, 0xb5, - 0x6c, 0x9b, 0xaf, 0x50, 0x14, 0x7e, 0x02, 0x0b, 0x17, 0xa1, 0x0f, 0xe2, 0x3c, 0xc6, 0xfc, 0x4c, - 0x83, 0x22, 0xce, 0xb1, 0xe0, 0x56, 0xa5, 0x53, 0xe9, 0xd6, 0xfb, 0xcd, 0x32, 0xd0, 0xe7, 0x69, - 0x84, 0x57, 0x7d, 0xbd, 0x6c, 0x6f, 0x29, 0x04, 0x69, 0xe0, 0xf0, 0x23, 0xf0, 0xce, 0x1a, 0x03, - 0x1f, 0xf3, 0x98, 0x51, 0x8e, 0xcd, 0x13, 0xb0, 0x2b, 0xa1, 0xc9, 0x4c, 0x32, 0xa9, 0xfa, 0x3b, - 0xe9, 0xf1, 0x74, 0x06, 0xff, 0x32, 0x40, 0x7d, 0xc8, 0x83, 0x2f, 0x18, 0xa1, 0x92, 0xf2, 0xfb, - 0x60, 0x87, 0x63, 0x3a, 0xc3, 0x9a, 0xb1, 0x77, 0xb8, 0x5a, 0xb6, 0x1b, 0xaa, 0x6e, 0x65, 0x87, - 0xbe, 0x0e, 0x30, 0x3f, 0xbc, 0xc5, 0x4c, 0xf9, 0x57, 0x3d, 0x73, 0xb5, 0x6c, 0xef, 0x17, 0x38, - 0x92, 0x19, 0xcc, 0xf2, 0x98, 0xe7, 0x60, 0x4f, 0xb0, 0x6f, 0x31, 0xe5, 0x63, 0x42, 0x73, 0x66, - 0xaa, 0x5d, 0x4e, 0xda, 0x2e, 0x47, 0xb7, 0xcb, 0x19, 0x30, 0x42, 0x3d, 0x2b, 0x65, 0xb6, 0x5a, - 0xb6, 0x1f, 0x29, 0xb4, 0xfc, 0x26, 0xf4, 0x6b, 0xea, 0xfb, 0x94, 0x9a, 0x9f, 0x82, 0x46, 0xc2, - 0xf1, 0x18, 0x85, 0xe1, 0x38, 0x6d, 0x31, 0xb7, 0xaa, 0x1d, 0xa3, 0x5b, 0xf3, 0xac, 0xd5, 0xb2, - 0x7d, 0xac, 0xae, 0xad, 0xb9, 0xa1, 0x5f, 0x4f, 0x38, 0x7e, 0x1e, 0x86, 0x03, 0x79, 0xfa, 0x69, - 0x1b, 0x1c, 0x15, 0x78, 0xe7, 0x42, 0x75, 0x41, 0x35, 0xad, 0x58, 0xb2, 0xaf, 0xf7, 0x8f, 0xcb, - 0xc4, 0xf7, 0x65, 0x84, 0x19, 0x82, 0x23, 0x9a, 0x44, 0x63, 0xc9, 0x94, 0x5f, 0xa0, 0x39, 0xe6, - 0x63, 0x96, 0x08, 0x3d, 0x0a, 0xf7, 0x70, 0x83, 0x9a, 0x9b, 0xad, 0x8a, 0x2c, 0xc1, 0x80, 0xfe, - 0x23, 0x9a, 0x44, 0x69, 0xaa, 0x91, 0xb4, 0x9d, 0x25, 0xc2, 0xfc, 0x06, 0x1c, 0xcc, 0x71, 0x84, - 0x08, 0x25, 0x34, 0xd0, 0x7c, 0xff, 0x87, 0x8a, 0xfb, 0x39, 0x96, 0x52, 0xe3, 0x57, 0x35, 0x05, - 0x9f, 0x2f, 0x88, 0x78, 0xd0, 0x29, 0xf8, 0x4a, 0x4f, 0xb8, 0xe2, 0x6a, 0x55, 0x36, 0x69, 0x65, - 0x6b, 0x06, 0xc5, 0xcd, 0x51, 0x77, 0xf5, 0xe6, 0x28, 0x81, 0xe0, 0x4b, 0xd9, 0xcc, 0xac, 0xfc, - 0xbc, 0x99, 0x23, 0x00, 0x34, 0xe9, 0xb4, 0x33, 0x1b, 0xf5, 0x6a, 0xea, 0x6c, 0x87, 0x6b, 0x7a, - 0xc9, 0x86, 0xe8, 0xe1, 0x3d, 0x4b, 0x04, 0xfc, 0x5b, 0x3d, 0x13, 0xa3, 0x2b, 0x14, 0xab, 0xad, - 0x7b, 0x30, 0xb5, 0x86, 0x40, 0x4d, 0xbb, 0x5a, 0x99, 0x0d, 0x52, 0x9d, 0xe8, 0xe2, 0x0f, 0x0a, - 0xc5, 0xcb, 0x5e, 0xef, 0xca, 0xcf, 0x53, 0x6a, 0x7a, 0xe0, 0x40, 0x59, 0x59, 0x22, 0xc6, 0x33, - 0x4c, 0x59, 0x24, 0x57, 0x66, 0xcf, 0xb3, 0x57, 0xcb, 0xf6, 0xe3, 0xe2, 0xb5, 0x3c, 0x00, 0xfa, - 0x0d, 0x69, 0x39, 0x4b, 0xc4, 0x0b, 0x79, 0x26, 0xf2, 0x81, 0xb9, 0xe5, 0x9e, 0x4b, 0x9d, 0xed, - 0xb7, 0x56, 0xda, 0xf8, 0xef, 0x93, 0xa9, 0x84, 0xae, 0x65, 0xf9, 0xfa, 0x6f, 0x2b, 0xa0, 0x32, - 0xe4, 0x81, 0x19, 0x01, 0x50, 0x78, 0x92, 0x9f, 0xde, 0xdd, 0xc8, 0xb5, 0xf7, 0xce, 0x7e, 0xef, - 0x5e, 0x77, 0x56, 0x2d, 0x6c, 0xfe, 0xf8, 0xf6, 0xcf, 0x5f, 0xb6, 0x8f, 0xe0, 0xa1, 0x5b, 0xfc, - 0xc5, 0xc8, 0xb5, 0xfe, 0x0e, 0xd4, 0xf2, 0xc7, 0xf0, 0x49, 0x09, 0x5a, 0xe6, 0xb4, 0x9f, 0xdd, - 0xe3, 0xcc, 0x13, 0x3d, 0x93, 0x89, 0x9e, 0xc2, 0x27, 0x6b, 0x89, 0xbe, 0xd7, 0xad, 0xfe, 0xc1, - 0x7d, 0xc9, 0x08, 0x4d, 0x53, 0xe6, 0x9b, 0x57, 0x96, 0x32, 0x73, 0x96, 0xa6, 0xbc, 0x3b, 0xf4, - 0x1b, 0x53, 0xe2, 0x05, 0x11, 0xe6, 0x15, 0x00, 0x85, 0x01, 0x2e, 0x13, 0xf5, 0xd6, 0x5d, 0x2a, - 0xea, 0xbf, 0x47, 0x60, 0x63, 0x62, 0x7e, 0x85, 0x62, 0xef, 0xc5, 0xeb, 0xeb, 0x96, 0xf1, 0xe6, - 0xba, 0x65, 0xfc, 0x71, 0xdd, 0x32, 0x7e, 0xbe, 0x69, 0x6d, 0xbd, 0xb9, 0x69, 0x6d, 0xfd, 0x7e, - 0xd3, 0xda, 0xfa, 0xfa, 0x83, 0x80, 0x88, 0x8b, 0x64, 0xe2, 0x4c, 0x59, 0xe4, 0x7e, 0x29, 0x01, - 0x06, 0x17, 0x88, 0xd0, 0x0c, 0x6c, 0xa1, 0xe0, 0xc4, 0xab, 0x18, 0xf3, 0xc9, 0x8e, 0xfc, 0x63, - 0x7f, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x79, 0xa8, 0xd2, 0xbd, 0x4b, 0x08, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// MsgClient is the client API for Msg service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type MsgClient interface { - // Used to create a pool. - CreatePool(ctx context.Context, in *MsgCreatePool, opts ...grpc.CallOption) (*MsgCreatePoolResponse, error) - // Join a pool as a liquidity provider. - JoinPool(ctx context.Context, in *MsgJoinPool, opts ...grpc.CallOption) (*MsgJoinPoolResponse, error) - // Exit a pool position by returning LP shares - ExitPool(ctx context.Context, in *MsgExitPool, opts ...grpc.CallOption) (*MsgExitPoolResponse, error) - // Swap assets in a pool - SwapAssets(ctx context.Context, in *MsgSwapAssets, opts ...grpc.CallOption) (*MsgSwapAssetsResponse, error) -} - -type msgClient struct { - cc grpc1.ClientConn -} - -func NewMsgClient(cc grpc1.ClientConn) MsgClient { - return &msgClient{cc} -} - -func (c *msgClient) CreatePool(ctx context.Context, in *MsgCreatePool, opts ...grpc.CallOption) (*MsgCreatePoolResponse, error) { - out := new(MsgCreatePoolResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Msg/CreatePool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) JoinPool(ctx context.Context, in *MsgJoinPool, opts ...grpc.CallOption) (*MsgJoinPoolResponse, error) { - out := new(MsgJoinPoolResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Msg/JoinPool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) ExitPool(ctx context.Context, in *MsgExitPool, opts ...grpc.CallOption) (*MsgExitPoolResponse, error) { - out := new(MsgExitPoolResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Msg/ExitPool", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *msgClient) SwapAssets(ctx context.Context, in *MsgSwapAssets, opts ...grpc.CallOption) (*MsgSwapAssetsResponse, error) { - out := new(MsgSwapAssetsResponse) - err := c.cc.Invoke(ctx, "/nibiru.spot.v1.Msg/SwapAssets", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MsgServer is the server API for Msg service. -type MsgServer interface { - // Used to create a pool. - CreatePool(context.Context, *MsgCreatePool) (*MsgCreatePoolResponse, error) - // Join a pool as a liquidity provider. - JoinPool(context.Context, *MsgJoinPool) (*MsgJoinPoolResponse, error) - // Exit a pool position by returning LP shares - ExitPool(context.Context, *MsgExitPool) (*MsgExitPoolResponse, error) - // Swap assets in a pool - SwapAssets(context.Context, *MsgSwapAssets) (*MsgSwapAssetsResponse, error) -} - -// UnimplementedMsgServer can be embedded to have forward compatible implementations. -type UnimplementedMsgServer struct { -} - -func (*UnimplementedMsgServer) CreatePool(ctx context.Context, req *MsgCreatePool) (*MsgCreatePoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreatePool not implemented") -} -func (*UnimplementedMsgServer) JoinPool(ctx context.Context, req *MsgJoinPool) (*MsgJoinPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method JoinPool not implemented") -} -func (*UnimplementedMsgServer) ExitPool(ctx context.Context, req *MsgExitPool) (*MsgExitPoolResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ExitPool not implemented") -} -func (*UnimplementedMsgServer) SwapAssets(ctx context.Context, req *MsgSwapAssets) (*MsgSwapAssetsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SwapAssets not implemented") -} - -func RegisterMsgServer(s grpc1.Server, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_CreatePool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgCreatePool) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).CreatePool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Msg/CreatePool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).CreatePool(ctx, req.(*MsgCreatePool)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_JoinPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgJoinPool) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).JoinPool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Msg/JoinPool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).JoinPool(ctx, req.(*MsgJoinPool)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_ExitPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgExitPool) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).ExitPool(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Msg/ExitPool", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).ExitPool(ctx, req.(*MsgExitPool)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_SwapAssets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgSwapAssets) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).SwapAssets(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.spot.v1.Msg/SwapAssets", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).SwapAssets(ctx, req.(*MsgSwapAssets)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.spot.v1.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreatePool", - Handler: _Msg_CreatePool_Handler, - }, - { - MethodName: "JoinPool", - Handler: _Msg_JoinPool_Handler, - }, - { - MethodName: "ExitPool", - Handler: _Msg_ExitPool_Handler, - }, - { - MethodName: "SwapAssets", - Handler: _Msg_SwapAssets_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/spot/v1/tx.proto", -} - -func (m *MsgCreatePool) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreatePool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreatePool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.PoolAssets) > 0 { - for iNdEx := len(m.PoolAssets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.PoolAssets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.PoolParams != nil { - { - size, err := m.PoolParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.Creator) > 0 { - i -= len(m.Creator) - copy(dAtA[i:], m.Creator) - i = encodeVarintTx(dAtA, i, uint64(len(m.Creator))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgCreatePoolResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgCreatePoolResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgCreatePoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.PoolId != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *MsgJoinPool) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgJoinPool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgJoinPool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.UseAllCoins { - i-- - if m.UseAllCoins { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.TokensIn) > 0 { - for iNdEx := len(m.TokensIn) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensIn[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.PoolId != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x10 - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgJoinPoolResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgJoinPoolResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgJoinPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.RemainingCoins) > 0 { - for iNdEx := len(m.RemainingCoins) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RemainingCoins[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - { - size, err := m.NumPoolSharesOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.Pool != nil { - { - size, err := m.Pool.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgExitPool) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgExitPool) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgExitPool) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.PoolShares.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.PoolId != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x10 - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgExitPoolResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgExitPoolResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgExitPoolResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokensOut) > 0 { - for iNdEx := len(m.TokensOut) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.TokensOut[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - return len(dAtA) - i, nil -} - -func (m *MsgSwapAssets) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgSwapAssets) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgSwapAssets) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.TokenOutDenom) > 0 { - i -= len(m.TokenOutDenom) - copy(dAtA[i:], m.TokenOutDenom) - i = encodeVarintTx(dAtA, i, uint64(len(m.TokenOutDenom))) - i-- - dAtA[i] = 0x22 - } - { - size, err := m.TokenIn.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - if m.PoolId != 0 { - i = encodeVarintTx(dAtA, i, uint64(m.PoolId)) - i-- - dAtA[i] = 0x10 - } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgSwapAssetsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgSwapAssetsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgSwapAssetsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.TokenOut.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - return len(dAtA) - i, nil -} - -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *MsgCreatePool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Creator) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.PoolParams != nil { - l = m.PoolParams.Size() - n += 1 + l + sovTx(uint64(l)) - } - if len(m.PoolAssets) > 0 { - for _, e := range m.PoolAssets { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgCreatePoolResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.PoolId != 0 { - n += 1 + sovTx(uint64(m.PoolId)) - } - return n -} - -func (m *MsgJoinPool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.PoolId != 0 { - n += 1 + sovTx(uint64(m.PoolId)) - } - if len(m.TokensIn) > 0 { - for _, e := range m.TokensIn { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - if m.UseAllCoins { - n += 2 - } - return n -} - -func (m *MsgJoinPoolResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Pool != nil { - l = m.Pool.Size() - n += 1 + l + sovTx(uint64(l)) - } - l = m.NumPoolSharesOut.Size() - n += 1 + l + sovTx(uint64(l)) - if len(m.RemainingCoins) > 0 { - for _, e := range m.RemainingCoins { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgExitPool) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.PoolId != 0 { - n += 1 + sovTx(uint64(m.PoolId)) - } - l = m.PoolShares.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgExitPoolResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TokensOut) > 0 { - for _, e := range m.TokensOut { - l = e.Size() - n += 1 + l + sovTx(uint64(l)) - } - } - return n -} - -func (m *MsgSwapAssets) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.PoolId != 0 { - n += 1 + sovTx(uint64(m.PoolId)) - } - l = m.TokenIn.Size() - n += 1 + l + sovTx(uint64(l)) - l = len(m.TokenOutDenom) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - return n -} - -func (m *MsgSwapAssetsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.TokenOut.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *MsgCreatePool) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreatePool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreatePool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Creator", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Creator = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolParams", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.PoolParams == nil { - m.PoolParams = &PoolParams{} - } - if err := m.PoolParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolAssets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PoolAssets = append(m.PoolAssets, PoolAsset{}) - if err := m.PoolAssets[len(m.PoolAssets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgCreatePoolResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgCreatePoolResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreatePoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgJoinPool) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgJoinPool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgJoinPool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensIn = append(m.TokensIn, types.Coin{}) - if err := m.TokensIn[len(m.TokensIn)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UseAllCoins", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.UseAllCoins = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgJoinPoolResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgJoinPoolResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgJoinPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pool", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Pool == nil { - m.Pool = &Pool{} - } - if err := m.Pool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NumPoolSharesOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.NumPoolSharesOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RemainingCoins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RemainingCoins = append(m.RemainingCoins, types.Coin{}) - if err := m.RemainingCoins[len(m.RemainingCoins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgExitPool) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgExitPool: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgExitPool: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolShares", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.PoolShares.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgExitPoolResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgExitPoolResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgExitPoolResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokensOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokensOut = append(m.TokensOut, types.Coin{}) - if err := m.TokensOut[len(m.TokensOut)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgSwapAssets) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgSwapAssets: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSwapAssets: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field PoolId", wireType) - } - m.PoolId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.PoolId |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenIn", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenIn.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOutDenom", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenOutDenom = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgSwapAssetsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgSwapAssetsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgSwapAssetsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenOut", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.TokenOut.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipTx(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowTx - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthTx - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupTx - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthTx - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/spot/types/tx.pb.gw.go b/x/spot/types/tx.pb.gw.go deleted file mode 100644 index c20b4b91f..000000000 --- a/x/spot/types/tx.pb.gw.go +++ /dev/null @@ -1,528 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/spot/v1/tx.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -var ( - filter_Msg_CreatePool_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_CreatePool_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgCreatePool - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_CreatePool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.CreatePool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_CreatePool_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgCreatePool - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_CreatePool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.CreatePool(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_JoinPool_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Msg_JoinPool_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgJoinPool - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_JoinPool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.JoinPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_JoinPool_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgJoinPool - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_JoinPool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.JoinPool(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_ExitPool_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Msg_ExitPool_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgExitPool - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ExitPool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ExitPool(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_ExitPool_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgExitPool - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ExitPool_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.ExitPool(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Msg_SwapAssets_0 = &utilities.DoubleArray{Encoding: map[string]int{"pool_id": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} -) - -func request_Msg_SwapAssets_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgSwapAssets - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_SwapAssets_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.SwapAssets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_SwapAssets_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgSwapAssets - var metadata runtime.ServerMetadata - - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["pool_id"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pool_id") - } - - protoReq.PoolId, err = runtime.Uint64(val) - - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pool_id", err) - } - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_SwapAssets_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.SwapAssets(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". -// UnaryRPC :call MsgServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMsgHandlerFromEndpoint instead. -func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MsgServer) error { - - mux.Handle("POST", pattern_Msg_CreatePool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_CreatePool_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_CreatePool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_JoinPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_JoinPool_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_JoinPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_ExitPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_ExitPool_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_ExitPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_SwapAssets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_SwapAssets_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_SwapAssets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterMsgHandlerFromEndpoint is same as RegisterMsgHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterMsgHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterMsgHandler(ctx, mux, conn) -} - -// RegisterMsgHandler registers the http handlers for service Msg to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterMsgHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterMsgHandlerClient(ctx, mux, NewMsgClient(conn)) -} - -// RegisterMsgHandlerClient registers the http handlers for service Msg -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MsgClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MsgClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "MsgClient" to call the correct interceptors. -func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MsgClient) error { - - mux.Handle("POST", pattern_Msg_CreatePool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_CreatePool_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_CreatePool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_JoinPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_JoinPool_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_JoinPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_ExitPool_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_ExitPool_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_ExitPool_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_Msg_SwapAssets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_SwapAssets_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_SwapAssets_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Msg_CreatePool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "spot", "pool"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_JoinPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"nibiru", "spot", "pool_id", "join"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_ExitPool_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"nibiru", "spot", "pool_id", "exit"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_SwapAssets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"nibiru", "spot", "pool_id", "swap"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Msg_CreatePool_0 = runtime.ForwardResponseMessage - - forward_Msg_JoinPool_0 = runtime.ForwardResponseMessage - - forward_Msg_ExitPool_0 = runtime.ForwardResponseMessage - - forward_Msg_SwapAssets_0 = runtime.ForwardResponseMessage -) diff --git a/x/spot/types/utils.go b/x/spot/types/utils.go deleted file mode 100644 index 555bb71c8..000000000 --- a/x/spot/types/utils.go +++ /dev/null @@ -1,74 +0,0 @@ -package types - -import ( - fmt "fmt" - "sort" - "strings" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -/* -given a pool, find the poolAsset with a given denom. - -args: - - poolAssets: all of the pool's assets. Must be sorted. - - denom: the denom string to search for - -ret: - - index: the index of the denom in the pool assets - - poolAsset: the pool asset itself - - err: error if any -*/ -func (pool Pool) getPoolAssetAndIndex(denom string) ( - index int, poolAsset PoolAsset, err error, -) { - if denom == "" { - return -1, PoolAsset{}, fmt.Errorf("empty denom") - } - - if len(pool.PoolAssets) == 0 { - return -1, PoolAsset{}, fmt.Errorf("empty pool assets") - } - - // binary search for the asset. poolAssets must be sorted. - i := sort.Search(len(pool.PoolAssets), func(i int) bool { - compare := strings.Compare(pool.PoolAssets[i].Token.Denom, denom) - return compare >= 0 - }) - - if i < 0 || i >= len(pool.PoolAssets) || pool.PoolAssets[i].Token.Denom != denom { - return -1, PoolAsset{}, ErrTokenDenomNotFound.Wrapf("could not find denom %s in pool id %d", denom, pool.Id) - } - - return i, pool.PoolAssets[i], nil -} - -/* -Maps poolAssets to its underlying coins. - -ret: - - coins: all the coins in the pool assets - -args: - - poolAssets: the slice of pool assets -*/ -func (pool Pool) PoolBalances() sdk.Coins { - coins := sdk.NewCoins() - for _, asset := range pool.PoolAssets { - coins = coins.Add(asset.Token) - } - return coins -} - -/* -Sorts poolAssets in place by denom, lexicographically increasing. - -args: - - poolAssets: the pool assets to sort -*/ -func sortPoolAssetsByDenom(poolAssets []PoolAsset) { - sort.Slice(poolAssets, func(i, j int) bool { - return strings.Compare(poolAssets[i].Token.Denom, poolAssets[j].Token.Denom) == -1 - }) -} diff --git a/x/spot/types/utils_test.go b/x/spot/types/utils_test.go deleted file mode 100644 index ce690ee3f..000000000 --- a/x/spot/types/utils_test.go +++ /dev/null @@ -1,250 +0,0 @@ -package types - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestGetPoolAssetAndIndexHappyPath(t *testing.T) { - tests := []struct { - name string - poolAssets []PoolAsset - denom string - expectedPoolAsset PoolAsset - expectedIndex int - }{ - { - name: "single asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - denom: "foo", - expectedPoolAsset: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - expectedIndex: 0, - }, - { - name: "middle asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("zee", 100), - Weight: sdk.OneInt(), - }, - }, - denom: "foo", - expectedPoolAsset: PoolAsset{ - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - expectedIndex: 1, - }, - { - name: "asset to the left", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - Weight: sdk.OneInt(), - }, - }, - denom: "bar", - expectedPoolAsset: PoolAsset{ - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - expectedIndex: 0, - }, - } - - for _, testcase := range tests { - tc := testcase - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - PoolAssets: tc.poolAssets, - } - index, poolAsset, err := pool.getPoolAssetAndIndex(tc.denom) - require.NoError(t, err) - require.Equal(t, tc.expectedIndex, index) - require.Equal(t, tc.expectedPoolAsset, poolAsset) - }) - } -} - -func TestGetPoolAssetAndIndexErrors(t *testing.T) { - tests := []struct { - name string - poolAssets []PoolAsset - denom string - expectedError string - }{ - { - name: "empty pool assets", - poolAssets: []PoolAsset{}, - denom: "foo", - expectedError: "Empty pool assets.", - }, - { - name: "empty denom", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - denom: "", - expectedError: "Empty denom.", - }, - { - name: "denom not found - input denom lexicographically higher", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - }, - denom: "foo", - expectedError: "Did not find the PoolAsset (foo)", - }, - { - name: "denom not found - input denom lexicographically lower", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - denom: "bar", - expectedError: "Did not find the PoolAsset (bar)", - }, - } - - for _, testcase := range tests { - tc := testcase - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - PoolAssets: tc.poolAssets, - } - _, _, err := pool.getPoolAssetAndIndex(tc.denom) - require.Errorf(t, err, tc.expectedError) - }) - } -} - -func TestPoolBalances(t *testing.T) { - tests := []struct { - name string - poolAssets []PoolAsset - expectedCoins sdk.Coins - }{ - { - name: "happy path single asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - expectedCoins: sdk.NewCoins(sdk.NewInt64Coin("foo", 100)), - }, - { - name: "happy path multiple asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("foo", 200), - Weight: sdk.OneInt(), - }, - }, - expectedCoins: sdk.NewCoins( - sdk.NewInt64Coin("bar", 100), - sdk.NewInt64Coin("foo", 200), - ), - }, - } - - for _, testcase := range tests { - tc := testcase - t.Run(tc.name, func(t *testing.T) { - pool := Pool{ - PoolAssets: tc.poolAssets, - } - require.Equal(t, tc.expectedCoins, pool.PoolBalances()) - }) - } -} - -func TestSortPoolAssets(t *testing.T) { - tests := []struct { - name string - poolAssets []PoolAsset - expectedPoolAsset []PoolAsset - }{ - { - name: "single asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - expectedPoolAsset: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - }, - { - name: "happy path multiple asset", - poolAssets: []PoolAsset{ - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("bar", 200), - Weight: sdk.OneInt(), - }, - }, - expectedPoolAsset: []PoolAsset{ - { - Token: sdk.NewInt64Coin("bar", 200), - Weight: sdk.OneInt(), - }, - { - Token: sdk.NewInt64Coin("foo", 100), - Weight: sdk.OneInt(), - }, - }, - }, - } - - for _, testcase := range tests { - tc := testcase - t.Run(tc.name, func(t *testing.T) { - sortPoolAssetsByDenom(tc.poolAssets) - require.Equal(t, tc.expectedPoolAsset, tc.poolAssets) - }) - } -} From bc869fa1b68a760dcb60ab0db842152b072ea010 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 17 Oct 2023 15:21:43 -0500 Subject: [PATCH 05/99] chore: use large ubuntu runner for goreleaser workflow --- .github/workflows/docker-publish.yml | 42 ---------------------------- .github/workflows/goreleaser.yml | 2 +- 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 .github/workflows/docker-publish.yml diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml deleted file mode 100644 index 3116b4337..000000000 --- a/.github/workflows/docker-publish.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Publish Latest Docker Image - -on: - push: - branches: - - "master" - tags: - - "v*" - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Get version - id: get_version - uses: battila7/get-version-action@v2 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to GHCR container register - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push chaosnet image - uses: docker/build-push-action@v5 - if: startsWith(github.ref, 'refs/tags/v') - with: - file: contrib/docker/chaosnet.Dockerfile - context: . - push: true - platforms: linux/amd64,linux/arm64 - tags: ghcr.io/nibiruchain/chaosnet:${{ steps.get_version.outputs.version }} \ No newline at end of file diff --git a/.github/workflows/goreleaser.yml b/.github/workflows/goreleaser.yml index aa6277004..e77ba3ac8 100644 --- a/.github/workflows/goreleaser.yml +++ b/.github/workflows/goreleaser.yml @@ -11,7 +11,7 @@ permissions: jobs: goreleaser: - runs-on: ubuntu-latest + runs-on: ubuntu-latest-m steps: - name: Set up QEMU uses: docker/setup-qemu-action@v3 From 46cc61c066ccc04aed5ccd091dd6d570e46da871 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:50:56 -0500 Subject: [PATCH 06/99] =?UTF-8?q?fix(ledger):=20bump=20the=20hid=20package?= =?UTF-8?q?=20to=20v0.9.2=20which=20fixes=20ledger=20on=20new=E2=80=A6=20(?= =?UTF-8?q?#1649)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ledger): bump the hid package to v0.9.2 which fixes ledger on new macos versions * chore: update changelog --- CHANGELOG.md | 1 + go.mod | 6 +++--- go.sum | 12 ++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24fbf1f03..266d24cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug Fixes * [#1606](https://github.com/NibiruChain/nibiru/pull/1606) - fix(perp): emit `MarketUpdatedEvent` in the absence of index price +* [#1649](https://github.com/NibiruChain/nibiru/pull/1649) - fix(ledger): fix ledger for newer macos versions ## [v0.21.10] diff --git a/go.mod b/go.mod index b8bccad90..d9bbdfa93 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/cosmos/gogogateway v1.2.0 // indirect github.com/cosmos/iavl v0.21.0-beta.1 // indirect github.com/cosmos/ics23/go v0.10.0 // indirect - github.com/cosmos/ledger-cosmos-go v0.12.2 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect github.com/cosmos/rosetta-sdk-go v0.10.0 // indirect github.com/creachadair/taskgroup v0.4.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect @@ -160,8 +160,8 @@ require ( github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/btree v1.6.0 // indirect github.com/ulikunitz/xz v0.5.11 // indirect - github.com/zondax/hid v0.9.1 // indirect - github.com/zondax/ledger-go v0.14.1 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.7 // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/crypto v0.14.0 // indirect diff --git a/go.sum b/go.sum index 2310d0346..a24d6a159 100644 --- a/go.sum +++ b/go.sum @@ -410,8 +410,8 @@ github.com/cosmos/ibc-go/v7 v7.3.0 h1:QtGeVMi/3JeLWuvEuC60sBHpAF40Oenx/y+bP8+wRR github.com/cosmos/ibc-go/v7 v7.3.0/go.mod h1:mUmaHFXpXrEdcxfdXyau+utZf14pGKVUiXwYftRZZfQ= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= -github.com/cosmos/ledger-cosmos-go v0.12.2 h1:/XYaBlE2BJxtvpkHiBm97gFGSGmYGKunKyF3nNqAXZA= -github.com/cosmos/ledger-cosmos-go v0.12.2/go.mod h1:ZcqYgnfNJ6lAXe4HPtWgarNEY+B74i+2/8MhZw4ziiI= +github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= +github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= github.com/cosmos/rosetta-sdk-go v0.10.0 h1:E5RhTruuoA7KTIXUcMicL76cffyeoyvNybzUGSKFTcM= github.com/cosmos/rosetta-sdk-go v0.10.0/go.mod h1:SImAZkb96YbwvoRkzSMQB6noNJXFgWl/ENIznEoYQI4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= @@ -1172,10 +1172,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zondax/hid v0.9.1 h1:gQe66rtmyZ8VeGFcOpbuH3r7erYtNEAezCAYu8LdkJo= -github.com/zondax/hid v0.9.1/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= -github.com/zondax/ledger-go v0.14.1 h1:Pip65OOl4iJ84WTpA4BKChvOufMhhbxED3BaihoZN4c= -github.com/zondax/ledger-go v0.14.1/go.mod h1:fZ3Dqg6qcdXWSOJFKMG8GCTnD7slO/RL2feOQv8K320= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= From 2a357ef697c0fbb42eed1dd7e07203be68320aa4 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:04:58 -0500 Subject: [PATCH 07/99] chore: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 266d24cc1..f49ed9ebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features From 1f798072460aa01d74b0f2e9fd465809643b454d Mon Sep 17 00:00:00 2001 From: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:34:07 -0500 Subject: [PATCH 08/99] feat(wasmbinding)!: whitelisted stargate queries for QueryRequest::Stargate: auth, bank, gov, tokenfactory, epochs, inflation, oracle, sudo, devgas (#1646) * fix(tokenfactory)!: Fix bug in MsgBurn on total supply tracking * chore: rm stablecoin. How does this keep getting merged lol * test: add export statements for the gRPC query service descriptions in each module * feat(wasmbinding): whitelisted stargate queries for QueryRequest::Stargate * changelog * fix changelog * refactor!: make the epoch infos name consistent * docs,test(stargate_query): leave an in-depth explainer above the function * refactor: pR comments: earlier return + remove duplicate hardcoded paths * test: proto package may have more than 3 'parts'. Use len - 1 instead * docs: fix small documentation typos --- CHANGELOG.md | 1 + app/app.go | 4 +- app/keepers.go | 12 +-- proto/nibiru/epochs/v1/query.proto | 6 +- wasmbinding/stargate_query.go | 150 +++++++++++++++++++++++++++++ wasmbinding/stargate_query_test.go | 116 ++++++++++++++++++++++ wasmbinding/wasm.go | 13 ++- x/devgas/v1/types/export.go | 12 +++ x/epochs/README.md | 4 +- x/epochs/client/cli/query.go | 8 +- x/epochs/keeper/grpc_query.go | 4 +- x/epochs/keeper/grpc_query_test.go | 2 +- x/epochs/types/export.go | 12 +++ x/epochs/types/query.pb.go | 104 ++++++++++---------- x/epochs/types/query.pb.gw.go | 4 +- x/inflation/types/export.go | 12 +++ x/oracle/types/export.go | 12 +++ x/sudo/types/export.go | 12 +++ x/tokenfactory/types/export.go | 12 +++ 19 files changed, 426 insertions(+), 74 deletions(-) create mode 100644 wasmbinding/stargate_query.go create mode 100644 wasmbinding/stargate_query_test.go create mode 100644 x/devgas/v1/types/export.go create mode 100644 x/epochs/types/export.go create mode 100644 x/inflation/types/export.go create mode 100644 x/oracle/types/export.go create mode 100644 x/sudo/types/export.go create mode 100644 x/tokenfactory/types/export.go diff --git a/CHANGELOG.md b/CHANGELOG.md index b3142e47f..73f2dd420 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1616](https://github.com/NibiruChain/nibiru/pull/1616) - fix(app)!: Add custom wasm snapshotter for proper state exports * [#1617](https://github.com/NibiruChain/nibiru/pull/1617) - fix(app)!: non-nil snapshot manager is not guaranteed in testapp * [#1645](https://github.com/NibiruChain/nibiru/pull/1645) - fix(tokenfactory)!: token supply in bank keeper must be correct after MsgBurn. +* [#1646](https://github.com/NibiruChain/nibiru/pull/1646) - feat(wasmbinding)!: whitelisted stargate queries for QueryRequest::Stargate: auth, bank, gov, tokenfactory, epochs, inflation, oracle, sudo, devgas ### Improvements diff --git a/app/app.go b/app/app.go index 1a3cb5795..b93d5abcb 100644 --- a/app/app.go +++ b/app/app.go @@ -116,7 +116,9 @@ func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasm.Option } // Add the bindings to the app's set of []wasm.Option. - wasmOpts = append(wasmOpts, wasmbinding.RegisterWasmOptions( + wasmOpts = append(wasmOpts, wasmbinding.NibiruWasmOptions( + nibiru.GRPCQueryRouter(), + nibiru.appCodec, nibiru.SudoKeeper, nibiru.OracleKeeper, )...) diff --git a/app/keepers.go b/app/keepers.go index 21ca4d5a7..127f32ed0 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -147,8 +147,8 @@ type AppKeepers struct { the app, so we can SetRouter on it correctly. */ ibcKeeper *ibckeeper.Keeper ibcFeeKeeper ibcfeekeeper.Keeper - /* transferKeeper is for cross-chain fungible token transfers. */ - transferKeeper ibctransferkeeper.Keeper + /* ibcTransferKeeper is for cross-chain fungible token transfers. */ + ibcTransferKeeper ibctransferkeeper.Keeper // make scoped keepers public for test purposes ScopedIBCKeeper capabilitykeeper.ScopedKeeper @@ -410,7 +410,7 @@ func (app *NibiruApp) InitKeepers( app.ibcKeeper.ChannelKeeper, &app.ibcKeeper.PortKeeper, app.ScopedWasmKeeper, - app.transferKeeper, + app.ibcTransferKeeper, app.MsgServiceRouter(), app.GRPCQueryRouter(), wasmDir, @@ -454,7 +454,7 @@ func (app *NibiruApp) InitKeepers( /* Create IBC module and a static IBC router */ ibcRouter := porttypes.NewRouter() - app.transferKeeper = ibctransferkeeper.NewKeeper( + app.ibcTransferKeeper = ibctransferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], /* paramSubspace */ app.GetSubspace(ibctransfertypes.ModuleName), @@ -484,7 +484,7 @@ func (app *NibiruApp) InitKeepers( // create IBC module from bottom to top of stack var transferStack porttypes.IBCModule - transferStack = ibctransfer.NewIBCModule(app.transferKeeper) + transferStack = ibctransfer.NewIBCModule(app.ibcTransferKeeper) transferStack = ibcfee.NewIBCMiddleware(transferStack, app.ibcFeeKeeper) // Add transfer stack to IBC Router @@ -573,7 +573,7 @@ func (app *NibiruApp) initAppModules( // ibc evidence.NewAppModule(app.evidenceKeeper), ibc.NewAppModule(app.ibcKeeper), - ibctransfer.NewAppModule(app.transferKeeper), + ibctransfer.NewAppModule(app.ibcTransferKeeper), ibcfee.NewAppModule(app.ibcFeeKeeper), // wasm diff --git a/proto/nibiru/epochs/v1/query.proto b/proto/nibiru/epochs/v1/query.proto index b25b4df0f..76ed2054a 100644 --- a/proto/nibiru/epochs/v1/query.proto +++ b/proto/nibiru/epochs/v1/query.proto @@ -11,7 +11,7 @@ option go_package = "github.com/NibiruChain/nibiru/x/epochs/types"; // Query defines the gRPC querier service. service Query { // EpochInfos provide running epochInfos - rpc EpochInfos(QueryEpochsInfoRequest) returns (QueryEpochsInfoResponse) { + rpc EpochInfos(QueryEpochInfosRequest) returns (QueryEpochInfosResponse) { option (google.api.http).get = "/nibiru/epochs/v1beta1/epochs"; } // CurrentEpoch provide current epoch of specified identifier @@ -21,8 +21,8 @@ service Query { } } -message QueryEpochsInfoRequest {} -message QueryEpochsInfoResponse { +message QueryEpochInfosRequest {} +message QueryEpochInfosResponse { repeated nibiru.epochs.v1.EpochInfo epochs = 1 [ (gogoproto.nullable) = false ]; } diff --git a/wasmbinding/stargate_query.go b/wasmbinding/stargate_query.go new file mode 100644 index 000000000..b8de0e43b --- /dev/null +++ b/wasmbinding/stargate_query.go @@ -0,0 +1,150 @@ +package wasmbinding + +import ( + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + + devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" + epochs "github.com/NibiruChain/nibiru/x/epochs/types" + inflation "github.com/NibiruChain/nibiru/x/inflation/types" + oracle "github.com/NibiruChain/nibiru/x/oracle/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" + + auth "github.com/cosmos/cosmos-sdk/x/auth/types" + bank "github.com/cosmos/cosmos-sdk/x/bank/types" + gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1" + + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" + ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" +) + +/* +WasmAcceptedStargateQueries: Specifies which `QueryRequest::Stargate` types +can be sent to the application. + +### On Stargate Queries: + +A Stargate query is encoded the same way as abci_query, with path and protobuf +encoded request data. The format is defined in +[ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). +- The response is protobuf encoded data directly without a JSON response wrapper. +The caller is responsible for compiling the proper protobuf definitions for both +requests and responses. + + ```rust + enum QueryRequest { + Stargate { + /// this is the fully qualified service path used for routing, + /// eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance + path: String, + /// this is the expected protobuf message type (not any), binary encoded + data: Binary, + }, + // ... + } + ``` + +### Relationship with Protobuf Message: + +A protobuf message with type URL "/cosmos.bank.v1beta1.QueryBalanceResponse" +communicates a lot of information. From this type URL, we know: + - The protobuf message has package "cosmos.bank.v1beta1" + - The protobuf message has name "QueryBalanceResponse" + +That is, a type URL is of the form "/[PB_MSG.PACKAGE]/[PB_MSG.NAME]" + +The `QueryRequest::Stargate.path` is defined based on method name of the gRPC +service description, not the type URL. In this example: + - The service name is "cosmos.bank.v1beta1.Query" + - The method name for this request on that service is "Balance" + +This results in the expected `Stargate.path` of "/[SERVICE_NAME]/[METHOD]". +By convention, the gRPC query service corresponding to a package is always +"[PB_MSG.PACKAGE].Query". + +Given only the `PB_MSG.PACKAGE` and the `PB_MSG.NAME` of either the query +request or response, we should know the `QueryRequest::Stargate.path` +deterministically. +*/ +func WasmAcceptedStargateQueries() wasmkeeper.AcceptedStargateQueries { + return wasmkeeper.AcceptedStargateQueries{ + // ibc + "/ibc.core.client.v1.Query/ClientState": &ibcclienttypes.QueryClientStateResponse{}, + "/ibc.core.client.v1.Query/ConsensusState": &ibcclienttypes.QueryConsensusStateResponse{}, + "/ibc.core.connection.v1.Query/Connection": &ibcconnectiontypes.QueryConnectionResponse{}, + "/ibc.core.connection.v1.Query/Connections": &ibcconnectiontypes.QueryConnectionsResponse{}, + "/ibc.core.connection.v1.Query/ClientConnections": &ibcconnectiontypes.QueryClientConnectionsResponse{}, + "/ibc.core.connection.v1.Query/ConnectionConsensusState": &ibcconnectiontypes.QueryConnectionConsensusStateResponse{}, + "/ibc.core.connection.v1.Query/ConnectionParams": &ibcconnectiontypes.QueryConnectionParamsResponse{}, + + // ibc transfer + "/ibc.applications.transfer.v1.Query/DenomTrace": &ibctransfertypes.QueryDenomTraceResponse{}, + "/ibc.applications.transfer.v1.Query/Params": &ibctransfertypes.QueryParamsResponse{}, + "/ibc.applications.transfer.v1.Query/DenomHash": &ibctransfertypes.QueryDenomHashResponse{}, + "/ibc.applications.transfer.v1.Query/EscrowAddress": &ibctransfertypes.QueryEscrowAddressResponse{}, + "/ibc.applications.transfer.v1.Query/TotalEscrowForDenom": &ibctransfertypes.QueryTotalEscrowForDenomResponse{}, + + // cosmos auth + "/cosmos.auth.v1beta1.Query/Account": new(auth.QueryAccountResponse), + "/cosmos.auth.v1beta1.Query/Params": new(auth.QueryParamsResponse), + + // cosmos bank + "/cosmos.bank.v1beta1.Query/Balance": new(bank.QueryBalanceResponse), + "/cosmos.bank.v1beta1.Query/DenomMetadata": new(bank.QueryDenomMetadataResponse), + "/cosmos.bank.v1beta1.Query/Params": new(bank.QueryParamsResponse), + "/cosmos.bank.v1beta1.Query/SupplyOf": new(bank.QuerySupplyOfResponse), + "/cosmos.bank.v1beta1.Query/AllBalances": new(bank.QueryAllBalancesResponse), + + // cosmos gov + "/cosmos.gov.v1.Query/Proposal": new(gov.QueryProposalResponse), + "/cosmos.gov.v1.Query/Params": new(gov.QueryParamsResponse), + "/cosmos.gov.v1.Query/Vote": new(gov.QueryVoteResponse), + + // nibiru tokenfactory + "/nibiru.tokenfactory.v1.Query/Denoms": new(tokenfactory.QueryDenomsResponse), + "/nibiru.tokenfactory.v1.Query/Params": new(tokenfactory.QueryParamsResponse), + "/nibiru.tokenfactory.v1.Query/DenomInfo": new(tokenfactory.QueryDenomInfoResponse), + + // nibiru epochs + "/nibiru.epochs.v1.Query/EpochInfos": new(epochs.QueryEpochInfosResponse), + "/nibiru.epochs.v1.Query/CurrentEpoch": new(epochs.QueryCurrentEpochResponse), + + // nibiru inflation + "/nibiru.inflation.v1.Query/Period": new(inflation.QueryPeriodResponse), + "/nibiru.inflation.v1.Query/EpochMintProvision": new(inflation.QueryEpochMintProvisionResponse), + "/nibiru.inflation.v1.Query/SkippedEpochs": new(inflation.QuerySkippedEpochsResponse), + "/nibiru.inflation.v1.Query/CirculatingSupply": new(inflation.QueryCirculatingSupplyResponse), + "/nibiru.inflation.v1.Query/InflationRate": new(inflation.QueryInflationRateResponse), + "/nibiru.inflation.v1.Query/Params": new(inflation.QueryParamsResponse), + + // nibiru oracle + "/nibiru.oracle.v1.Query/ExchangeRate": new(oracle.QueryExchangeRateResponse), + "/nibiru.oracle.v1.Query/ExchangeRateTwap": new(oracle.QueryExchangeRateResponse), + "/nibiru.oracle.v1.Query/ExchangeRates": new(oracle.QueryExchangeRatesResponse), + "/nibiru.oracle.v1.Query/Actives": new(oracle.QueryActivesResponse), + "/nibiru.oracle.v1.Query/VoteTargets": new(oracle.QueryVoteTargetsResponse), + "/nibiru.oracle.v1.Query/FeederDelegation": new(oracle.QueryFeederDelegationResponse), + "/nibiru.oracle.v1.Query/MissCounter": new(oracle.QueryMissCounterResponse), + "/nibiru.oracle.v1.Query/AggregatePrevote": new(oracle.QueryAggregatePrevoteResponse), + "/nibiru.oracle.v1.Query/AggregatePrevotes": new(oracle.QueryAggregatePrevotesResponse), + "/nibiru.oracle.v1.Query/AggregateVote": new(oracle.QueryAggregateVoteResponse), + "/nibiru.oracle.v1.Query/AggregateVotes": new(oracle.QueryAggregateVotesResponse), + "/nibiru.oracle.v1.Query/Params": new(oracle.QueryParamsResponse), + + // nibiru sudo + "/nibiru.sudo.v1.Query/QuerySudoers": new(sudotypes.QuerySudoersResponse), + + // nibiru devgas + "/nibiru.devgas.v1.Query/FeeShares": new(devgas.QueryFeeSharesResponse), + "/nibiru.devgas.v1.Query/FeeShare": new(devgas.QueryFeeShareResponse), + "/nibiru.devgas.v1.Query/Params": new(devgas.QueryParamsResponse), + "/nibiru.devgas.v1.Query/FeeSharesByWithdrawer": new(devgas.QueryFeeSharesByWithdrawerResponse), + + // TODO: for post v1 + // nibiru.perp + + // TODO: for post v1 + // nibiru.spot + } +} diff --git a/wasmbinding/stargate_query_test.go b/wasmbinding/stargate_query_test.go new file mode 100644 index 000000000..e809753ae --- /dev/null +++ b/wasmbinding/stargate_query_test.go @@ -0,0 +1,116 @@ +package wasmbinding_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/cosmos/gogoproto/proto" + "github.com/stretchr/testify/assert" + "google.golang.org/grpc" + + "github.com/NibiruChain/nibiru/wasmbinding" + + "github.com/NibiruChain/nibiru/x/common/set" + + devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" + epochs "github.com/NibiruChain/nibiru/x/epochs/types" + inflation "github.com/NibiruChain/nibiru/x/inflation/types" + oracle "github.com/NibiruChain/nibiru/x/oracle/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" +) + +/* +TestWasmAcceptedStargateQueries: Verifies that the query paths registered in +the Wasm keeper's StargateQuerier are the official method names in the gRPC +query service of each path's respective module. + +> ℹ️ "All stargate query paths must be actual GRPC query service methods" + +Please see the function doc comment for WasmAcceptedStargateQueries in +stargate_query.go to understand in detail what invariants this test checks +for. + +Given only the `PB_MSG.PACKAGE` and the `PB_MSG.NAME` of either the query +request or response, we should know the `QueryRequest::Stargate.path` +deterministically. +*/ +func TestWasmAcceptedStargateQueries(t *testing.T) { + t.Log("stargateQueryPaths: Add nibiru query paths from GRPC service descriptions") + queryServiceDescriptions := []grpc.ServiceDesc{ + epochs.GrpcQueryServiceDesc(), + devgas.GrpcQueryServiceDesc(), + inflation.GrpcQueryServiceDesc(), + oracle.GrpcQueryServiceDesc(), + sudotypes.GrpcQueryServiceDesc(), + tokenfactory.GrpcQueryServiceDesc(), + } + stargateQueryPaths := set.New[string]() + for _, serviceDesc := range queryServiceDescriptions { + for _, queryMethod := range serviceDesc.Methods { + stargateQueryPaths.Add( + fmt.Sprintf("/%v/%v", serviceDesc.ServiceName, queryMethod.MethodName), + ) + } + } + + t.Log("stargateQueryPaths: Add cosmos and ibc query paths") + // The GRPC service descriptions aren't exported as copies from the + // Cosmos-SDK and remain private vars. Maybe we could ask the maintainers to + // export them in the future. + for queryPath := range wasmbinding.WasmAcceptedStargateQueries() { + stargateQueryPaths.Add(queryPath) + } + + // It's not required for the response type and the method description of the + // stargate query's gRPC path to match up exactly as expected. The exception + // to this convention is when our response type isn't stripped of its + // "Response" suffix and "Query" prefix is not the same as the method name. + // This happens when "QueryAAARequest" does not return a "QueryAAAResponse". + exceptionPaths := set.New[string]("/nibiru.oracle.v1.QueryExchangeRateResponse") + + gotQueryPaths := []string{} + for queryPath, protobufResponse := range wasmbinding.WasmAcceptedStargateQueries() { + gotQueryPaths = append(gotQueryPaths, queryPath) + + // Show that the underlying protobuf name and query paths coincide. + pbQueryResponseTypeUrl := "/" + proto.MessageName(protobufResponse) + isExceptionPath := exceptionPaths.Has(pbQueryResponseTypeUrl) + splitResponse := strings.Split(pbQueryResponseTypeUrl, "Response") + assert.Lenf(t, splitResponse, 2, "typeUrl: %v", + splitResponse, pbQueryResponseTypeUrl) + + // Get proto message "package" from the response type + typeUrlMinusSuffix := splitResponse[0] + typeUrlPartsFromProtoMsg := strings.Split(typeUrlMinusSuffix, ".") + lenOfParts := len(typeUrlPartsFromProtoMsg) + assert.GreaterOrEqual(t, lenOfParts, 4, typeUrlPartsFromProtoMsg) + protoMessagePackage := typeUrlPartsFromProtoMsg[:lenOfParts-1] + + // Get proto message "package" from the query path + typeUrlPartsFromQueryPath := strings.Split(queryPath, ".") + assert.GreaterOrEqual(t, len(typeUrlPartsFromQueryPath), 4, typeUrlPartsFromQueryPath) + queryPathProtoPackage := typeUrlPartsFromQueryPath[:lenOfParts-1] + + // Verify that the packages match + assert.Equalf(t, queryPathProtoPackage, protoMessagePackage, + "package names inconsistent:\nfrom query path: %v\nfrom protobuf object: %v", + queryPath, pbQueryResponseTypeUrl, + ) + + // Verify that the method names match too. + if isExceptionPath { + continue + } + methodNameFromPb := strings.TrimLeft(typeUrlPartsFromProtoMsg[3], "Query") + methodNameFromPath := strings.TrimLeft(typeUrlPartsFromQueryPath[3], "Query/") + assert.Equalf(t, methodNameFromPb, methodNameFromPath, + "method names inconsistent:\nfrom query path: %v\nfrom protobuf object: %v", + queryPath, pbQueryResponseTypeUrl, + ) + } + + t.Log("All stargate query paths must be actual GRPC query service methods") + assert.ElementsMatch(t, stargateQueryPaths.ToSlice(), gotQueryPaths) +} diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go index ab87f6bc3..31bf77137 100644 --- a/wasmbinding/wasm.go +++ b/wasmbinding/wasm.go @@ -3,19 +3,30 @@ package wasmbinding import ( "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/codec" "github.com/NibiruChain/nibiru/x/sudo/keeper" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" ) -func RegisterWasmOptions( +// NibiruWasmOptions: Wasm Options are extension points to instantiate the Wasm +// keeper with non-default values +func NibiruWasmOptions( + grpcQueryRouter *baseapp.GRPCQueryRouter, + appCodec codec.Codec, sudoKeeper keeper.Keeper, oracleKeeper oraclekeeper.Keeper, ) []wasm.Option { wasmQueryPlugin := NewQueryPlugin(oracleKeeper) wasmQueryOption := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{ Custom: CustomQuerier(wasmQueryPlugin), + Stargate: wasmkeeper.AcceptListStargateQuerier( + WasmAcceptedStargateQueries(), + grpcQueryRouter, + appCodec, + ), }) wasmExecuteOption := wasmkeeper.WithMessageHandlerDecorator( diff --git a/x/devgas/v1/types/export.go b/x/devgas/v1/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/devgas/v1/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/epochs/README.md b/x/epochs/README.md index 7a1b36b41..dbdf04b80 100644 --- a/x/epochs/README.md +++ b/x/epochs/README.md @@ -130,7 +130,7 @@ Epochs module is providing below queries to check the module's state. ```protobuf service Query { // EpochInfos provide running epochInfos - rpc EpochInfos(QueryEpochsInfoRequest) returns (QueryEpochsInfoResponse) {} + rpc EpochInfos(QueryEpochInfosRequest) returns (QueryEpochInfosResponse) {} // CurrentEpoch provide current epoch of specified identifier rpc CurrentEpoch(QueryCurrentEpochRequest) returns (QueryCurrentEpochResponse) {} } @@ -155,4 +155,4 @@ For instance, we have an epoch of 100 units that ends at t=100, if we have a blo And new epoch start at t=110. There are time drifts here, for around 1-2 blocks time. It will slow down epochs. -It's going to slow down epoch by 10-20s per week when epoch duration is 1 week. This should be resolved after launch. \ No newline at end of file +It's going to slow down epoch by 10-20s per week when epoch duration is 1 week. This should be resolved after launch. diff --git a/x/epochs/client/cli/query.go b/x/epochs/client/cli/query.go index 5a54b74cb..4cf75f50e 100644 --- a/x/epochs/client/cli/query.go +++ b/x/epochs/client/cli/query.go @@ -24,15 +24,15 @@ func GetQueryCmd() *cobra.Command { } cmd.AddCommand( - GetCmdEpochsInfos(), + GetCmdEpochInfos(), GetCmdCurrentEpoch(), ) return cmd } -// GetCmdEpochsInfos provide running epochInfos. -func GetCmdEpochsInfos() *cobra.Command { +// GetCmdEpochInfos provide running epochInfos. +func GetCmdEpochInfos() *cobra.Command { cmd := &cobra.Command{ Use: "epoch-infos", Short: "Query running epochInfos", @@ -53,7 +53,7 @@ $ %s query epochs epoch-infos } queryClient := types.NewQueryClient(clientCtx) - res, err := queryClient.EpochInfos(cmd.Context(), &types.QueryEpochsInfoRequest{}) + res, err := queryClient.EpochInfos(cmd.Context(), &types.QueryEpochInfosRequest{}) if err != nil { return err } diff --git a/x/epochs/keeper/grpc_query.go b/x/epochs/keeper/grpc_query.go index 9062e4c23..3ecf1833a 100644 --- a/x/epochs/keeper/grpc_query.go +++ b/x/epochs/keeper/grpc_query.go @@ -21,10 +21,10 @@ func NewQuerier(k Keeper) Querier { } // EpochInfos provide running epochInfos. -func (q Querier) EpochInfos(c context.Context, _ *types.QueryEpochsInfoRequest) (*types.QueryEpochsInfoResponse, error) { +func (q Querier) EpochInfos(c context.Context, _ *types.QueryEpochInfosRequest) (*types.QueryEpochInfosResponse, error) { ctx := sdk.UnwrapSDKContext(c) - return &types.QueryEpochsInfoResponse{ + return &types.QueryEpochInfosResponse{ Epochs: q.Keeper.AllEpochInfos(ctx), }, nil } diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index fe522d184..591ad991f 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -28,7 +28,7 @@ func TestQueryEpochInfos(t *testing.T) { // Invalid param epochInfosResponse, err := queryClient.EpochInfos( - gocontext.Background(), &epochstypes.QueryEpochsInfoRequest{}, + gocontext.Background(), &epochstypes.QueryEpochInfosRequest{}, ) require.NoError(t, err, errMsg) require.Len(t, epochInfosResponse.Epochs, 3) diff --git a/x/epochs/types/export.go b/x/epochs/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/epochs/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go index 27f8d21f3..e486ff116 100644 --- a/x/epochs/types/query.pb.go +++ b/x/epochs/types/query.pb.go @@ -30,21 +30,21 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -type QueryEpochsInfoRequest struct { +type QueryEpochInfosRequest struct { } -func (m *QueryEpochsInfoRequest) Reset() { *m = QueryEpochsInfoRequest{} } -func (m *QueryEpochsInfoRequest) String() string { return proto.CompactTextString(m) } -func (*QueryEpochsInfoRequest) ProtoMessage() {} -func (*QueryEpochsInfoRequest) Descriptor() ([]byte, []int) { +func (m *QueryEpochInfosRequest) Reset() { *m = QueryEpochInfosRequest{} } +func (m *QueryEpochInfosRequest) String() string { return proto.CompactTextString(m) } +func (*QueryEpochInfosRequest) ProtoMessage() {} +func (*QueryEpochInfosRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2d273c3d69b40555, []int{0} } -func (m *QueryEpochsInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *QueryEpochInfosRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryEpochsInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryEpochInfosRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryEpochsInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryEpochInfosRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -54,34 +54,34 @@ func (m *QueryEpochsInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *QueryEpochsInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochsInfoRequest.Merge(m, src) +func (m *QueryEpochInfosRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochInfosRequest.Merge(m, src) } -func (m *QueryEpochsInfoRequest) XXX_Size() int { +func (m *QueryEpochInfosRequest) XXX_Size() int { return m.Size() } -func (m *QueryEpochsInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochsInfoRequest.DiscardUnknown(m) +func (m *QueryEpochInfosRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochInfosRequest.DiscardUnknown(m) } -var xxx_messageInfo_QueryEpochsInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_QueryEpochInfosRequest proto.InternalMessageInfo -type QueryEpochsInfoResponse struct { +type QueryEpochInfosResponse struct { Epochs []EpochInfo `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs"` } -func (m *QueryEpochsInfoResponse) Reset() { *m = QueryEpochsInfoResponse{} } -func (m *QueryEpochsInfoResponse) String() string { return proto.CompactTextString(m) } -func (*QueryEpochsInfoResponse) ProtoMessage() {} -func (*QueryEpochsInfoResponse) Descriptor() ([]byte, []int) { +func (m *QueryEpochInfosResponse) Reset() { *m = QueryEpochInfosResponse{} } +func (m *QueryEpochInfosResponse) String() string { return proto.CompactTextString(m) } +func (*QueryEpochInfosResponse) ProtoMessage() {} +func (*QueryEpochInfosResponse) Descriptor() ([]byte, []int) { return fileDescriptor_2d273c3d69b40555, []int{1} } -func (m *QueryEpochsInfoResponse) XXX_Unmarshal(b []byte) error { +func (m *QueryEpochInfosResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *QueryEpochsInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *QueryEpochInfosResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_QueryEpochsInfoResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_QueryEpochInfosResponse.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -91,19 +91,19 @@ func (m *QueryEpochsInfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *QueryEpochsInfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochsInfoResponse.Merge(m, src) +func (m *QueryEpochInfosResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochInfosResponse.Merge(m, src) } -func (m *QueryEpochsInfoResponse) XXX_Size() int { +func (m *QueryEpochInfosResponse) XXX_Size() int { return m.Size() } -func (m *QueryEpochsInfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochsInfoResponse.DiscardUnknown(m) +func (m *QueryEpochInfosResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochInfosResponse.DiscardUnknown(m) } -var xxx_messageInfo_QueryEpochsInfoResponse proto.InternalMessageInfo +var xxx_messageInfo_QueryEpochInfosResponse proto.InternalMessageInfo -func (m *QueryEpochsInfoResponse) GetEpochs() []EpochInfo { +func (m *QueryEpochInfosResponse) GetEpochs() []EpochInfo { if m != nil { return m.Epochs } @@ -199,8 +199,8 @@ func (m *QueryCurrentEpochResponse) GetCurrentEpoch() uint64 { } func init() { - proto.RegisterType((*QueryEpochsInfoRequest)(nil), "nibiru.epochs.v1.QueryEpochsInfoRequest") - proto.RegisterType((*QueryEpochsInfoResponse)(nil), "nibiru.epochs.v1.QueryEpochsInfoResponse") + proto.RegisterType((*QueryEpochInfosRequest)(nil), "nibiru.epochs.v1.QueryEpochInfosRequest") + proto.RegisterType((*QueryEpochInfosResponse)(nil), "nibiru.epochs.v1.QueryEpochInfosResponse") proto.RegisterType((*QueryCurrentEpochRequest)(nil), "nibiru.epochs.v1.QueryCurrentEpochRequest") proto.RegisterType((*QueryCurrentEpochResponse)(nil), "nibiru.epochs.v1.QueryCurrentEpochResponse") } @@ -250,7 +250,7 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { // EpochInfos provide running epochInfos - EpochInfos(ctx context.Context, in *QueryEpochsInfoRequest, opts ...grpc.CallOption) (*QueryEpochsInfoResponse, error) + EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) // CurrentEpoch provide current epoch of specified identifier CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) } @@ -263,8 +263,8 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } -func (c *queryClient) EpochInfos(ctx context.Context, in *QueryEpochsInfoRequest, opts ...grpc.CallOption) (*QueryEpochsInfoResponse, error) { - out := new(QueryEpochsInfoResponse) +func (c *queryClient) EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) { + out := new(QueryEpochInfosResponse) err := c.cc.Invoke(ctx, "/nibiru.epochs.v1.Query/EpochInfos", in, out, opts...) if err != nil { return nil, err @@ -284,7 +284,7 @@ func (c *queryClient) CurrentEpoch(ctx context.Context, in *QueryCurrentEpochReq // QueryServer is the server API for Query service. type QueryServer interface { // EpochInfos provide running epochInfos - EpochInfos(context.Context, *QueryEpochsInfoRequest) (*QueryEpochsInfoResponse, error) + EpochInfos(context.Context, *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) // CurrentEpoch provide current epoch of specified identifier CurrentEpoch(context.Context, *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) } @@ -293,7 +293,7 @@ type QueryServer interface { type UnimplementedQueryServer struct { } -func (*UnimplementedQueryServer) EpochInfos(ctx context.Context, req *QueryEpochsInfoRequest) (*QueryEpochsInfoResponse, error) { +func (*UnimplementedQueryServer) EpochInfos(ctx context.Context, req *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EpochInfos not implemented") } func (*UnimplementedQueryServer) CurrentEpoch(ctx context.Context, req *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) { @@ -305,7 +305,7 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { } func _Query_EpochInfos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryEpochsInfoRequest) + in := new(QueryEpochInfosRequest) if err := dec(in); err != nil { return nil, err } @@ -317,7 +317,7 @@ func _Query_EpochInfos_Handler(srv interface{}, ctx context.Context, dec func(in FullMethod: "/nibiru.epochs.v1.Query/EpochInfos", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EpochInfos(ctx, req.(*QueryEpochsInfoRequest)) + return srv.(QueryServer).EpochInfos(ctx, req.(*QueryEpochInfosRequest)) } return interceptor(ctx, in, info, handler) } @@ -357,7 +357,7 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "nibiru/epochs/v1/query.proto", } -func (m *QueryEpochsInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *QueryEpochInfosRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -367,12 +367,12 @@ func (m *QueryEpochsInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryEpochsInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryEpochInfosRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryEpochsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryEpochInfosRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -380,7 +380,7 @@ func (m *QueryEpochsInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *QueryEpochsInfoResponse) Marshal() (dAtA []byte, err error) { +func (m *QueryEpochInfosResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -390,12 +390,12 @@ func (m *QueryEpochsInfoResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *QueryEpochsInfoResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *QueryEpochInfosResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *QueryEpochsInfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *QueryEpochInfosResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -486,7 +486,7 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } -func (m *QueryEpochsInfoRequest) Size() (n int) { +func (m *QueryEpochInfosRequest) Size() (n int) { if m == nil { return 0 } @@ -495,7 +495,7 @@ func (m *QueryEpochsInfoRequest) Size() (n int) { return n } -func (m *QueryEpochsInfoResponse) Size() (n int) { +func (m *QueryEpochInfosResponse) Size() (n int) { if m == nil { return 0 } @@ -541,7 +541,7 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (m *QueryEpochsInfoRequest) Unmarshal(dAtA []byte) error { +func (m *QueryEpochInfosRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -564,10 +564,10 @@ func (m *QueryEpochsInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryEpochsInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: QueryEpochInfosRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochsInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryEpochInfosRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -591,7 +591,7 @@ func (m *QueryEpochsInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *QueryEpochsInfoResponse) Unmarshal(dAtA []byte) error { +func (m *QueryEpochInfosResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -614,10 +614,10 @@ func (m *QueryEpochsInfoResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: QueryEpochsInfoResponse: wiretype end group for non-group") + return fmt.Errorf("proto: QueryEpochInfosResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochsInfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: QueryEpochInfosResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: diff --git a/x/epochs/types/query.pb.gw.go b/x/epochs/types/query.pb.gw.go index c4ef607d0..3286ae0bc 100644 --- a/x/epochs/types/query.pb.gw.go +++ b/x/epochs/types/query.pb.gw.go @@ -34,7 +34,7 @@ var _ = descriptor.ForMessage var _ = metadata.Join func request_Query_EpochInfos_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochsInfoRequest + var protoReq QueryEpochInfosRequest var metadata runtime.ServerMetadata msg, err := client.EpochInfos(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -43,7 +43,7 @@ func request_Query_EpochInfos_0(ctx context.Context, marshaler runtime.Marshaler } func local_request_Query_EpochInfos_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochsInfoRequest + var protoReq QueryEpochInfosRequest var metadata runtime.ServerMetadata msg, err := server.EpochInfos(ctx, &protoReq) diff --git a/x/inflation/types/export.go b/x/inflation/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/inflation/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/oracle/types/export.go b/x/oracle/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/oracle/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/sudo/types/export.go b/x/sudo/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/sudo/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/tokenfactory/types/export.go b/x/tokenfactory/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/tokenfactory/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} From d5d36f564488c365e7d1191ead6cfbb9a29871cc Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 25 Oct 2023 16:41:56 -0500 Subject: [PATCH 09/99] chore: reset module consensus versions --- x/devgas/v1/module.go | 2 +- x/inflation/module.go | 2 +- x/sudo/module.go | 2 +- x/tokenfactory/module.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x/devgas/v1/module.go b/x/devgas/v1/module.go index a99c44316..ce2b011b3 100644 --- a/x/devgas/v1/module.go +++ b/x/devgas/v1/module.go @@ -30,7 +30,7 @@ var ( ) // ConsensusVersion defines the current module consensus version. -const ConsensusVersion = 2 +const ConsensusVersion = 1 // AppModuleBasic type for the fees module type AppModuleBasic struct{} diff --git a/x/inflation/module.go b/x/inflation/module.go index 0be1f79e2..3669e52cb 100644 --- a/x/inflation/module.go +++ b/x/inflation/module.go @@ -44,7 +44,7 @@ func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { // ConsensusVersion returns the consensus state-breaking version for the module. func (AppModuleBasic) ConsensusVersion() uint64 { - return 3 + return 1 } // RegisterInterfaces registers interfaces and implementations of the incentives diff --git a/x/sudo/module.go b/x/sudo/module.go index 72f35fbae..cca6fc0bb 100644 --- a/x/sudo/module.go +++ b/x/sudo/module.go @@ -141,7 +141,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw } // ConsensusVersion implements ConsensusVersion. -func (AppModule) ConsensusVersion() uint64 { return 3 } +func (AppModule) ConsensusVersion() uint64 { return 1 } // BeginBlock executes all ABCI BeginBlock logic respective to the capability module. func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} diff --git a/x/tokenfactory/module.go b/x/tokenfactory/module.go index 80b41b36c..fdf2ce75b 100644 --- a/x/tokenfactory/module.go +++ b/x/tokenfactory/module.go @@ -40,7 +40,7 @@ var ( ) // ConsensusVersion defines the current module consensus version. -const ConsensusVersion = 2 +const ConsensusVersion = 1 // AppModuleBasic type for the fees module type AppModuleBasic struct{} From 6a492478e1c0adf1f430c0819b304ffa94ac246c Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 30 Oct 2023 19:02:53 -0500 Subject: [PATCH 10/99] fix(inflation): enable inflationary NIBI (#1655) * chore(epochs): add day epoch and remove 15min epoch from default genesis * chore(epochs): remove 15min epoch from default genesis * fix(inflation): inflate strategic reserves to sudo root account * fix(inflation): test inflation amounts * chore: update changelog --- CHANGELOG.md | 1 + app/keepers.go | 5 ++ x/epochs/genesis_test.go | 8 +-- x/epochs/keeper/grpc_query_test.go | 10 +-- x/epochs/keeper/keeper_test.go | 4 +- x/epochs/module.go | 2 +- x/epochs/types/epochinfo_test.go | 8 +-- x/epochs/types/genesis.go | 8 +-- x/inflation/keeper/hooks.go | 12 ++-- x/inflation/keeper/inflation.go | 24 +++++-- x/inflation/keeper/inflation_test.go | 101 ++++++++++++++++++++------- x/inflation/keeper/keeper.go | 21 +++--- x/inflation/module.go | 4 +- x/inflation/types/interfaces.go | 4 ++ x/sudo/keeper/keeper.go | 15 ++++ 15 files changed, 156 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73f2dd420..7ab4787eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1606](https://github.com/NibiruChain/nibiru/pull/1606) - fix(perp): emit `MarketUpdatedEvent` in the absence of index price * [#1649](https://github.com/NibiruChain/nibiru/pull/1649) - fix(ledger): fix ledger for newer macos versions +* [#1655](https://github.com/NibiruChain/nibiru/pull/1655) - fix(inflation): inflate NIBI correctly to strategic treasury account ## [v0.21.10] diff --git a/app/keepers.go b/app/keepers.go index 127f32ed0..b008f996d 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -354,6 +354,11 @@ func (app *NibiruApp) InitKeepers( appCodec, keys[sudotypes.StoreKey], ) + app.InflationKeeper = inflationkeeper.NewKeeper( + appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, + ) + app.EpochsKeeper.SetHooks( epochstypes.NewMultiEpochHooks( app.InflationKeeper.Hooks(), diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index 7144449ed..1f4b14cb2 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -29,17 +29,17 @@ func TestEpochsExportGenesis(t *testing.T) { require.Len(t, genesis.Epochs, 3) errMsg := fmt.Sprintf("app.EpochsKeeper.AllEpochInfos(ctx): %v\n", app.EpochsKeeper.AllEpochInfos(ctx)) - require.Equal(t, genesis.Epochs[0].Identifier, "15 min") + require.Equal(t, genesis.Epochs[0].Identifier, "30 min") require.Equal(t, genesis.Epochs[0].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[0].Duration, time.Minute*15, errMsg) + require.Equal(t, genesis.Epochs[0].Duration, time.Minute*30, errMsg) require.Equal(t, genesis.Epochs[0].CurrentEpoch, uint64(0)) require.Equal(t, genesis.Epochs[0].CurrentEpochStartHeight, int64(0)) require.Equal(t, genesis.Epochs[0].CurrentEpochStartTime, chainStartTime) require.Equal(t, genesis.Epochs[0].EpochCountingStarted, false) - require.Equal(t, genesis.Epochs[1].Identifier, "30 min") + require.Equal(t, genesis.Epochs[1].Identifier, "day") require.Equal(t, genesis.Epochs[1].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[1].Duration, time.Minute*30) + require.Equal(t, genesis.Epochs[1].Duration, time.Hour*24) require.Equal(t, genesis.Epochs[1].CurrentEpoch, uint64(0)) require.Equal(t, genesis.Epochs[1].CurrentEpochStartHeight, int64(0)) require.Equal(t, genesis.Epochs[1].CurrentEpochStartTime, chainStartTime, errMsg) diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index 591ad991f..d8d820757 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -36,15 +36,15 @@ func TestQueryEpochInfos(t *testing.T) { // check if EpochInfos are correct require.Equal(t, epochInfosResponse.Epochs[0].StartTime, chainStartTime, errMsg) require.Equal(t, epochInfosResponse.Epochs[0].CurrentEpochStartTime, chainStartTime) - require.Equal(t, epochInfosResponse.Epochs[0].Identifier, "15 min") - require.Equal(t, epochInfosResponse.Epochs[0].Duration, time.Minute*15) + require.Equal(t, epochInfosResponse.Epochs[0].Identifier, "30 min") + require.Equal(t, epochInfosResponse.Epochs[0].Duration, time.Minute*30) require.Equal(t, epochInfosResponse.Epochs[0].CurrentEpoch, uint64(0)) require.Equal(t, epochInfosResponse.Epochs[0].EpochCountingStarted, false) require.Equal(t, epochInfosResponse.Epochs[1].StartTime, chainStartTime) require.Equal(t, epochInfosResponse.Epochs[1].CurrentEpochStartTime, chainStartTime) - require.Equal(t, epochInfosResponse.Epochs[1].Identifier, "30 min") - require.Equal(t, epochInfosResponse.Epochs[1].Duration, time.Minute*30) + require.Equal(t, epochInfosResponse.Epochs[1].Identifier, "day") + require.Equal(t, epochInfosResponse.Epochs[1].Duration, time.Hour*24) require.Equal(t, epochInfosResponse.Epochs[1].CurrentEpoch, uint64(0)) require.Equal(t, epochInfosResponse.Epochs[1].EpochCountingStarted, false) } @@ -57,7 +57,7 @@ func TestCurrentEpochQuery(t *testing.T) { queryClient := epochstypes.NewQueryClient(queryHelper) // Valid epoch - epochInfosResponse, err := queryClient.CurrentEpoch(gocontext.Background(), &epochstypes.QueryCurrentEpochRequest{Identifier: "15 min"}) + epochInfosResponse, err := queryClient.CurrentEpoch(gocontext.Background(), &epochstypes.QueryCurrentEpochRequest{Identifier: "30 min"}) require.NoError(t, err) require.Equal(t, epochInfosResponse.CurrentEpoch, uint64(0)) diff --git a/x/epochs/keeper/keeper_test.go b/x/epochs/keeper/keeper_test.go index 07d6b4501..74e11e5dd 100644 --- a/x/epochs/keeper/keeper_test.go +++ b/x/epochs/keeper/keeper_test.go @@ -33,8 +33,8 @@ func TestUpsertEpochInfo_HappyPath(t *testing.T) { require.Len(t, allEpochs, 4) // Epochs are ordered in alphabetical order - require.Equal(t, "15 min", allEpochs[0].Identifier) - require.Equal(t, "30 min", allEpochs[1].Identifier) + require.Equal(t, "30 min", allEpochs[0].Identifier) + require.Equal(t, "day", allEpochs[1].Identifier) require.Equal(t, "monthly", allEpochs[2].Identifier) require.Equal(t, "week", allEpochs[3].Identifier) } diff --git a/x/epochs/module.go b/x/epochs/module.go index 15b598c91..1bbd0a53b 100644 --- a/x/epochs/module.go +++ b/x/epochs/module.go @@ -146,7 +146,7 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val // AppModuleSimulation functions -// GenerateGenesisState creates a randomized GenState of the pool-incentives module. +// GenerateGenesisState creates a randomized GenState of the epochs module. func (AppModule) GenerateGenesisState(simState *module.SimulationState) { simulation.RandomizedGenState(simState) } diff --git a/x/epochs/types/epochinfo_test.go b/x/epochs/types/epochinfo_test.go index a43f749b0..f6e5d3d6f 100644 --- a/x/epochs/types/epochinfo_test.go +++ b/x/epochs/types/epochinfo_test.go @@ -12,18 +12,18 @@ func TestDefaultGenesis(t *testing.T) { expectedEpochs := []EpochInfo{ { - Identifier: FifteenMinuteEpochID, + Identifier: ThirtyMinuteEpochID, StartTime: time.Time{}, - Duration: 15 * time.Minute, + Duration: 30 * time.Minute, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: time.Time{}, EpochCountingStarted: false, }, { - Identifier: ThirtyMinuteEpochID, + Identifier: DayEpochID, StartTime: time.Time{}, - Duration: 30 * time.Minute, + Duration: 24 * time.Hour, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: time.Time{}, diff --git a/x/epochs/types/genesis.go b/x/epochs/types/genesis.go index a658e01c9..2c1aea11d 100644 --- a/x/epochs/types/genesis.go +++ b/x/epochs/types/genesis.go @@ -18,18 +18,18 @@ func DefaultGenesis() *GenesisState { func DefaultGenesisFromTime(startTime time.Time) *GenesisState { epochs := []EpochInfo{ { - Identifier: FifteenMinuteEpochID, + Identifier: ThirtyMinuteEpochID, StartTime: startTime, - Duration: 15 * time.Minute, + Duration: 30 * time.Minute, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: startTime, EpochCountingStarted: false, }, { - Identifier: ThirtyMinuteEpochID, + Identifier: DayEpochID, StartTime: startTime, - Duration: 30 * time.Minute, + Duration: 24 * time.Hour, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: startTime, diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go index dde2cbec1..0299a0cfa 100644 --- a/x/inflation/keeper/hooks.go +++ b/x/inflation/keeper/hooks.go @@ -59,7 +59,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb Amount: epochMintProvision.TruncateInt(), } - staking, incentives, communityPool, err := k.MintAndAllocateInflation(ctx, mintedCoin, params) + staking, strategic, communityPool, err := k.MintAndAllocateInflation(ctx, mintedCoin, params) if err != nil { k.Logger(ctx).Error( "SKIPPING INFLATION: failed to mint and allocate inflation", @@ -87,7 +87,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb defer func() { stakingAmt := staking.Amount - incentivesAmt := incentives.Amount + strategicAmt := strategic.Amount cpAmt := communityPool.Amount if mintedCoin.Amount.IsInt64() { @@ -104,10 +104,10 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, ) } - if incentivesAmt.IsInt64() { + if strategicAmt.IsInt64() { telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "allocate", "incentives", "total"}, - float32(incentivesAmt.Int64()), + []string{types.ModuleName, "allocate", "strategic", "total"}, + float32(strategicAmt.Int64()), []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, ) } @@ -132,7 +132,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb // ___________________________________________________________________________________________________ -// Hooks wrapper struct for incentives keeper +// Hooks wrapper struct for inflation keeper type Hooks struct { k Keeper } diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go index e8f0b4029..ab9355b67 100644 --- a/x/inflation/keeper/inflation.go +++ b/x/inflation/keeper/inflation.go @@ -27,8 +27,7 @@ func (k Keeper) MintAndAllocateInflation( return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err } - // Allocate minted coins according to allocation proportions (staking, usage - // incentives, community pool) + // Allocate minted coins according to allocation proportions (staking, strategic, community pool) return k.AllocateExponentialInflation(ctx, coins, params) } @@ -42,7 +41,7 @@ func (k Keeper) MintCoins(ctx sdk.Context, coin sdk.Coin) error { // AllocateExponentialInflation allocates coins from the inflation to external // modules according to allocation proportions: // - staking rewards -> sdk `auth` module fee collector -// - usage incentives -> `x/incentives` module +// - strategic reserves -> root account of x/sudo module // - community pool -> `sdk `distr` module community pool func (k Keeper) AllocateExponentialInflation( ctx sdk.Context, @@ -53,7 +52,7 @@ func (k Keeper) AllocateExponentialInflation( err error, ) { inflationDistribution := params.InflationDistribution - moduleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) + inflationModuleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) // Allocate staking rewards into fee collector account staking = k.GetProportions(ctx, mintedCoin, inflationDistribution.StakingRewards) @@ -72,13 +71,24 @@ func (k Keeper) AllocateExponentialInflation( if err = k.distrKeeper.FundCommunityPool( ctx, sdk.NewCoins(community), - moduleAddr, + inflationModuleAddr, ); err != nil { return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err } - // Remaining balance is strategic reserve allocation - strategic = k.bankKeeper.GetBalance(ctx, moduleAddr, denoms.NIBI) + // Remaining balance is strategic reserve allocation to the root account of the x/sudo module + strategic = k.bankKeeper.GetBalance(ctx, inflationModuleAddr, denoms.NIBI) + strategicAccountAddr, err := k.sudoKeeper.GetRoot(ctx) + if err != nil { + k.Logger(ctx).Error("get root account error", "error", err) + return staking, strategic, community, nil + } + + if err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic)); err != nil { + k.Logger(ctx).Error("send coins to root account error", "error", err) + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil + } + return staking, strategic, community, nil } diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 3b5685338..103e6d721 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -14,58 +14,105 @@ import ( "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/denoms" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - types "github.com/NibiruChain/nibiru/x/inflation/types" + "github.com/NibiruChain/nibiru/x/inflation/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" ) +func init() { + testapp.EnsureNibiruPrefix() +} + func TestMintAndAllocateInflation(t *testing.T) { testCases := []struct { - name string - mintCoin sdk.Coin - expStakingRewardAmt sdk.Coin - expStrategicReservesAmt sdk.Coin - expCommunityPoolAmt sdk.DecCoins + name string + coinsToMint sdk.Coin + expectedStakingAmt sdk.Coin + expectedStrategicAmt sdk.Coin + expectedCommunityAmt sdk.Coin + expectedStakingRewardsBalance sdk.Coin + expectedStrategicReservesBalance sdk.Coin + expectedCommunityPoolBalance sdk.DecCoins + rootAccount string }{ { - "pass", - sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + name: "pass", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", }, { - "pass - no coins minted ", - sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - sdk.DecCoins(nil), + name: "pass - no coins minted ", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedStakingAmt: sdk.Coin{}, + expectedStrategicAmt: sdk.Coin{}, + expectedCommunityAmt: sdk.Coin{}, + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedCommunityPoolBalance: nil, + rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", + }, + { + name: "pass - no root account", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + rootAccount: "", }, } for _, tc := range testCases { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - _, _, _, err := nibiruApp.InflationKeeper.MintAndAllocateInflation(ctx, tc.mintCoin, types.DefaultParams()) + if tc.rootAccount != "" { + t.Logf("setting root account to %s", tc.rootAccount) + nibiruApp.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ + Root: sdk.MustAccAddressFromBech32(tc.rootAccount).String(), + Contracts: []string{}, + }) + } + + staking, strategic, community, err := nibiruApp.InflationKeeper.MintAndAllocateInflation(ctx, tc.coinsToMint, types.DefaultParams()) + require.NoError(t, err) + assert.Equal(t, tc.expectedStakingAmt, staking) + assert.Equal(t, tc.expectedStrategicAmt, strategic) + assert.Equal(t, tc.expectedCommunityAmt, community) // Get balances - balanceInflationModule := nibiruApp.BankKeeper.GetBalance( - ctx, - nibiruApp.AccountKeeper.GetModuleAddress(types.ModuleName), - denoms.NIBI, - ) + var balanceStrategicReserve sdk.Coin + if tc.rootAccount != "" { + strategicAccount, err := nibiruApp.SudoKeeper.GetRoot(ctx) + require.NoError(t, err) + balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance( + ctx, + strategicAccount, + denoms.NIBI, + ) + } else { + // if no root account is specified, then the strategic reserve remains in the x/inflation module account + balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance(ctx, nibiruApp.AccountKeeper.GetModuleAddress(types.ModuleName), denoms.NIBI) + } - feeCollector := nibiruApp.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName) balanceStakingRewards := nibiruApp.BankKeeper.GetBalance( ctx, - feeCollector, + nibiruApp.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName), denoms.NIBI, ) balanceCommunityPool := nibiruApp.DistrKeeper.GetFeePoolCommunityCoins(ctx) require.NoError(t, err, tc.name) - assert.Equal(t, tc.expStakingRewardAmt, balanceStakingRewards) - assert.Equal(t, tc.expStrategicReservesAmt, balanceInflationModule) - assert.Equal(t, tc.expCommunityPoolAmt, balanceCommunityPool) + assert.Equal(t, tc.expectedStakingRewardsBalance, balanceStakingRewards) + assert.Equal(t, tc.expectedStrategicReservesBalance, balanceStrategicReserve) + assert.Equal(t, tc.expectedCommunityPoolBalance, balanceCommunityPool) }) } } diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index e7ecc1b86..b9172322e 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -22,6 +22,7 @@ type Keeper struct { bankKeeper types.BankKeeper distrKeeper types.DistrKeeper stakingKeeper types.StakingKeeper + sudoKeeper types.SudoKeeper feeCollectorName string CurrentPeriod collections.Sequence @@ -33,14 +34,15 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey storetypes.StoreKey, paramspace paramstypes.Subspace, - ak types.AccountKeeper, - bk types.BankKeeper, - dk types.DistrKeeper, - sk types.StakingKeeper, + accountKeeper types.AccountKeeper, + bankKeeper types.BankKeeper, + distributionKeeper types.DistrKeeper, + stakingKeeper types.StakingKeeper, + sudoKeeper types.SudoKeeper, feeCollectorName string, ) Keeper { // ensure mint module account is set - if addr := ak.GetModuleAddress(types.ModuleName); addr == nil { + if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { panic("the inflation module account has not been set") } @@ -53,10 +55,11 @@ func NewKeeper( storeKey: storeKey, cdc: cdc, paramSpace: paramspace, - accountKeeper: ak, - bankKeeper: bk, - distrKeeper: dk, - stakingKeeper: sk, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + distrKeeper: distributionKeeper, + stakingKeeper: stakingKeeper, + sudoKeeper: sudoKeeper, feeCollectorName: feeCollectorName, CurrentPeriod: collections.NewSequence(storeKey, 0), NumSkippedEpochs: collections.NewSequence(storeKey, 1), diff --git a/x/inflation/module.go b/x/inflation/module.go index 3669e52cb..c21b4682b 100644 --- a/x/inflation/module.go +++ b/x/inflation/module.go @@ -47,12 +47,12 @@ func (AppModuleBasic) ConsensusVersion() uint64 { return 1 } -// RegisterInterfaces registers interfaces and implementations of the incentives +// RegisterInterfaces registers interfaces and implementations of the inflation // module. func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { } -// DefaultGenesis returns default genesis state as raw bytes for the incentives +// DefaultGenesis returns default genesis state as raw bytes for the inflation // module. func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { return cdc.MustMarshalJSON(types.DefaultGenesisState()) diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index c27401d0b..17b3a362e 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -39,3 +39,7 @@ type StakingKeeper interface { StakingTokenSupply(ctx sdk.Context) sdkmath.Int TotalBondedTokens(ctx sdk.Context) sdkmath.Int } + +type SudoKeeper interface { + GetRoot(ctx sdk.Context) (sdk.AccAddress, error) +} diff --git a/x/sudo/keeper/keeper.go b/x/sudo/keeper/keeper.go index c5d6fdfde..3b7a6a10b 100644 --- a/x/sudo/keeper/keeper.go +++ b/x/sudo/keeper/keeper.go @@ -26,6 +26,21 @@ func NewKeeper( } } +// Returns the root address of the sudo module. +func (k Keeper) GetRoot(ctx sdk.Context) (sdk.AccAddress, error) { + sudoers, err := k.Sudoers.Get(ctx) + if err != nil { + return nil, err + } + + addr, err := sdk.AccAddressFromBech32(sudoers.Root) + if err != nil { + return nil, err + } + + return addr, nil +} + func (k Keeper) senderHasPermission(sender string, root string) error { if sender != root { return fmt.Errorf(`message must be sent by root user. root: "%s", sender: "%s"`, From 042e3699835d4193185aea7fafe8580b7e134b73 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 31 Oct 2023 17:21:46 -0500 Subject: [PATCH 11/99] fix(keeper): inflation keeper instantiation --- app/keepers.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/keepers.go b/app/keepers.go index b008f996d..733246c2b 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -345,11 +345,6 @@ func (app *NibiruApp) InitKeepers( appCodec, keys[epochstypes.StoreKey], ) - app.InflationKeeper = inflationkeeper.NewKeeper( - appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, authtypes.FeeCollectorName, - ) - app.SudoKeeper = keeper.NewKeeper( appCodec, keys[sudotypes.StoreKey], ) From 9c0f4f50ccac91bae2c89a1d44bc5baa3b1effe8 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 1 Nov 2023 22:31:47 -0500 Subject: [PATCH 12/99] feat(oracle): edit oracle params msg (#1658) --- CHANGELOG.md | 6 + app/app.go | 14 +- app/keepers.go | 4 +- cmd/nibid/cmd/base64.go | 53 + cmd/nibid/cmd/root.go | 1 + contrib/scripts/localnet.sh | 8 +- proto/nibiru/oracle/v1/tx.proto | 105 ++ wasmbinding/bindings/execute_msg.json | 109 -- wasmbinding/bindings/marshalling_test.go | 127 -- wasmbinding/bindings/msg.go | 142 -- wasmbinding/bindings/query.go | 176 --- wasmbinding/bindings/query_resp.json | 120 -- wasmbinding/exec_oracle.go | 80 -- wasmbinding/exec_oracle_test.go | 236 ---- wasmbinding/exec_test.go | 308 ---- wasmbinding/message_plugin.go | 96 -- wasmbinding/querier.go | 88 -- wasmbinding/querier_test.go | 307 ---- wasmbinding/test/cli_test.go | 143 -- wasmbinding/test/testdata/cw_nameservice.wasm | Bin 146179 -> 0 bytes wasmbinding/wasm.go | 11 +- wasmbinding/wasmbin/bindings_perp.wasm | Bin 347370 -> 0 bytes wasmbinding/wasmbin/contracts.go | 36 - wasmbinding/wasmbin/contracts_test.go | 35 - wasmbinding/wasmbin/controller.wasm | Bin 214331 -> 0 bytes wasmbinding/wasmbin/export.go | 22 - wasmbinding/wasmbin/shifter.wasm | Bin 186232 -> 0 bytes wasmbinding/wasmbin_test.go | 138 -- x/common/testutil/testapp/testapp.go | 2 +- x/oracle/client/cli/tx.go | 145 ++ x/oracle/keeper/edit_params_test.go | 54 + x/oracle/keeper/msg_server.go | 34 +- x/oracle/keeper/params.go | 50 + x/oracle/keeper/params_test.go | 379 +++++ x/oracle/keeper/test_utils.go | 14 +- x/oracle/keeper/update_exchange_rates_test.go | 2 +- x/oracle/module.go | 8 +- x/oracle/types/msgs.go | 35 + x/oracle/types/tx.pb.go | 1252 ++++++++++++++++- x/oracle/types/tx.pb.gw.go | 83 ++ x/sudo/keeper/keeper_test.go | 2 +- 41 files changed, 2184 insertions(+), 2241 deletions(-) create mode 100644 cmd/nibid/cmd/base64.go delete mode 100644 wasmbinding/bindings/execute_msg.json delete mode 100644 wasmbinding/bindings/marshalling_test.go delete mode 100644 wasmbinding/bindings/msg.go delete mode 100644 wasmbinding/bindings/query.go delete mode 100644 wasmbinding/bindings/query_resp.json delete mode 100644 wasmbinding/exec_oracle.go delete mode 100644 wasmbinding/exec_oracle_test.go delete mode 100644 wasmbinding/exec_test.go delete mode 100644 wasmbinding/message_plugin.go delete mode 100644 wasmbinding/querier.go delete mode 100644 wasmbinding/querier_test.go delete mode 100644 wasmbinding/test/cli_test.go delete mode 100644 wasmbinding/test/testdata/cw_nameservice.wasm delete mode 100644 wasmbinding/wasmbin/bindings_perp.wasm delete mode 100644 wasmbinding/wasmbin/contracts.go delete mode 100644 wasmbinding/wasmbin/contracts_test.go delete mode 100644 wasmbinding/wasmbin/controller.wasm delete mode 100644 wasmbinding/wasmbin/export.go delete mode 100644 wasmbinding/wasmbin/shifter.wasm delete mode 100644 wasmbinding/wasmbin_test.go create mode 100644 x/oracle/keeper/edit_params_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ab4787eb..61bcbc4e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Features + +* [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features diff --git a/app/app.go b/app/app.go index b93d5abcb..c4a21d038 100644 --- a/app/app.go +++ b/app/app.go @@ -44,7 +44,7 @@ import ( "github.com/rakyll/statik/fs" "github.com/spf13/cast" - wasmbinding "github.com/NibiruChain/nibiru/wasmbinding" + "github.com/NibiruChain/nibiru/wasmbinding" ) const ( @@ -109,20 +109,18 @@ func init() { } // GetWasmOpts build wasm options -func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasm.Option { +func GetWasmOpts(appOpts servertypes.AppOptions, nibiruApp NibiruApp) []wasm.Option { var wasmOpts []wasm.Option if cast.ToBool(appOpts.Get("telemetry.enabled")) { wasmOpts = append(wasmOpts, wasmkeeper.WithVMCacheMetrics(prometheus.DefaultRegisterer)) } - // Add the bindings to the app's set of []wasm.Option. wasmOpts = append(wasmOpts, wasmbinding.NibiruWasmOptions( - nibiru.GRPCQueryRouter(), - nibiru.appCodec, - nibiru.SudoKeeper, - nibiru.OracleKeeper, + nibiruApp.GRPCQueryRouter(), + nibiruApp.AppCodec(), + nibiruApp.SudoKeeper, )...) - + // Add the bindings to the app's set of []wasm.Option. return wasmOpts } diff --git a/app/keepers.go b/app/keepers.go index 733246c2b..c2429581b 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -417,7 +417,7 @@ func (app *NibiruApp) InitKeepers( wasmConfig, supportedFeatures, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - GetWasmOpts(*app, appOpts)..., + GetWasmOpts(appOpts, *app)..., ) // DevGas uses WasmKeeper @@ -564,7 +564,7 @@ func (app *NibiruApp) initAppModules( authzmodule.NewAppModule(appCodec, app.authzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), // Nibiru modules - oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), + oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper, app.SudoKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.stakingKeeper), sudo.NewAppModule(appCodec, app.SudoKeeper), diff --git a/cmd/nibid/cmd/base64.go b/cmd/nibid/cmd/base64.go new file mode 100644 index 000000000..5f235d3ea --- /dev/null +++ b/cmd/nibid/cmd/base64.go @@ -0,0 +1,53 @@ +package cmd + +import ( + "encoding/base64" + "encoding/json" + "fmt" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec/types" + "github.com/spf13/cobra" +) + +func GetBuildWasmMsg() *cobra.Command { + cmd := &cobra.Command{ + Use: "build-stargate-wasm [message data]", + Short: "Build wasm Stargate message in Base64", + Long: `This message is used to build a Cosmos SDK, + in the format used to be sent as a Stargate message in a CosmWasm transaction.`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + theMsg := args[0] + + anyMsg := types.Any{} + err := clientCtx.Codec.UnmarshalJSON([]byte(theMsg), &anyMsg) + if err != nil { + return err + } + + type stargateMessage struct { + TypeURL string `json:"type_url,omitempty"` + Value string `json:"value,omitempty"` + } + + js, err := json.Marshal(map[string]interface{}{ + "stargate": stargateMessage{ + TypeURL: anyMsg.TypeUrl, + Value: base64.StdEncoding.EncodeToString(anyMsg.Value), + }, + }) + if err != nil { + return err + } + + fmt.Println(string(js)) + + return nil + }, + } + + return cmd +} diff --git a/cmd/nibid/cmd/root.go b/cmd/nibid/cmd/root.go index 7f9630462..6edbc0a18 100644 --- a/cmd/nibid/cmd/root.go +++ b/cmd/nibid/cmd/root.go @@ -138,6 +138,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig app.EncodingConfig) { rootCmd.AddCommand( InitCmd(app.ModuleBasics, app.DefaultNodeHome), AddGenesisAccountCmd(app.DefaultNodeHome), + GetBuildWasmMsg(), tmcli.NewCompletionCmd(rootCmd, true), testnetCmd(app.ModuleBasics, banktypes.GenesisBalancesIterator{}), debug.Cmd(), diff --git a/contrib/scripts/localnet.sh b/contrib/scripts/localnet.sh index 868ea94b0..1fb1f064e 100755 --- a/contrib/scripts/localnet.sh +++ b/contrib/scripts/localnet.sh @@ -244,8 +244,8 @@ add_genesis_perp_markets_with_coingecko_prices() { fi } - nibid genesis add-genesis-perp-market --pair=ubtc:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_btc - check_fail nibid genesis add-genesis-perp-market +# nibid genesis add-genesis-perp-market --pair=ubtc:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_btc +# check_fail nibid genesis add-genesis-perp-market price_eth=$(cat tmp_market_prices.json | jq -r '.ethereum.usd') price_eth=${price_eth%.*} @@ -253,8 +253,8 @@ add_genesis_perp_markets_with_coingecko_prices() { return 1 fi - nibid genesis add-genesis-perp-market --pair=ueth:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_eth - check_fail nibid genesis add-genesis-perp-market +# nibid genesis add-genesis-perp-market --pair=ueth:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_eth +# check_fail nibid genesis add-genesis-perp-market echo 'tmp_market_prices: ' cat $temp_json_fname | jq . diff --git a/proto/nibiru/oracle/v1/tx.proto b/proto/nibiru/oracle/v1/tx.proto index 19fd2f833..dfc30f45e 100644 --- a/proto/nibiru/oracle/v1/tx.proto +++ b/proto/nibiru/oracle/v1/tx.proto @@ -3,6 +3,8 @@ package nibiru.oracle.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "google/protobuf/duration.proto"; +import "nibiru/oracle/v1/oracle.proto"; option go_package = "github.com/NibiruChain/nibiru/x/oracle/types"; @@ -29,6 +31,11 @@ service Msg { returns (MsgDelegateFeedConsentResponse) { option (google.api.http).post = "/nibiru/oracle/feeder-delegate"; } + + rpc EditOracleParams(MsgEditOracleParams) + returns (MsgEditOracleParamsResponse) { + option (google.api.http).post = "/nibiru/oracle/params"; + } } // MsgAggregateExchangeRatePrevote represents a message to submit @@ -84,3 +91,101 @@ message MsgDelegateFeedConsent { // MsgDelegateFeedConsentResponse defines the Msg/DelegateFeedConsent response // type. message MsgDelegateFeedConsentResponse {} + +message MsgEditOracleParams { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + + OracleParamsMsg params = 2 [ (gogoproto.moretags) = "yaml:\"params\"" ]; +} + +message MsgEditOracleParamsResponse {} + +message OracleParamsMsg { + option (gogoproto.equal) = true; + option (gogoproto.goproto_stringer) = true; + + // VotePeriod defines the number of blocks during which voting takes place. + uint64 vote_period = 1 [ + (gogoproto.moretags) = "yaml:\"vote_period\"", + (gogoproto.nullable) = true + ]; + + // VoteThreshold specifies the minimum proportion of votes that must be + // received for a ballot to pass. + string vote_threshold = 2 [ + (gogoproto.moretags) = "yaml:\"vote_threshold\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + // RewardBand defines a maxium divergence that a price vote can have from the + // weighted median in the ballot. If a vote lies within the valid range + // defined by: + // μ := weightedMedian, + // validRange := μ ± (μ * rewardBand / 2), + // then rewards are added to the validator performance. + // Note that if the reward band is smaller than 1 standard + // deviation, the band is taken to be 1 standard deviation.a price + string reward_band = 3 [ + (gogoproto.moretags) = "yaml:\"reward_band\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + // The set of whitelisted markets, or asset pairs, for the module. + // Ex. '["unibi:uusd","ubtc:uusd"]' + repeated string whitelist = 4 [ + (gogoproto.moretags) = "yaml:\"whitelist\"", + (gogoproto.customtype) = "github.com/NibiruChain/nibiru/x/common/asset.Pair", + (gogoproto.nullable) = true + ]; + // SlashFraction returns the proportion of an oracle's stake that gets + // slashed in the event of slashing. `SlashFraction` specifies the exact + // penalty for failing a voting period. + string slash_fraction = 5 [ + (gogoproto.moretags) = "yaml:\"slash_fraction\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + // SlashWindow returns the number of voting periods that specify a + // "slash window". After each slash window, all oracles that have missed more + // than the penalty threshold are slashed. Missing the penalty threshold is + // synonymous with submitting fewer valid votes than `MinValidPerWindow`. + uint64 slash_window = 6 [ + (gogoproto.moretags) = "yaml:\"slash_window\"", + (gogoproto.nullable) = true + ]; + string min_valid_per_window = 7 [ + (gogoproto.moretags) = "yaml:\"min_valid_per_window\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + + // Amount of time to look back for TWAP calculations + google.protobuf.Duration twap_lookback_window = 8 [ + (gogoproto.nullable) = true, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "twap_lookback_window,omitempty", + (gogoproto.moretags) = "yaml:\"twap_lookback_window\"" + ]; + + // The minimum number of voters (i.e. oracle validators) per pair for it to be + // considered a passing ballot. Recommended at least 4. + uint64 min_voters = 9 [ + (gogoproto.moretags) = "yaml:\"min_voters\"", + (gogoproto.nullable) = true + ]; + + // The validator fee ratio that is given to validators every epoch. + string validator_fee_ratio = 10 [ + (gogoproto.moretags) = "yaml:\"validator_fee_ratio\"", + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + + uint64 expiration_blocks = 11 [ + (gogoproto.moretags) = "yaml:\"expiration_blocks\"", + (gogoproto.nullable) = true + ]; +} \ No newline at end of file diff --git a/wasmbinding/bindings/execute_msg.json b/wasmbinding/bindings/execute_msg.json deleted file mode 100644 index 3e4e7f9ac..000000000 --- a/wasmbinding/bindings/execute_msg.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "market_order": { - "market_order": { - "pair": "ETH:USD", - "is_long": true, - "quote_amount": "100", - "leverage": "5", - "base_amount_limit": "1000" - } - }, - "close_position": { - "close_position": { - "pair": "ETH:USD" - } - }, - "add_margin": { - "add_margin": { - "pair": "ETH:USD", - "margin": { - "denom": "uusd", - "amount": "100" - } - } - }, - "remove_margin": { - "remove_margin": { - "pair": "ETH:USD", - "margin": { - "denom": "uusd", - "amount": "100" - } - } - }, - "multi_liquidate": { - "multi_liquidate": { - "pair": "ETH:USD", - "liquidations": [ - { - "pair": "ETH:USD", - "trader": "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl" - }, - { - "pair": "ETH:USD", - "trader": "nibi1ah8gqrtjllhc5ld4rxgl4uglvwl93ag0sh6e6v" - } - ] - } - }, - "donate_to_insurance_fund": { - "donate_to_insurance_fund": { - "donation": { - "denom": "uusd", - "amount": "100" - } - } - }, - "peg_shift": { - "peg_shift": { - "pair": "ETH:USD", - "peg_mult": "420" - } - }, - "depth_shift": { - "depth_shift": { - "pair": "ETH:USD", - "depth_mult": "420" - } - }, - "no_op": { - "no_op": {} - }, - "insurance_fund_withdraw": { - "insurance_fund_withdraw": { - "amount": "420", - "to": "nibi1ah8gqrtjllhc5ld4rxgl4uglvwl93ag0sh6e6v" - } - }, - "set_market_enabled": { - "set_market_enabled": { - "pair": "ETH:USD", - "enabled": true - } - }, - "edit_oracle_params": { - "edit_oracle_params": { - "vote_period": "420", - "vote_threshold": "420", - "reward_band": "420", - "whitelist": [ - "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl", - "nibi1ah8gqrtjllhc5ld4rxgl4uglvwl93ag0sh6e6v" - ], - "slash_fraction": "420", - "slash_window": "420", - "min_valid_per_window": "420", - "twap_lookback_window": "420", - "min_voters": "420", - "validator_fee_ratio": "420" - } - }, - "create_market": { - "create_market": { - "pair": "ETH:USD", - "peg_mult": "420", - "sqrt_depth": "420", - "market_params": null - } - } -} \ No newline at end of file diff --git a/wasmbinding/bindings/marshalling_test.go b/wasmbinding/bindings/marshalling_test.go deleted file mode 100644 index 9c8d48706..000000000 --- a/wasmbinding/bindings/marshalling_test.go +++ /dev/null @@ -1,127 +0,0 @@ -package bindings_test - -import ( - "bytes" - "encoding/json" - "os" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" -) - -type TestSuiteBindingJsonTypes struct { - suite.Suite - fileJson map[string]json.RawMessage -} - -func TestSuiteBindingJsonTypes_RunAll(t *testing.T) { - suite.Run(t, new(TestSuiteBindingJsonTypes)) -} - -func (s *TestSuiteBindingJsonTypes) SetupSuite() { - app.SetPrefixes(app.AccountAddressPrefix) - file, err := os.Open("query_resp.json") - s.NoError(err) - defer file.Close() - - var fileJson map[string]json.RawMessage - err = json.NewDecoder(file).Decode(&fileJson) - s.NoError(err) - s.fileJson = fileJson -} - -func (s *TestSuiteBindingJsonTypes) TestQueries() { - testCaseMap := map[string]any{ - "all_markets": new(bindings.AllMarketsResponse), - "reserves": new(bindings.ReservesResponse), - "base_price": new(bindings.BasePriceResponse), - "position": new(bindings.PositionResponse), - "positions": new(bindings.PositionsResponse), - "module_params": new(bindings.PerpParamsResponse), - "premium_fraction": new(bindings.PremiumFractionResponse), - "metrics": new(bindings.MetricsResponse), - "module_accounts": new(bindings.ModuleAccountsResponse), - "oracle_prices": new(bindings.OraclePricesResponse), - } - - for name, cwRespPtr := range testCaseMap { - s.T().Run(name, func(t *testing.T) { - err := json.Unmarshal(s.fileJson[name], cwRespPtr) - s.Assert().NoErrorf(err, "name: %v", name) - jsonBz, err := json.Marshal(cwRespPtr) - s.NoErrorf(err, "jsonBz: %s", jsonBz) - }) - } -} - -func getFileJson(t *testing.T) (fileJson map[string]json.RawMessage) { - file, err := os.Open("execute_msg.json") - require.NoError(t, err) - defer file.Close() - - err = json.NewDecoder(file).Decode(&fileJson) - require.NoError(t, err) - return fileJson -} - -func (s *TestSuiteBindingJsonTypes) TestExecuteMsgs() { - t := s.T() - fileJson := getFileJson(t) - - testCaseMap := []string{ - "market_order", - "close_position", - "add_margin", - "remove_margin", - "donate_to_insurance_fund", - "peg_shift", - "depth_shift", - "edit_oracle_params", - "set_market_enabled", - "insurance_fund_withdraw", - "create_market", - "no_op", - } - - for _, name := range testCaseMap { - t.Run(name, func(t *testing.T) { - var bindingMsg bindings.NibiruMsg - err := json.Unmarshal(fileJson[name], &bindingMsg) - assert.NoErrorf(t, err, "name: %v", name) - - jsonBz, err := json.Marshal(bindingMsg) - assert.NoErrorf(t, err, "jsonBz: %s", jsonBz) - - // Json files are not compacted, so we need to compact them before comparing - compactJsonBz, err := compactJsonData(jsonBz) - require.NoError(t, err) - - fileBytes, err := fileJson[name].MarshalJSON() - require.NoError(t, err) - compactFileBytes, err := compactJsonData(fileBytes) - require.NoError(t, err) - - var reconsitutedBindingMsg bindings.NibiruMsg - err = json.Unmarshal(compactFileBytes.Bytes(), &reconsitutedBindingMsg) - require.NoError(t, err) - - compactFileStr := compactFileBytes.String() - compactJsonStr := compactJsonBz.String() - require.EqualValuesf( - t, bindingMsg, reconsitutedBindingMsg, - "compactFileStr: %s\ncompactJsonStr: ", compactFileStr, compactJsonStr, - ) - }) - } -} - -func compactJsonData(data []byte) (*bytes.Buffer, error) { - compactData := new(bytes.Buffer) - err := json.Compact(compactData, data) - return compactData, err -} diff --git a/wasmbinding/bindings/msg.go b/wasmbinding/bindings/msg.go deleted file mode 100644 index 8085a6be0..000000000 --- a/wasmbinding/bindings/msg.go +++ /dev/null @@ -1,142 +0,0 @@ -package bindings - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// NibiruMsg corresponds to the 'ExecuteMsg' enum in the CosmWasm binding -// contracts (Rust). It specifies which wasm execute messages can be called with -// Nibiru bindings and specifies the JSON schema that connects app ⇔ Wasm. -// -// See: -// - https://github.com/NibiruChain/cw-nibiru/blob/90df123f8d32d47b5b280ec6ae7dde0f9dbf2787/contracts/bindings-perp/src/msg.rs -type NibiruMsg struct { - // bindings-perp ExecuteMsg enum types - MarketOrder *MarketOrder `json:"market_order,omitempty"` - ClosePosition *ClosePosition `json:"close_position,omitempty"` - // MultiLiquidate *MultiLiquidate `json:"multi_liquidate,omitempty"` // TODO - AddMargin *AddMargin `json:"add_margin,omitempty"` - RemoveMargin *RemoveMargin `json:"remove_margin,omitempty"` - DonateToInsuranceFund *DonateToInsuranceFund `json:"donate_to_insurance_fund,omitempty"` // TODO - InsuranceFundWithdraw *InsuranceFundWithdraw `json:"insurance_fund_withdraw,omitempty"` - PegShift *PegShift `json:"peg_shift,omitempty"` - DepthShift *DepthShift `json:"depth_shift,omitempty"` - SetMarketEnabled *SetMarketEnabled `json:"set_market_enabled,omitempty"` - CreateMarket *CreateMarket `json:"create_market,omitempty"` - - EditOracleParams *EditOracleParams `json:"edit_oracle_params,omitempty"` - - // Short for "no operation". A wasm binding payload that does nothing. - NoOp *NoOp `json:"no_op,omitempty"` -} - -type MarketOrder struct { - Pair string `json:"pair"` - IsLong bool `json:"is_long"` - QuoteAmount sdkmath.Int `json:"quote_amount"` - Leverage sdk.Dec `json:"leverage"` - BaseAmountLimit sdkmath.Int `json:"base_amount_limit"` -} - -type ClosePosition struct { - Pair string `json:"pair"` -} - -type MultiLiquidate struct { - Liquidations []LiquidationArgs `json:"liquidations"` -} - -type LiquidationArgs struct { - Pair string `json:"pair"` - Trader string `json:"trader"` -} - -type AddMargin struct { - Pair string `json:"pair"` - Margin sdk.Coin `json:"margin"` -} - -type RemoveMargin struct { - Pair string `json:"pair"` - Margin sdk.Coin `json:"margin"` -} - -type PegShift struct { - Pair string `json:"pair"` - PegMult sdk.Dec `json:"peg_mult"` -} - -type DepthShift struct { - Pair string `json:"pair"` - DepthMult sdk.Dec `json:"depth_mult"` -} - -type DonateToInsuranceFund struct { - Sender string `json:"sender"` - Donation sdk.Coin `json:"donation"` -} - -type EditOracleParams struct { - VotePeriod *sdkmath.Int `json:"vote_period,omitempty"` - VoteThreshold *sdk.Dec `json:"vote_threshold,omitempty"` - RewardBand *sdk.Dec `json:"reward_band,omitempty"` - Whitelist []string `json:"whitelist,omitempty"` - SlashFraction *sdk.Dec `json:"slash_fraction,omitempty"` - SlashWindow *sdkmath.Int `json:"slash_window,omitempty"` - MinValidPerWindow *sdk.Dec `json:"min_valid_per_window,omitempty"` - TwapLookbackWindow *sdkmath.Int `json:"twap_lookback_window,omitempty"` - MinVoters *sdkmath.Int `json:"min_voters,omitempty"` - ValidatorFeeRatio *sdk.Dec `json:"validator_fee_ratio,omitempty"` -} - -type InsuranceFundWithdraw struct { - Amount sdkmath.Int `json:"amount"` - To string `json:"to"` -} - -type SetMarketEnabled struct { - Pair string `json:"pair"` - Enabled bool `json:"enabled"` -} - -type CreateMarket struct { - Pair string `json:"pair"` - PegMult sdk.Dec `json:"peg_mult,omitempty"` - SqrtDepth sdk.Dec `json:"sqrt_depth,omitempty"` - MarketParams *MarketParams `json:"market_params,omitempty"` -} - -type MarketParams struct { - Pair string - Enabled bool `json:"enabled,omitempty"` - // the minimum margin ratio which a user must maintain on this market - MaintenanceMarginRatio sdk.Dec `json:"maintenance_margin_ratio"` - // the maximum leverage a user is able to be taken on this market - MaxLeverage sdk.Dec `json:"max_leverage"` - // Latest cumulative premium fraction for a given pair. - // Calculated once per funding rate interval. - // A premium fraction is the difference between mark and index, divided by the - // number of payments per day. (mark - index) / # payments in a day - LatestCumulativePremiumFraction sdk.Dec `json:"latest_cumulative_premium_fraction"` - // the percentage of the notional given to the exchange when trading - ExchangeFeeRatio sdk.Dec `json:"exchange_fee_ratio"` - // the percentage of the notional transferred to the ecosystem fund when - // trading - EcosystemFundFeeRatio sdk.Dec `json:"ecosystem_fund_fee_ratio"` - // the percentage of liquidated position that will be - // given to out as a reward. Half of the liquidation fee is given to the - // liquidator, and the other half is given to the ecosystem fund. - LiquidationFeeRatio sdk.Dec `json:"liquidation_fee_ratio"` - // the portion of the position size we try to liquidate if the available - // margin is higher than liquidation fee - PartialLiquidationRatio sdk.Dec `json:"partial_liquidation_ratio"` - // specifies the interval on which the funding rate is updated - FundingRateEpochId string `json:"funding_rate_epoch_id,omitempty"` - // specifies the maximum premium fraction to be paid out - MaxFundingRate sdk.Dec `json:"max_funding_rate,omitempty"` - // amount of time to look back for TWAP calculations - TwapLookbackWindow sdkmath.Int `json:"twap_lookback_window"` -} - -type NoOp struct{} diff --git a/wasmbinding/bindings/query.go b/wasmbinding/bindings/query.go deleted file mode 100644 index 0a3a5a436..000000000 --- a/wasmbinding/bindings/query.go +++ /dev/null @@ -1,176 +0,0 @@ -package bindings - -import ( - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// BindingQuery corresponds to the NibiruQuery enum in CosmWasm binding -// contracts (Rust). It specifies which queries can be called with -// Nibiru bindings and specifies the JSON schema that connects app ⇔ Wasm. -// -// ### Note -// 1. The JSON field names must match the ones on the smart contract -// 2. You use a pointer so that each field can be nil, which will be missing in -// the input or output json. What's actually sent from the contract will be an -// instance of the parent type, but the message body will be on one of these -// nullable fields. -// This is part of the reason we need the "omitempty" struct tags -// -// See: -// - https://github.com/NibiruChain/cw-nibiru/blob/90df123f8d32d47b5b280ec6ae7dde0f9dbf2787/contracts/bindings-perp/src/query.rs -type BindingQuery struct { - // bindings-perp NibiruQuery enum types - Reserves *ReservesRequest `json:"reserves,omitempty"` - AllMarkets *AllMarketsRequest `json:"all_markets,omitempty"` - BasePrice *BasePriceRequest `json:"base_price,omitempty"` - Positions *PositionsRequest `json:"positions,omitempty"` - Position *PositionRequest `json:"position,omitempty"` - PremiumFraction *PremiumFractionRequest `json:"premium_fraction,omitempty"` - Metrics *MetricsRequest `json:"metrics,omitempty"` - ModuleAccounts *ModuleAccountsRequest `json:"module_accounts,omitempty"` - PerpParams *PerpParamsRequest `json:"module_params,omitempty"` - OraclePrices *OraclePrices `json:"oracle_prices,omitempty"` -} - -type ReservesRequest struct { - Pair string `json:"pair"` -} - -type ReservesResponse struct { - Pair string `json:"pair"` - BaseReserve sdk.Dec `json:"base_reserve"` - QuoteReserve sdk.Dec `json:"quote_reserve"` -} - -type AllMarketsRequest struct{} - -type AllMarketsResponse struct { - MarketMap map[string]Market `json:"market_map"` -} - -type Market struct { - Pair string `json:"pair"` - Version sdkmath.Int `json:"version"` - BaseReserve sdk.Dec `json:"base_reserve"` - QuoteReserve sdk.Dec `json:"quote_reserve"` - SqrtDepth sdk.Dec `json:"sqrt_depth"` - Depth sdkmath.Int `json:"depth"` - TotalLong sdk.Dec `json:"total_long"` - TotalShort sdk.Dec `json:"total_short"` - PegMult sdk.Dec `json:"peg_mult"` - Config *MarketConfig `json:"config,omitempty"` - MarkPrice sdk.Dec `json:"mark_price"` - IndexPrice string `json:"index_price"` - TwapMark string `json:"twap_mark"` - BlockNumber sdkmath.Int `json:"block_number"` -} - -type MarketConfig struct { - MaintenanceMarginRatio sdk.Dec `json:"maintenance_margin_ratio"` - MaxLeverage sdk.Dec `json:"max_leverage"` -} - -type BasePriceRequest struct { - Pair string `json:"pair"` - IsLong bool `json:"is_long"` - BaseAmount sdkmath.Int `json:"base_amount"` -} - -type BasePriceResponse struct { - Pair string `json:"pair"` - BaseAmount sdk.Dec `json:"base_amount"` - IsLong bool `json:"is_long"` -} - -type PositionsRequest struct { - Trader string `json:"trader"` -} - -type Position struct { - TraderAddr string `json:"trader_addr"` - Pair string `json:"pair"` - Size sdk.Dec `json:"size"` - Margin sdk.Dec `json:"margin"` - OpenNotional sdk.Dec `json:"open_notional"` - LatestCPF sdk.Dec `json:"latest_cpf"` - BlockNumber sdkmath.Int `json:"block_number"` -} - -type PositionsResponse struct { - Positions map[string]Position `json:"positions"` -} - -type PositionRequest struct { - Trader string `json:"trader"` - Pair string `json:"pair"` -} - -type PositionResponse struct { - Position Position `json:"position"` - Notional sdk.Dec `json:"notional"` - Upnl sdk.Dec `json:"upnl"` - Margin_ratio_mark sdk.Dec `json:"margin_ratio_mark"` - Margin_ratio_index sdk.Dec `json:"margin_ratio_index"` - Block_number sdkmath.Int `json:"block_number"` -} - -type PremiumFractionRequest struct { - Pair string `json:"pair"` -} - -type PremiumFractionResponse struct { - Pair string `json:"pair"` - CPF sdk.Dec `json:"cpf"` - EstimatedNextCPF sdk.Dec `json:"estimated_next_cpf"` -} - -type MetricsRequest struct { - Pair string `json:"pair"` -} - -type MetricsResponse struct { - Metrics Metrics `json:"metrics"` -} - -type Metrics struct { - Pair string `json:"pair"` - NetSize sdkmath.LegacyDec `json:"net_size"` - VolumeQuote sdkmath.LegacyDec `json:"volume_quote"` - VolumeBase sdkmath.LegacyDec `json:"volume_base"` - BlockNumber sdkmath.Int `json:"block_number"` -} - -type ModuleAccountsRequest struct{} - -type ModuleAccountWithBalance struct { - Name string `json:"name"` - Addr sdk.AccAddress `json:"addr"` - Balance []sdk.Coin `json:"balance"` -} - -type ModuleAccountsResponse struct { - ModuleAccounts map[string]ModuleAccountWithBalance `json:"module_accounts"` -} - -type PerpParamsRequest struct{} - -type PerpParamsResponse struct { - ModuleParams PerpParams `json:"module_params"` -} - -type PerpParams struct { - Stopped bool `json:"stopped"` - FeePoolFeeRatio sdkmath.LegacyDec `json:"fee_pool_fee_ratio"` - EcosystemFundFeeRatio sdkmath.LegacyDec `json:"ecosystem_fund_fee_ratio"` - LiquidationFeeRatio sdkmath.LegacyDec `json:"liquidation_fee_ratio"` - PartialLiquidationRatio sdkmath.LegacyDec `json:"partial_liquidation_ratio"` - FundingRateInterval string `json:"funding_rate_interval"` - TwapLookbackWindow sdkmath.Int `json:"twap_lookback_window"` - WhitelistedLiquidators []string `json:"whitelisted_liquidators"` -} - -type OraclePrices struct{} - -type OraclePricesResponse = map[string]sdk.Dec diff --git a/wasmbinding/bindings/query_resp.json b/wasmbinding/bindings/query_resp.json deleted file mode 100644 index eb2eb2c07..000000000 --- a/wasmbinding/bindings/query_resp.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "all_markets": { - "market_map": { - "ETH:USD": { - "pair": "ETH:USD", - "base_reserve": "69", - "quote_reserve": "69", - "sqrt_depth": "69", - "depth": "4761", - "total_long": "420", - "total_short": "69", - "peg_mult": "420", - "config": { - "maintenance_margin_ratio": "420", - "max_leverage": "420" - }, - "mark_price": "420", - "index_price": "123", - "twap_mark": "456", - "block_number": "42" - } - } - }, - "reserves": { - "pair": "ETH:USD", - "base_reserve": "420", - "quote_reserve": "69" - }, - "base_price": { - "pair": "ETH:USD", - "base_amount": "1", - "quote_amount": "420", - "is_long": false - }, - "position": { - "position": { - "trader_addr": "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl", - "pair": "ETH:USD", - "size": "420", - "margin": "420", - "open_notional": "420", - "latest_cpf": "0", - "block_number": "1" - }, - "notional": "420", - "upnl": "69", - "margin_ratio_mark": "0", - "margin_ratio_index": "0", - "block_number": "0" - }, - "positions": { - "positions": { - "ETH:USD": { - "trader_addr": "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl", - "pair": "ETH:USD", - "size": "420", - "margin": "420", - "open_notional": "420", - "latest_cpf": "0", - "block_number": "1" - }, - "BTC:USD": { - "trader_addr": "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl", - "pair": "BTC:USD", - "size": "420", - "margin": "420", - "open_notional": "420", - "latest_cpf": "0", - "block_number": "1" - } - } - }, - "module_params": { - "module_params": { - "stopped": false, - "fee_pool_fee_ratio": "420", - "ecosystem_fund_fee_ratio": "69", - "liquidation_fee_ratio": "69", - "partial_liquidation_ratio": "0", - "funding_rate_interval": "1h", - "twap_lookback_window": "3600", - "whitelisted_liquidators": [ - "nibi1ah8gqrtjllhc5ld4rxgl4uglvwl93ag0sh6e6v", - "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl" - ] - } - }, - "premium_fraction": { - "pair": "ETH:USD", - "cpf": "0", - "estimated_next_cpf": "69" - }, - "metrics": { - "metrics": { - "pair": "ETH:USD", - "net_size": "420", - "volume_quote": "1", - "volume_base": "420", - "block_number": "42" - } - }, - "module_accounts": { - "module_accounts": { - "acc1": { - "name": "acc1", - "addr": "nibi1x5zknk8va44th5vjpg0fagf0lxx0rvurpmp8gs", - "balance": [ - { - "denom": "foocoin", - "amount": "420" - } - ] - } - } - }, - "oracle_prices": { - "ETH:USD": "420", - "NIBI:USD": "69" - } -} \ No newline at end of file diff --git a/wasmbinding/exec_oracle.go b/wasmbinding/exec_oracle.go deleted file mode 100644 index 606f993b4..000000000 --- a/wasmbinding/exec_oracle.go +++ /dev/null @@ -1,80 +0,0 @@ -package wasmbinding - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/x/common/asset" - oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" - oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" -) - -type ExecutorOracle struct { - Oracle oraclekeeper.Keeper -} - -func (o ExecutorOracle) SetOracleParams(msg *bindings.EditOracleParams, ctx sdk.Context) error { - params, err := o.Oracle.Params.Get(ctx) - if err != nil { - return fmt.Errorf("get oracle params error: %s", err.Error()) - } - - mergedParams := mergeOracleParams(msg, params) - - o.Oracle.UpdateParams(ctx, mergedParams) - return nil -} - -// mergeOracleParams takes the oracle params from the wasm msg and merges them into the existing params -// keeping any existing values if not set in the wasm msg -func mergeOracleParams(msg *bindings.EditOracleParams, oracleParams oracletypes.Params) oracletypes.Params { - if msg.VotePeriod != nil { - oracleParams.VotePeriod = msg.VotePeriod.Uint64() - } - - if msg.VoteThreshold != nil { - oracleParams.VoteThreshold = *msg.VoteThreshold - } - - if msg.RewardBand != nil { - oracleParams.RewardBand = *msg.RewardBand - } - - if msg.Whitelist != nil { - whitelist := make([]asset.Pair, len(msg.Whitelist)) - for i, pair := range msg.Whitelist { - whitelist[i] = asset.MustNewPair(pair) - } - - oracleParams.Whitelist = whitelist - } - - if msg.SlashFraction != nil { - oracleParams.SlashFraction = *msg.SlashFraction - } - - if msg.SlashWindow != nil { - oracleParams.SlashWindow = msg.SlashWindow.Uint64() - } - - if msg.MinValidPerWindow != nil { - oracleParams.MinValidPerWindow = *msg.MinValidPerWindow - } - - if msg.TwapLookbackWindow != nil { - oracleParams.TwapLookbackWindow = time.Duration(msg.TwapLookbackWindow.Int64()) - } - - if msg.MinVoters != nil { - oracleParams.MinVoters = msg.MinVoters.Uint64() - } - - if msg.ValidatorFeeRatio != nil { - oracleParams.ValidatorFeeRatio = *msg.ValidatorFeeRatio - } - - return oracleParams -} diff --git a/wasmbinding/exec_oracle_test.go b/wasmbinding/exec_oracle_test.go deleted file mode 100644 index a9372e8b8..000000000 --- a/wasmbinding/exec_oracle_test.go +++ /dev/null @@ -1,236 +0,0 @@ -package wasmbinding_test - -import ( - "testing" - "time" - - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" -) - -func TestSuiteOracleExecutor_RunAll(t *testing.T) { - suite.Run(t, new(TestSuiteOracleExecutor)) -} - -type TestSuiteOracleExecutor struct { - suite.Suite - - nibiru app.NibiruApp - contractDeployer sdk.AccAddress - exec wasmbinding.ExecutorOracle - contract sdk.AccAddress - ctx sdk.Context -} - -func (s *TestSuiteOracleExecutor) SetupSuite() { - sender := testutil.AccAddress() - s.contractDeployer = sender - - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) - genesisState = genesis.AddOracleGenesis(genesisState) - - nibiru := testapp.NewNibiruTestApp(genesisState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - - coins := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.TokensFromConsensusPower(1, sdk.DefaultPowerReduction)), - sdk.NewCoin(denoms.NUSD, sdk.TokensFromConsensusPower(1, sdk.DefaultPowerReduction)), - ) - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - - nibiru, ctx = SetupAllContracts(s.T(), sender, nibiru, ctx) - s.nibiru = *nibiru - s.ctx = ctx - - wasmkeeper.NewMsgServerImpl(&nibiru.WasmKeeper) - s.contract = ContractMap[wasmbin.WasmKeyController] - s.exec = wasmbinding.ExecutorOracle{ - Oracle: nibiru.OracleKeeper, - } -} - -func (s *TestSuiteOracleExecutor) TestExecuteOracleParams() { - period := sdk.NewInt(1234) - cwMsg := &bindings.EditOracleParams{ - VotePeriod: &period, - } - - // Vote Period - params, err := s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(1_000), params.VotePeriod) - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(1234), params.VotePeriod) - - // Vote Threshold - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(sdk.OneDec().Quo(sdk.NewDec(3)), params.VoteThreshold) - - threshold := sdk.MustNewDecFromStr("0.4") - cwMsg = &bindings.EditOracleParams{ - VoteThreshold: &threshold, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(threshold, params.VoteThreshold) - - // Reward Band - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(sdk.NewDecWithPrec(2, 2), params.RewardBand) - - band := sdk.MustNewDecFromStr("0.5") - cwMsg = &bindings.EditOracleParams{ - RewardBand: &band, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(band, params.RewardBand) - - // White List - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(14, len(params.Whitelist)) - - whitelist := []string{"aave:usdc", "sol:usdc"} - cwMsg = &bindings.EditOracleParams{ - Whitelist: whitelist, - } - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(2, len(params.Whitelist)) - - // Slash Fraction - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(sdk.NewDecWithPrec(5, 3), params.SlashFraction) - - slashFraction := sdk.MustNewDecFromStr("0.5") - cwMsg = &bindings.EditOracleParams{ - SlashFraction: &slashFraction, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(slashFraction, params.SlashFraction) - - // Slash Window - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(3600), params.SlashWindow) - - slashWindow := sdk.NewInt(2) - cwMsg = &bindings.EditOracleParams{ - SlashWindow: &slashWindow, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(slashWindow.Uint64(), params.SlashWindow) - - // Min valid per window - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(sdk.NewDecWithPrec(69, 2), params.MinValidPerWindow) - - minValidPerWindow := sdk.MustNewDecFromStr("0.5") - cwMsg = &bindings.EditOracleParams{ - MinValidPerWindow: &minValidPerWindow, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(minValidPerWindow, params.MinValidPerWindow) - - // Twap lookback window - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(time.Minute*15, params.TwapLookbackWindow) - - twapLookbackWindow := sdk.NewInt(int64(time.Second * 30)) - cwMsg = &bindings.EditOracleParams{ - TwapLookbackWindow: &twapLookbackWindow, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(time.Duration(twapLookbackWindow.Int64()), params.TwapLookbackWindow) - - // Min Voters - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(4), params.MinVoters) - - minVoters := sdk.NewInt(2) - cwMsg = &bindings.EditOracleParams{ - MinVoters: &minVoters, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(minVoters.Uint64(), params.MinVoters) - - // Validator Fee Ratio - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(sdk.NewDecWithPrec(5, 2), params.ValidatorFeeRatio) - - validatorFeeRatio := sdk.MustNewDecFromStr("0.7") - cwMsg = &bindings.EditOracleParams{ - ValidatorFeeRatio: &validatorFeeRatio, - } - - err = s.exec.SetOracleParams(cwMsg, s.ctx) - s.Require().NoError(err) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(validatorFeeRatio, params.ValidatorFeeRatio) -} diff --git a/wasmbinding/exec_test.go b/wasmbinding/exec_test.go deleted file mode 100644 index faf78f176..000000000 --- a/wasmbinding/exec_test.go +++ /dev/null @@ -1,308 +0,0 @@ -package wasmbinding_test - -import ( - "encoding/json" - "testing" - "time" - - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/oracle/types" - sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" -) - -// Keeper only used for testing, never for production -type TestOnlySudoKeeper struct { - sudokeeper.Keeper -} - -// SetSudoContracts overwrites the state. This function is a convenience -// function for testing with permissioned contracts in other modules.. -func (k TestOnlySudoKeeper) SetSudoContracts(contracts []string, ctx sdk.Context) { - k.Sudoers.Set(ctx, sudotypes.Sudoers{ - Root: "", - Contracts: contracts, - }) -} - -func TestSuiteExecutor_RunAll(t *testing.T) { - suite.Run(t, new(TestSuiteExecutor)) -} - -func DoCustomBindingExecute( - ctx sdk.Context, - nibiru *app.NibiruApp, - contract sdk.AccAddress, - sender sdk.AccAddress, - cwMsg bindings.NibiruMsg, - funds sdk.Coins, -) (contractRespBz []byte, err error) { - jsonCwMsg, err := json.Marshal(cwMsg) - if err != nil { - return contractRespBz, err - } - - if err := funds.Validate(); err != nil { - return contractRespBz, err - } - - return wasmkeeper.NewDefaultPermissionKeeper(nibiru.WasmKeeper). - Execute(ctx, contract, sender, jsonCwMsg, funds) -} - -func (s *TestSuiteExecutor) ExecuteAgainstContract( - contract sdk.AccAddress, execMsg bindings.NibiruMsg, -) (contractRespBz []byte, err error) { - return DoCustomBindingExecute( - s.ctx, s.nibiru, contract, s.contractDeployer, execMsg, sdk.Coins{}) -} - -type TestSuiteExecutor struct { - suite.Suite - - nibiru *app.NibiruApp - ctx sdk.Context - contractDeployer sdk.AccAddress - - keeper TestOnlySudoKeeper - wasmKeeper *wasmkeeper.PermissionedKeeper - - contractPerp sdk.AccAddress - contractController sdk.AccAddress - contractShifter sdk.AccAddress - happyFields ExampleFields -} - -func (s *TestSuiteExecutor) SetupSuite() { - s.happyFields = GetHappyFields() - sender := testutil.AccAddress() - s.contractDeployer = sender - - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) - genesisState = genesis.AddOracleGenesis(genesisState) - - nibiru := testapp.NewNibiruTestApp(genesisState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - coins := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(10_000_000)), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(420_000*69)), - ) - - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - - nibiru, ctx = SetupAllContracts(s.T(), sender, nibiru, ctx) - s.nibiru = nibiru - s.ctx = ctx - s.keeper = TestOnlySudoKeeper{Keeper: s.nibiru.SudoKeeper} - s.wasmKeeper = wasmkeeper.NewDefaultPermissionKeeper(nibiru.WasmKeeper) - - s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - s.contractController = ContractMap[wasmbin.WasmKeyController] - s.contractShifter = ContractMap[wasmbin.WasmKeyShifter] - s.contractController = ContractMap[wasmbin.WasmKeyController] - s.T().Logf("contract bindings-perp: %s", s.contractPerp) - s.T().Logf("contract shifter: %s", s.contractShifter) - // SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -func (s *TestSuiteExecutor) TestOracleParams() { - defaultParams := types.DefaultParams() - defaultParams.VotePeriod = 1_000 - theVotePeriod := sdk.NewInt(1234) - execMsg := bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - VotePeriod: &theVotePeriod, - }, - } - - params, err := s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(defaultParams, params) - - s.T().Log("Executing without permission should fail") - s.keeper.SetSudoContracts( - []string{}, s.ctx, - ) - contractRespBz, err := s.ExecuteAgainstContract(s.contractController, execMsg) - s.Errorf(err, "contractRespBz: %s", contractRespBz) - - s.T().Log("Executing with permission should succeed") - s.keeper.SetSudoContracts( - []string{s.contractController.String()}, s.ctx, - ) - - // VotePeriod should be updated - theVotePeriod = sdk.NewInt(1234) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - VotePeriod: &theVotePeriod, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(1_234), params.VotePeriod) - - // VoteThreshold should be updated - theVoteThreshold := sdk.NewDecWithPrec(1, 1) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - VoteThreshold: &theVoteThreshold, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(theVoteThreshold, params.VoteThreshold) - - // RewardBand should be updated - theRewardBand := sdk.NewDecWithPrec(1, 1) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - RewardBand: &theRewardBand, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(theRewardBand, params.RewardBand) - - // Whitelist should be updated - theWhitelist := []string{"BTC:USDC"} - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - Whitelist: theWhitelist, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal([]asset.Pair{asset.NewPair("BTC", "USDC")}, params.Whitelist) - - // SlashFraction should be updated - theSlashFraction := sdk.NewDecWithPrec(1, 4) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - SlashFraction: &theSlashFraction, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(theSlashFraction, params.SlashFraction) - - // SlashWindow should be updated - theSlashWindow := sdk.NewInt(1234) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - SlashWindow: &theSlashWindow, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(1234), params.SlashWindow) - - // MinValidPerWindow should be updated - theMinValidPerWindow := sdk.NewDecWithPrec(1, 4) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - MinValidPerWindow: &theMinValidPerWindow, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(theMinValidPerWindow, params.MinValidPerWindow) - - // TwapLookback should be updated - theTwapLookback := sdk.NewInt(1234) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - TwapLookbackWindow: &theTwapLookback, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(time.Duration(1234), params.TwapLookbackWindow) - - // MinVoters should be updated - theMinVoters := sdk.NewInt(1234) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - MinVoters: &theMinVoters, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(uint64(1234), params.MinVoters) - - // Validator Fee Ratio should be updated - theValidatorFeeRatio := sdk.NewDecWithPrec(1, 4) - execMsg = bindings.NibiruMsg{ - EditOracleParams: &bindings.EditOracleParams{ - ValidatorFeeRatio: &theValidatorFeeRatio, - }, - } - - contractRespBz, err = s.ExecuteAgainstContract(s.contractController, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) - - params, err = s.nibiru.OracleKeeper.Params.Get(s.ctx) - s.Require().NoError(err) - s.Require().Equal(theValidatorFeeRatio, params.ValidatorFeeRatio) -} - -func (s *TestSuiteExecutor) TestNoOp() { - contract := s.contractShifter - execMsg := bindings.NibiruMsg{ - NoOp: &bindings.NoOp{}, - } - contractRespBz, err := s.ExecuteAgainstContract(contract, execMsg) - s.NoErrorf(err, "contractRespBz: %s", contractRespBz) -} diff --git a/wasmbinding/message_plugin.go b/wasmbinding/message_plugin.go deleted file mode 100644 index 7a9d607c0..000000000 --- a/wasmbinding/message_plugin.go +++ /dev/null @@ -1,96 +0,0 @@ -package wasmbinding - -import ( - "encoding/json" - - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/x/sudo/keeper" - - sdkerrors "cosmossdk.io/errors" - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" -) - -var _ wasmkeeper.Messenger = (*CustomMessenger)(nil) - -// CustomMessenger is an extension of wasm/keeper.Messenger with its -// own custom `DispatchMsg` for CosmWasm execute calls on Nibiru. -type CustomMessenger struct { - Wasm wasmkeeper.Messenger - Sudo keeper.Keeper - Oracle ExecutorOracle -} - -// NibiruMsgWrapper is a n override of CosmosMsg::Custom -// (json.RawMessage), which corresponds to `NibiruMsgWrapper` in -// the bindings-perp.rs contract. -type NibiruMsgWrapper struct { - // Routes here refer to groups of modules on Nibiru. The idea behind setting - // routes alongside the messae payload is to add information on which module - // or group of modules a particular execute message belongs to. - // For example, the perp bindings have route "perp". - Route *string `json:"route,omitempty"` - // ExecuteMsg is a json struct for ExecuteMsg::{ - // MarketOrder, ClosePosition, AddMargin, RemoveMargin, ...} from the - // bindings smart contracts. - ExecuteMsg *bindings.NibiruMsg `json:"msg,omitempty"` -} - -// DispatchMsg encodes the wasmVM message and dispatches it. -func (messenger *CustomMessenger) DispatchMsg( - ctx sdk.Context, - contractAddr sdk.AccAddress, - contractIBCPortID string, - wasmMsg wasmvmtypes.CosmosMsg, -) (events []sdk.Event, data [][]byte, err error) { - // If the "Custom" field is set, we handle a BindingMsg. - if wasmMsg.Custom != nil { - var contractExecuteMsg NibiruMsgWrapper - if err := json.Unmarshal(wasmMsg.Custom, &contractExecuteMsg); err != nil { - return events, data, sdkerrors.Wrapf(err, "wasmMsg: %s", wasmMsg.Custom) - } - - isNoOp := contractExecuteMsg.ExecuteMsg == nil || contractExecuteMsg.ExecuteMsg.NoOp != nil - if isNoOp { - ctx.Logger().Info("execute DispatchMsg: NoOp (no operation)") - return events, data, nil - } - - switch { - // Oracle module - case contractExecuteMsg.ExecuteMsg.EditOracleParams != nil: - if err := messenger.Sudo.CheckPermissions(contractAddr, ctx); err != nil { - return events, data, err - } - cwMsg := contractExecuteMsg.ExecuteMsg.EditOracleParams - err = messenger.Oracle.SetOracleParams(cwMsg, ctx) - return events, data, err - - default: - err = wasmvmtypes.InvalidRequest{ - Err: "invalid bindings request", - Request: wasmMsg.Custom, - } - return events, data, err - } - } - - // The default execution path is to use the wasmkeeper.Messenger. - return messenger.Wasm.DispatchMsg(ctx, contractAddr, contractIBCPortID, wasmMsg) -} - -func CustomMessageDecorator( - sudoKeeper keeper.Keeper, - oracleKeeper oraclekeeper.Keeper, -) func(wasmkeeper.Messenger) wasmkeeper.Messenger { - return func(originalWasmMessenger wasmkeeper.Messenger) wasmkeeper.Messenger { - return &CustomMessenger{ - Wasm: originalWasmMessenger, - Sudo: sudoKeeper, - Oracle: ExecutorOracle{Oracle: oracleKeeper}, - } - } -} diff --git a/wasmbinding/querier.go b/wasmbinding/querier.go deleted file mode 100644 index 6bbeb72e1..000000000 --- a/wasmbinding/querier.go +++ /dev/null @@ -1,88 +0,0 @@ -package wasmbinding - -import ( - "encoding/json" - - sdkerrors "cosmossdk.io/errors" - wasmvmtypes "github.com/CosmWasm/wasmvm/types" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" - oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" -) - -type QueryPlugin struct { - Oracle *OracleQuerier -} - -// NewQueryPlugin returns a pointer to a new QueryPlugin -func NewQueryPlugin(oracle oraclekeeper.Keeper) QueryPlugin { - return QueryPlugin{ - Oracle: &OracleQuerier{ - oracle: oraclekeeper.NewQuerier(oracle), - }, - } -} - -func (qp *QueryPlugin) ToBinary( - cwResp any, err error, cwReq any, -) ([]byte, error) { - if err != nil { - return nil, sdkerrors.Wrapf(err, - "failed to query: perp all markets: request: %v", - cwReq) - } - bz, err := json.Marshal(cwResp) - if err != nil { - return nil, sdkerrors.Wrapf(err, "failed to JSON marshal response: %v", cwResp) - } - return bz, nil -} - -// CustomQuerier returns a function that is an implementation of the custom -// querier mechanism for specific messages -func CustomQuerier(qp QueryPlugin) func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { - return func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { - var wasmContractQuery bindings.BindingQuery - if err := json.Unmarshal(request, &wasmContractQuery); err != nil { - return nil, sdkerrors.Wrapf(err, "failed to JSON unmarshal nibiru query: %v", err) - } - - switch { - // Add additional query types here - case wasmContractQuery.OraclePrices != nil: - cwReq := wasmContractQuery.OraclePrices - cwResp, err := qp.Oracle.ExchangeRates(ctx, cwReq) - return qp.ToBinary(cwResp, err, cwReq) - - default: - return nil, wasmvmtypes.UnsupportedRequest{Kind: "unknown nibiru query variant"} - } - } -} - -// ---------------------------------------------------------------------- -// OracleQuerier -// ---------------------------------------------------------------------- - -type OracleQuerier struct { - oracle oracletypes.QueryServer -} - -func (oracleExt *OracleQuerier) ExchangeRates( - ctx sdk.Context, cwReq *bindings.OraclePrices, -) (*bindings.OraclePricesResponse, error) { - queryExchangeRatesRequest := oracletypes.QueryExchangeRatesRequest{} - queryExchangeRates, err := oracleExt.oracle.ExchangeRates(ctx, &queryExchangeRatesRequest) - - // Transform Tuple to Map - exchangeRates := make(map[string]sdk.Dec) - for _, exchangeRate := range queryExchangeRates.ExchangeRates { - exchangeRates[exchangeRate.Pair.String()] = exchangeRate.ExchangeRate - } - - cwResp := new(bindings.OraclePricesResponse) - *cwResp = exchangeRates - return cwResp, err -} diff --git a/wasmbinding/querier_test.go b/wasmbinding/querier_test.go deleted file mode 100644 index a983138cc..000000000 --- a/wasmbinding/querier_test.go +++ /dev/null @@ -1,307 +0,0 @@ -package wasmbinding_test - -import ( - "encoding/json" - "testing" - "time" - - sdkerrors "cosmossdk.io/errors" - sdkmath "cosmossdk.io/math" - - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding/bindings" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common" - "github.com/NibiruChain/nibiru/x/common/asset" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" -) - -func TestSuiteQuerier_RunAll(t *testing.T) { - suite.Run(t, new(TestSuiteQuerier)) -} - -func DoCustomBindingQuery( - ctx sdk.Context, - nibiru *app.NibiruApp, - contract sdk.AccAddress, - bindingRequest bindings.BindingQuery, - responsePointer interface{}, -) (contractRespBz []byte, err error) { - // Parse query type compatible with wasm vm - reqJsonBz, err := json.Marshal(bindingRequest) - if err != nil { - return contractRespBz, err - } - - // Query the smart contract - var originalError error - if err := common.TryCatch(func() { - // The WasmVM tends to panic pretty easily with "Wasmer runtimer error". - // TryCatch here makes it more safe and easy to debug. - bz, err := nibiru.WasmKeeper.QuerySmart( - ctx, contract, reqJsonBz, - ) - if err != nil { - originalError = err - } else { - contractRespBz = bz - } - })(); err != nil { - return contractRespBz, sdkerrors.Wrapf( - err, "contractRespBz: %s", contractRespBz) - } - - // originalError: the error raised if the WasmVM doesn't panic - if originalError != nil { - return contractRespBz, originalError - } - - // Parse the response data into the response pointer - err = json.Unmarshal(contractRespBz, responsePointer) - if err != nil { - return contractRespBz, sdkerrors.Wrapf( - err, "responsePointer: %s", responsePointer) - } - - return contractRespBz, nil -} - -type TestSuiteQuerier struct { - suite.Suite - - nibiru *app.NibiruApp - ctx sdk.Context - contractDeployer sdk.AccAddress - - contractPerp sdk.AccAddress - fields ExampleFields -} - -type ExampleFields struct { - Pair string - Trader sdk.AccAddress - Dec sdk.Dec - Int sdkmath.Int - Market bindings.Market -} - -func GetHappyFields() ExampleFields { - fields := ExampleFields{ - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD).String(), - Trader: sdk.AccAddress([]byte("trader")), - Dec: sdk.NewDec(50), - Int: sdk.NewInt(420), - } - - fields.Market = bindings.Market{ - Pair: fields.Pair, - BaseReserve: fields.Dec, - QuoteReserve: fields.Dec, - SqrtDepth: fields.Dec, - Depth: fields.Int, - TotalLong: fields.Dec, - TotalShort: fields.Dec, - PegMult: fields.Dec, - Config: &bindings.MarketConfig{ - MaintenanceMarginRatio: fields.Dec, - MaxLeverage: fields.Dec, - }, - MarkPrice: fields.Dec, - IndexPrice: fields.Dec.String(), - TwapMark: fields.Dec.String(), - BlockNumber: sdk.NewInt(100), - } - return fields -} - -func (s *TestSuiteQuerier) SetupSuite() { - s.fields = GetHappyFields() - sender := testutil.AccAddress() - s.contractDeployer = sender - - genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) - genesisState = genesis.AddOracleGenesis(genesisState) - - nibiru := testapp.NewNibiruTestApp(genesisState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - coins := sdk.NewCoins( - sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000)), - sdk.NewCoin(denoms.NUSD, sdk.NewInt(420)), - ) - s.NoError(testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - - nibiru, ctx = SetupAllContracts(s.T(), sender, nibiru, ctx) - s.nibiru = nibiru - s.ctx = ctx - - s.contractPerp = ContractMap[wasmbin.WasmKeyPerpBinding] - // SetExchangeRates(&s.Suite, s.nibiru, s.ctx) -} - -// Integration test for BindingQuery::AllMarkets against real contract -// func (s *TestSuiteQuerier) TestQueryAllMarkets() { -// bindingQuery := bindings.BindingQuery{ -// AllMarkets: &bindings.AllMarketsRequest{}, -// } -// bindingResp := new(bindings.AllMarketsResponse) - -// respBz, err := DoCustomBindingQuery( -// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// ) -// s.Require().NoErrorf(err, "resp bytes: %s", respBz) - -// for pair, marketAmm := range genesis.START_MARKETS { -// cwMarket := bindingResp.MarketMap[pair.String()] -// s.Assert().EqualValues(marketAmm.Amm.BaseReserve, cwMarket.BaseReserve) -// s.Assert().EqualValues(marketAmm.Amm.QuoteReserve, cwMarket.QuoteReserve) -// s.Assert().EqualValues(marketAmm.Amm.SqrtDepth, cwMarket.SqrtDepth) -// s.Assert().EqualValues(marketAmm.Amm.TotalLong, cwMarket.TotalLong) -// s.Assert().EqualValues(marketAmm.Amm.TotalShort, cwMarket.TotalShort) -// s.Assert().EqualValues(marketAmm.Amm.PriceMultiplier.String(), cwMarket.PegMult.String()) -// s.Assert().EqualValues(marketAmm.Amm.InstMarkPrice().String(), cwMarket.MarkPrice.String()) -// s.Assert().EqualValues(s.ctx.BlockHeight(), cwMarket.BlockNumber.Int64()) -// } -// } - -func (s *TestSuiteQuerier) TestQueryExchangeRate() { - bindingQuery := bindings.BindingQuery{ - OraclePrices: &bindings.OraclePrices{}, - } - bindingResp := new(bindings.OraclePricesResponse) - respBz, err := DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - priceMap := *bindingResp - s.Require().NoErrorf(err, "resp bytes: %s", respBz) - s.Assert().EqualValues(sdk.NewDec(1000).String(), priceMap["ueth:unusd"].String()) -} - -func (s *TestSuiteQuerier) TestQueryBasePrice() { - cwReq := &bindings.BasePriceRequest{ - Pair: s.fields.Pair, - IsLong: true, - BaseAmount: sdk.NewInt(69_420), - } - bindingQuery := bindings.BindingQuery{ - BasePrice: cwReq, - } - bindingResp := new(bindings.BasePriceResponse) - - var respBz []byte - var err error - err = common.TryCatch(func() { - respBz, err = DoCustomBindingQuery( - s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, - ) - s.Require().Errorf(err, "expect error since query is not implemented: resp bytes: %s", respBz) - s.Require().Contains(err.Error(), "Wasmer runtime error") - })() - - // s.Require().NoErrorf(err, "resp bytes: %s", respBz) - // s.Assert().EqualValues(cwReq.Pair, bindingResp.Pair) - // s.Assert().EqualValues(cwReq.IsLong, bindingResp.IsLong) - // s.Assert().EqualValues(cwReq.BaseAmount.String(), bindingResp.BaseAmount.String()) - // s.Assert().True(bindingResp.QuoteAmount.GT(sdk.ZeroDec())) - // - // cwReqBz, err := json.Marshal(cwReq) - // s.T().Logf("cwReq: %s", cwReqBz) - // s.NoError(err) - // - // cwRespBz, err := json.Marshal(bindingResp) - // s.T().Logf("cwResp: %s", cwRespBz) - // s.NoError(err) -} - -// func (s *TestSuiteQuerier) TestQueryPremiumFraction() { -// cwReq := &bindings.PremiumFractionRequest{ -// Pair: s.fields.Pair, -// } - -// bindingQuery := bindings.BindingQuery{ -// PremiumFraction: cwReq, -// } -// bindingResp := new(bindings.PremiumFractionResponse) - -// var respBz []byte -// var err error -// err = common.TryCatch(func() { -// respBz, err = DoCustomBindingQuery( -// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// ) -// s.Require().Errorf(err, "expect error since query is not implemented: resp bytes: %s", respBz) -// s.Require().Contains(err.Error(), "Querier contract error") -// })() - -// // respBz, err := DoCustomBindingQuery( -// // s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// // ) -// // s.Require().NoErrorf(err, "resp bytes: %s", respBz) - -// // s.Assert().EqualValues(cwReq.Pair, bindingResp.Pair) -// // s.Assert().Truef( -// // -// // !bindingResp.CPF.IsNegative(), -// // "cpf: %s", -// // bindingResp.CPF) -// // -// // s.Assert().Truef( -// // -// // !bindingResp.EstimatedNextCPF.IsNegative(), -// // "estimated_next_cpf: %s", -// // bindingResp.EstimatedNextCPF) -// } - -// func (s *TestSuiteQuerier) TestQueryMetrics() { -// cwReq := &bindings.MetricsRequest{ -// Pair: s.fields.Pair, -// } - -// bindingQuery := bindings.BindingQuery{ -// Metrics: cwReq, -// } -// bindingResp := new(bindings.MetricsResponse) - -// respBz, err := DoCustomBindingQuery( -// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// ) -// s.Require().NoErrorf(err, "resp bytes: %s", respBz) -// } - -// func (s *TestSuiteQuerier) TestQueryPerpParams() { -// cwReq := &bindings.PerpParamsRequest{} - -// bindingQuery := bindings.BindingQuery{ -// PerpParams: cwReq, -// } -// bindingResp := new(bindings.PerpParamsResponse) - -// respBz, err := DoCustomBindingQuery( -// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// ) -// s.Require().NoErrorf(err, "resp bytes: %s", respBz) -// } - -// func (s *TestSuiteQuerier) TestQueryPerpModuleAccounts() { -// cwReq := &bindings.ModuleAccountsRequest{} - -// bindingQuery := bindings.BindingQuery{ -// ModuleAccounts: cwReq, -// } -// bindingResp := new(bindings.ModuleAccountsResponse) - -// respBz, err := DoCustomBindingQuery( -// s.ctx, s.nibiru, s.contractPerp, bindingQuery, bindingResp, -// ) -// s.Require().NoErrorf(err, "resp bytes: %s", respBz) -// } diff --git a/wasmbinding/test/cli_test.go b/wasmbinding/test/cli_test.go deleted file mode 100644 index 66ca94701..000000000 --- a/wasmbinding/test/cli_test.go +++ /dev/null @@ -1,143 +0,0 @@ -package test - -import ( - "encoding/hex" - "fmt" - "testing" - - "github.com/CosmWasm/wasmd/x/wasm" - wasmcli "github.com/CosmWasm/wasmd/x/wasm/client/cli" - "github.com/CosmWasm/wasmd/x/wasm/types" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/testutil/cli" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/denoms" - testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" - "github.com/NibiruChain/nibiru/x/common/testutil/genesis" -) - -// commonArgs is args for CLI test commands. -var commonArgs = []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(denoms.NIBI, sdk.NewInt(10000000))).String()), -} - -type IntegrationTestSuite struct { - suite.Suite - - cfg testutilcli.Config - network *testutilcli.Network -} - -func (s *IntegrationTestSuite) SetupSuite() { - if testing.Short() { - s.T().Skip("skipping integration test suite") - } - - s.T().Log("setting up integration test suite") - - app.SetPrefixes(app.AccountAddressPrefix) - - encodingConfig := app.MakeEncodingConfig() - genesisState := genesis.NewTestGenesisState(encodingConfig) - - s.cfg = testutilcli.BuildNetworkConfig(genesisState) - network, err := testutilcli.New(s.T(), s.T().TempDir(), s.cfg) - s.Require().NoError(err) - - s.network = network - s.Require().NoError(s.network.WaitForNextBlock()) -} - -func (s *IntegrationTestSuite) TearDownSuite() { - s.T().Log("tearing down integration test suite") - s.network.Cleanup() -} - -func (s *IntegrationTestSuite) TestWasmHappyPath() { - s.requiredDeployedContractsLen(0) - - _, err := s.deployWasmContract("testdata/cw_nameservice.wasm") - s.Require().NoError(err) - - err = s.network.WaitForNextBlock() - s.Require().NoError(err) - - s.requiredDeployedContractsLen(1) -} - -// deployWasmContract deploys a wasm contract located in path. -func (s *IntegrationTestSuite) deployWasmContract(path string) (uint64, error) { - val := s.network.Validators[0] - codec := val.ClientCtx.Codec - - args := []string{ - path, - "--from", val.Address.String(), - "--gas", "11000000", - } - args = append(args, commonArgs...) - - cmd := wasmcli.StoreCodeCmd() - out, err := cli.ExecTestCLICmd(val.ClientCtx, cmd, args) - if err != nil { - return 0, err - } - s.Require().NoError(s.network.WaitForNextBlock()) - - resp := &sdk.TxResponse{} - err = codec.UnmarshalJSON(out.Bytes(), resp) - if err != nil { - return 0, err - } - - resp, err = testutilcli.QueryTx(val.ClientCtx, resp.TxHash) - if err != nil { - return 0, err - } - - decodedResult, err := hex.DecodeString(resp.Data) - if err != nil { - return 0, err - } - - respData := sdk.TxMsgData{} - err = codec.Unmarshal(decodedResult, &respData) - if err != nil { - return 0, err - } - - if len(respData.MsgResponses) < 1 { - return 0, fmt.Errorf("no data found in response") - } - - var storeCodeResponse wasm.MsgStoreCodeResponse - err = codec.Unmarshal(respData.MsgResponses[0].Value, &storeCodeResponse) - if err != nil { - return 0, err - } - - return storeCodeResponse.CodeID, nil -} - -// requiredDeployedContractsLen checks the number of deployed contracts. -func (s *IntegrationTestSuite) requiredDeployedContractsLen(total int) { - val := s.network.Validators[0] - var queryCodeResponse types.QueryCodesResponse - err := testutilcli.ExecQuery( - val.ClientCtx, - wasmcli.GetCmdListCode(), - []string{}, - &queryCodeResponse, - ) - s.Require().NoError(err) - s.Require().Len(queryCodeResponse.CodeInfos, total) -} - -func TestIntegrationTestSuite(t *testing.T) { - suite.Run(t, new(IntegrationTestSuite)) -} diff --git a/wasmbinding/test/testdata/cw_nameservice.wasm b/wasmbinding/test/testdata/cw_nameservice.wasm deleted file mode 100644 index 24b39ec5247e19d93c5b9a5359c34f3628eb1d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146179 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

T#`KtrUSqfIBco7ipSv2OVt%>l% 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

ikX1zlz##||73_kP|o@F%IQQtcB2UHM# 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%0Dy)+%848 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

*!Y45RnS8esjXScTZOeA~HM8n>r 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�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[vkR@a)UX3?P_TU}qqEOo7 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 Jj(_UN{9lcLCN}^8 diff --git a/wasmbinding/wasmbin_test.go b/wasmbinding/wasmbin_test.go deleted file mode 100644 index 76729ede7..000000000 --- a/wasmbinding/wasmbin_test.go +++ /dev/null @@ -1,138 +0,0 @@ -package wasmbinding_test - -import ( - "fmt" - "testing" - "time" - - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/wasmbinding/wasmbin" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" -) - -// TestSetupContracts acts as an integration test by storing and instantiating -// each production smart contract is expected to interact with x/wasm/binding. -func TestSetupContracts(t *testing.T) { - sender := testutil.AccAddress() - nibiru, _ := testapp.NewNibiruTestAppAndContext() - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-wasmnet-1", - Time: time.Now().UTC(), - }) - coins := sdk.NewCoins(sdk.NewCoin(denoms.NIBI, sdk.NewInt(10))) - require.NoError(t, testapp.FundAccount(nibiru.BankKeeper, ctx, sender, coins)) - _, _ = SetupAllContracts(t, sender, nibiru, ctx) -} - -var ContractMap = make(map[wasmbin.WasmKey]sdk.AccAddress) - -// SetupAllContracts stores and instantiates all of wasm binding contracts. -func SetupAllContracts( - t *testing.T, sender sdk.AccAddress, nibiru *app.NibiruApp, ctx sdk.Context, -) (*app.NibiruApp, sdk.Context) { - wasmKey := wasmbin.WasmKeyPerpBinding - codeId := StoreContract(t, wasmKey, ctx, nibiru, sender) - deposit := sdk.NewCoins(sdk.NewCoin(denoms.NIBI, sdk.OneInt())) - contract := Instantiate.PerpBindingContract(t, ctx, nibiru, codeId, sender, deposit) - ContractMap[wasmKey] = contract - - wasmKey = wasmbin.WasmKeyShifter - codeId = StoreContract(t, wasmKey, ctx, nibiru, sender) - contract = Instantiate.ShifterContract(t, ctx, nibiru, codeId, sender, deposit) - ContractMap[wasmKey] = contract - - wasmKey = wasmbin.WasmKeyController - codeId = StoreContract(t, wasmKey, ctx, nibiru, sender) - contract = Instantiate.ControllerContract(t, ctx, nibiru, codeId, sender, deposit) - ContractMap[wasmKey] = contract - - return nibiru, ctx -} - -// StoreContract submits Wasm bytecode for storage on the chain. -func StoreContract( - t *testing.T, - wasmKey wasmbin.WasmKey, - ctx sdk.Context, - nibiru *app.NibiruApp, - sender sdk.AccAddress, -) (codeId uint64) { - pathToWasmBin := wasmbin.GetPackageDir(t) + "/wasmbin" - wasmBytecode, err := wasmKey.ToByteCode(pathToWasmBin) - require.NoError(t, err) - - // The "Create" fn is private on the nibiru.WasmKeeper. By placing it as the - // decorated keeper in PermissionedKeeper type, we can access "Create" as a - // public fn. - wasmPermissionedKeeper := wasmkeeper.NewDefaultPermissionKeeper(nibiru.WasmKeeper) - instantiateAccess := &wasmtypes.AccessConfig{ - Permission: wasmtypes.AccessTypeEverybody, - } - codeId, _, err = wasmPermissionedKeeper.Create( - ctx, sender, wasmBytecode, instantiateAccess, - ) - require.NoError(t, err) - return codeId -} - -func InstantiateContract( - t *testing.T, ctx sdk.Context, nibiru *app.NibiruApp, codeId uint64, - initMsg []byte, sender sdk.AccAddress, label string, deposit sdk.Coins, -) (contractAddr sdk.AccAddress) { - wasmPermissionedKeeper := wasmkeeper.NewDefaultPermissionKeeper(nibiru.WasmKeeper) - contractAddr, _, err := wasmPermissionedKeeper.Instantiate( - ctx, codeId, sender, sender, initMsg, label, deposit, - ) - require.NoError(t, err) - return contractAddr -} - -// Instantiate is a empty struct type with conventience functions for -// instantiating specific smart contracts. -var Instantiate = inst{} - -type inst struct{} - -func (i inst) PerpBindingContract( - t *testing.T, ctx sdk.Context, nibiru *app.NibiruApp, codeId uint64, - sender sdk.AccAddress, deposit sdk.Coins, -) (contractAddr sdk.AccAddress) { - initMsg := []byte("{}") - label := "x/perp module bindings" - return InstantiateContract( - t, ctx, nibiru, codeId, initMsg, sender, label, deposit, - ) -} - -// Instantiates the shifter contract with the sender set as the admin. -func (i inst) ShifterContract( - t *testing.T, ctx sdk.Context, nibiru *app.NibiruApp, codeId uint64, - sender sdk.AccAddress, deposit sdk.Coins, -) (contractAddr sdk.AccAddress) { - initMsg := []byte(fmt.Sprintf(`{ "admin": "%s"}`, sender)) - label := "contract for calling peg shift and depth shift in x/perp" - return InstantiateContract( - t, ctx, nibiru, codeId, initMsg, sender, label, deposit, - ) -} - -// Instantiates the controller contract with the sender set as the admin. -func (i inst) ControllerContract( - t *testing.T, ctx sdk.Context, nibiru *app.NibiruApp, codeId uint64, - sender sdk.AccAddress, deposit sdk.Coins, -) (contractAddr sdk.AccAddress) { - initMsg := []byte(fmt.Sprintf(`{ "admin": "%s"}`, sender)) - label := "contract for admin functions" - return InstantiateContract( - t, ctx, nibiru, codeId, initMsg, sender, label, deposit, - ) -} diff --git a/x/common/testutil/testapp/testapp.go b/x/common/testutil/testapp/testapp.go index 0d7443791..360b549d1 100644 --- a/x/common/testutil/testapp/testapp.go +++ b/x/common/testutil/testapp/testapp.go @@ -23,7 +23,7 @@ import ( // in-memory 'tmdb.MemDB' and fresh 'sdk.Context'. func NewNibiruTestAppAndContext() (*app.NibiruApp, sdk.Context) { encoding := app.MakeEncodingConfig() - var appGenesis app.GenesisState = app.NewDefaultGenesisState(encoding.Marshaler) + var appGenesis = app.NewDefaultGenesisState(encoding.Marshaler) genModEpochs := epochstypes.DefaultGenesisFromTime(time.Now().UTC()) appGenesis[epochstypes.ModuleName] = encoding.Marshaler.MustMarshalJSON( genModEpochs, diff --git a/x/oracle/client/cli/tx.go b/x/oracle/client/cli/tx.go index f52e195dd..3d685c183 100644 --- a/x/oracle/client/cli/tx.go +++ b/x/oracle/client/cli/tx.go @@ -3,6 +3,9 @@ package cli import ( "fmt" "strings" + "time" + + "github.com/NibiruChain/nibiru/x/common/asset" "github.com/pkg/errors" @@ -30,6 +33,7 @@ func GetTxCmd() *cobra.Command { GetCmdDelegateFeederPermission(), GetCmdAggregateExchangeRatePrevote(), GetCmdAggregateExchangeRateVote(), + GetCmdEditOracleParams(), ) return oracleTxCmd @@ -205,3 +209,144 @@ $ nibid tx oracle aggregate-vote 1234 (40000.0,BTC:USD)|(1.243,NIBI:USD) nibival return cmd } + +func GetCmdEditOracleParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "edit-params --vote-period [vote-period] --vote-threshold [vote-threshold] --reward-band [reward-band] --slash-fraction [slash-fraction] --slash-window [slash-window] --min-valid-per-window [min-valid-per-window] --whitelist [whitelist]", + Args: cobra.ExactArgs(0), + Short: "Edit the oracle module parameters", + Long: strings.TrimSpace(` +Edit the oracle module parameters. + +Requires sudo permissions. + +--vote-period: the period of oracle vote +--vote-threshold: the threshold of oracle vote +--reward-band: the reward band of oracle vote +--slash-fraction: the slash fraction of oracle vote +--slash-window: the slash window of oracle vote +--min-valid-per-window: the min valid per window of oracle vote +--twap-lookback-window: the twap lookback window of oracle vote in seconds +--min-voters: the min voters of oracle vote +--validator-fee-ratio: the validator fee ratio of oracle vote +--expiration-blocks: the expiration blocks of oracle vote +--whitelist: the whitelist of oracle vote + +$ nibid tx oracle edit-params --vote-period 10 --vote-threshold 0.5 --reward-band 0.1 --slash-fraction 0.01 --slash-window 100 --min-valid-per-window 0.6 --whitelist BTC:USD,NIBI:USD +`), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := &types.MsgEditOracleParams{ + Sender: clientCtx.GetFromAddress().String(), + Params: &types.OracleParamsMsg{}, + } + + if votePeriod, _ := cmd.Flags().GetUint64("vote-period"); votePeriod != 0 { + msg.Params.VotePeriod = votePeriod + } + + if voteThreshold, _ := cmd.Flags().GetString("vote-threshold"); voteThreshold != "" { + voteThresholdDec, err := sdk.NewDecFromStr(voteThreshold) + if err != nil { + return err + } + + msg.Params.VoteThreshold = &voteThresholdDec + } + + if rewardBand, _ := cmd.Flags().GetString("reward-band"); rewardBand != "" { + rewardBandDec, err := sdk.NewDecFromStr(rewardBand) + if err != nil { + return err + } + + msg.Params.RewardBand = &rewardBandDec + } + + if slashFraction, _ := cmd.Flags().GetString("slash-fraction"); slashFraction != "" { + slashFractionDec, err := sdk.NewDecFromStr(slashFraction) + if err != nil { + return err + } + + msg.Params.SlashFraction = &slashFractionDec + } + + if slashWindow, _ := cmd.Flags().GetUint64("slash-window"); slashWindow != 0 { + msg.Params.SlashWindow = slashWindow + } + + if minValidPerWindow, _ := cmd.Flags().GetString("min-valid-per-window"); minValidPerWindow != "" { + minValidPerWindowDec, err := sdk.NewDecFromStr(minValidPerWindow) + if err != nil { + return err + } + + msg.Params.MinValidPerWindow = &minValidPerWindowDec + } + + if twapLookbackWindow, _ := cmd.Flags().GetUint64("twap-lookback-window"); twapLookbackWindow != 0 { + duration := time.Duration(twapLookbackWindow) * time.Second + msg.Params.TwapLookbackWindow = &duration + } + + if minVoters, _ := cmd.Flags().GetUint64("min-voters"); minVoters != 0 { + msg.Params.MinVoters = minVoters + } + + if validatorFeeRatio, _ := cmd.Flags().GetString("validator-fee-ratio"); validatorFeeRatio != "" { + validatorFeeRatioDec, err := sdk.NewDecFromStr(validatorFeeRatio) + if err != nil { + return err + } + + msg.Params.ValidatorFeeRatio = &validatorFeeRatioDec + } + + if expirationBlocks, _ := cmd.Flags().GetUint64("expiration-blocks"); expirationBlocks != 0 { + msg.Params.ExpirationBlocks = expirationBlocks + } + + if whitelist, _ := cmd.Flags().GetString("whitelist"); whitelist != "" { + whitelistArr := strings.Split(whitelist, ",") + realWhitelist := make([]asset.Pair, len(whitelistArr)) + for i, pair := range whitelistArr { + p, err := asset.TryNewPair(pair) + if err != nil { + return fmt.Errorf("invalid pair %s", p) + } + + realWhitelist[i] = p + } + + msg.Params.Whitelist = realWhitelist + } + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + cmd.Flags().Uint64("vote-period", 0, "the period of oracle vote") + cmd.Flags().String("vote-threshold", "", "the threshold of oracle vote") + cmd.Flags().String("reward-band", "", "the reward band of oracle vote") + cmd.Flags().String("slash-fraction", "", "the slash fraction of oracle vote") + cmd.Flags().Uint64("slash-window", 0, "the slash window of oracle vote") + cmd.Flags().String("min-valid-per-window", "", "the min valid per window of oracle vote") + cmd.Flags().Uint64("twap-lookback-window", 0, "the twap lookback window of oracle vote") + cmd.Flags().Uint64("min-voters", 0, "the min voters of oracle vote") + cmd.Flags().String("validator-fee-ratio", "", "the validator fee ratio of oracle vote") + cmd.Flags().Uint64("expiration-blocks", 0, "the expiration blocks of oracle vote") + cmd.Flags().String("whitelist", "", "the whitelist of oracle vote") + + return cmd +} diff --git a/x/oracle/keeper/edit_params_test.go b/x/oracle/keeper/edit_params_test.go new file mode 100644 index 000000000..d197a97cc --- /dev/null +++ b/x/oracle/keeper/edit_params_test.go @@ -0,0 +1,54 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/x/common/testutil" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/x/oracle/keeper" + "github.com/NibiruChain/nibiru/x/oracle/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" +) + +func TestMsgServer_EditOracleParams(t *testing.T) { + app, ctx := testapp.NewNibiruTestAppAndContext() + goCtx := sdk.WrapSDKContext(ctx) + + msgServer := keeper.NewMsgServerImpl(app.OracleKeeper, app.SudoKeeper) + + alice := testutil.AccAddress() + bob := testutil.AccAddress() + + // Case 1: user is not authorized to edit oracle params + msg := types.MsgEditOracleParams{ + Sender: alice.String(), + Params: &types.OracleParamsMsg{ + VotePeriod: 100, + }, + } + + _, err := msgServer.EditOracleParams(goCtx, &msg) + require.Error(t, err) + require.EqualError(t, sudotypes.ErrUnauthorized, err.Error()) + + // Case 2: user is authorized to edit oracle params + app.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ + Root: bob.String(), + Contracts: []string{ + alice.String(), + }, + }) + + msg = types.MsgEditOracleParams{ + Sender: alice.String(), + Params: &types.OracleParamsMsg{ + VotePeriod: 100, + }, + } + + _, err = msgServer.EditOracleParams(goCtx, &msg) + require.NoError(t, err) +} diff --git a/x/oracle/keeper/msg_server.go b/x/oracle/keeper/msg_server.go index 7bed77107..4f0cc3604 100644 --- a/x/oracle/keeper/msg_server.go +++ b/x/oracle/keeper/msg_server.go @@ -2,9 +2,13 @@ package keeper import ( "context" + "fmt" "github.com/cosmos/cosmos-sdk/types/errors" + sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + sdkerrors "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -14,12 +18,13 @@ import ( type msgServer struct { Keeper + SudoKeeper sudokeeper.Keeper } // NewMsgServerImpl returns an implementation of the oracle MsgServer interface // for the provided Keeper. -func NewMsgServerImpl(keeper Keeper) types.MsgServer { - return &msgServer{Keeper: keeper} +func NewMsgServerImpl(keeper Keeper, sudoKeeper sudokeeper.Keeper) types.MsgServer { + return &msgServer{Keeper: keeper, SudoKeeper: sudoKeeper} } func (ms msgServer) AggregateExchangeRatePrevote( @@ -167,3 +172,28 @@ func (ms msgServer) DelegateFeedConsent( return &types.MsgDelegateFeedConsentResponse{}, err } + +func (ms msgServer) EditOracleParams(goCtx context.Context, msg *types.MsgEditOracleParams) (*types.MsgEditOracleParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, fmt.Errorf("invalid address") + } + + err = ms.SudoKeeper.CheckPermissions(sender, ctx) + if err != nil { + return nil, sudotypes.ErrUnauthorized + } + + params, err := ms.Keeper.Params.Get(ctx) + if err != nil { + return nil, fmt.Errorf("get oracle params error: %s", err.Error()) + } + + mergedParams := mergeOracleParams(msg, params) + + ms.Keeper.UpdateParams(ctx, mergedParams) + + return &types.MsgEditOracleParamsResponse{}, nil +} diff --git a/x/oracle/keeper/params.go b/x/oracle/keeper/params.go index f45f7b3fb..13fdee2d5 100644 --- a/x/oracle/keeper/params.go +++ b/x/oracle/keeper/params.go @@ -71,3 +71,53 @@ func (k Keeper) MinValidPerWindow(ctx sdk.Context) (res sdk.Dec) { params, _ := k.Params.Get(ctx) return params.MinValidPerWindow } + +// mergeOracleParams takes the oracle params from the wasm msg and merges them into the existing params +// keeping any existing values if not set in the wasm msg +func mergeOracleParams(msg *types.MsgEditOracleParams, oracleParams types.Params) types.Params { + if msg.Params.VotePeriod != 0 { + oracleParams.VotePeriod = msg.Params.VotePeriod + } + + if msg.Params.VoteThreshold != nil && !msg.Params.VoteThreshold.IsNil() { + oracleParams.VoteThreshold = *msg.Params.VoteThreshold + } + + if msg.Params.RewardBand != nil && !msg.Params.RewardBand.IsNil() { + oracleParams.RewardBand = *msg.Params.RewardBand + } + + if msg.Params.Whitelist != nil && len(msg.Params.Whitelist) != 0 { + oracleParams.Whitelist = msg.Params.Whitelist + } + + if msg.Params.SlashFraction != nil && !msg.Params.SlashFraction.IsNil() { + oracleParams.SlashFraction = *msg.Params.SlashFraction + } + + if msg.Params.SlashWindow != 0 { + oracleParams.SlashWindow = msg.Params.SlashWindow + } + + if msg.Params.MinValidPerWindow != nil && !msg.Params.MinValidPerWindow.IsNil() { + oracleParams.MinValidPerWindow = *msg.Params.MinValidPerWindow + } + + if msg.Params.TwapLookbackWindow != nil { + oracleParams.TwapLookbackWindow = *msg.Params.TwapLookbackWindow + } + + if msg.Params.MinVoters != 0 { + oracleParams.MinVoters = msg.Params.MinVoters + } + + if msg.Params.ValidatorFeeRatio != nil && !msg.Params.ValidatorFeeRatio.IsNil() { + oracleParams.ValidatorFeeRatio = *msg.Params.ValidatorFeeRatio + } + + if msg.Params.ExpirationBlocks != 0 { + oracleParams.ExpirationBlocks = msg.Params.ExpirationBlocks + } + + return oracleParams +} diff --git a/x/oracle/keeper/params_test.go b/x/oracle/keeper/params_test.go index a074c528e..f01905af5 100644 --- a/x/oracle/keeper/params_test.go +++ b/x/oracle/keeper/params_test.go @@ -2,6 +2,7 @@ package keeper import ( "testing" + "time" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" @@ -53,3 +54,381 @@ func TestParams(t *testing.T) { require.NotNil(t, storedParams) require.Equal(t, storedParams, newParams) } + +func TestMergeOracleParams(t *testing.T) { + // baseParams + votePeriod := uint64(10) + + voteThreshold := sdk.NewDecWithPrec(33, 2) + changedVoteThreshold := sdk.NewDecWithPrec(50, 2) + + oracleRewardBand := sdk.NewDecWithPrec(1, 2) + changedRewardBand := sdk.NewDecWithPrec(2, 2) + + whitelist := []asset.Pair{ + asset.Registry.Pair(denoms.BTC, denoms.NUSD), + asset.Registry.Pair(denoms.ETH, denoms.NUSD), + } + chagedWhitelist := []asset.Pair{ + asset.Registry.Pair(denoms.ATOM, denoms.NUSD), + asset.Registry.Pair(denoms.ADA, denoms.NUSD), + } + + slashFraction := sdk.NewDecWithPrec(1, 2) + changedSlashFraction := sdk.NewDecWithPrec(2, 2) + + slashWindow := uint64(1000) + changedSlashWindow := uint64(2000) + + minValidPerWindow := sdk.NewDecWithPrec(1, 4) + changedMinValidPerWindow := sdk.NewDecWithPrec(2, 4) + + twapLoopbackWindow := time.Duration(1000) + changedTwapLoopbackWindow := time.Duration(2000) + + minVoters := uint64(4) + chagedMinVoters := uint64(5) + + minFeeRatio := sdk.NewDecWithPrec(1, 2) + changedMinFeeRatio := sdk.NewDecWithPrec(2, 2) + + expirationBlocks := uint64(100) + changedExpirationBlocks := uint64(200) + + initialParams := types.Params{ + VotePeriod: votePeriod, + VoteThreshold: voteThreshold, + MinVoters: minVoters, + RewardBand: oracleRewardBand, + Whitelist: whitelist, + SlashFraction: slashFraction, + SlashWindow: slashWindow, + MinValidPerWindow: minValidPerWindow, + ValidatorFeeRatio: minFeeRatio, + TwapLookbackWindow: twapLoopbackWindow, + ExpirationBlocks: expirationBlocks, + } + + tests := []struct { + name string + msg *types.MsgEditOracleParams + require func(params types.Params) + }{ + { + name: "votePeriod", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + VotePeriod: 20, + }, + }, + require: func(params types.Params) { + require.Equal(t, uint64(20), params.VotePeriod) + }, + }, + { + name: "votePeriod zero not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + VotePeriod: 0, + }, + }, + require: func(params types.Params) { + require.Equal(t, uint64(10), params.VotePeriod) + }, + }, + { + name: "voteThreshold", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + VoteThreshold: &changedVoteThreshold, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedVoteThreshold, params.VoteThreshold) + }, + }, + { + name: "voteThreshold nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + VoteThreshold: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, voteThreshold, params.VoteThreshold) + }, + }, + { + name: "empty voteThreshold not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + VoteThreshold: &sdk.Dec{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, voteThreshold, params.VoteThreshold) + }, + }, + { + name: "rewardBand", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + RewardBand: &changedRewardBand, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedRewardBand, params.RewardBand) + }, + }, + { + name: "rewardBand nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + RewardBand: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, oracleRewardBand, params.RewardBand) + }, + }, + { + name: "empty rewardBand not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + RewardBand: &sdk.Dec{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, oracleRewardBand, params.RewardBand) + }, + }, + { + name: "whitelist", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + Whitelist: chagedWhitelist, + }, + }, + require: func(params types.Params) { + require.Equal(t, chagedWhitelist, params.Whitelist) + }, + }, + { + name: "whitelist nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + Whitelist: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, whitelist, params.Whitelist) + }, + }, + { + name: "empty whitelist not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + Whitelist: []asset.Pair{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, whitelist, params.Whitelist) + }, + }, + { + name: "slashFraction", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + SlashFraction: &changedSlashFraction, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedSlashFraction, params.SlashFraction) + }, + }, + { + name: "slashFraction nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + SlashFraction: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, slashFraction, params.SlashFraction) + }, + }, + { + name: "empty slashFraction not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + SlashFraction: &sdk.Dec{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, slashFraction, params.SlashFraction) + }, + }, + { + name: "slashWindow", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + SlashWindow: changedSlashWindow, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedSlashWindow, params.SlashWindow) + }, + }, + { + name: "slashWindow zero not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + SlashWindow: 0, + }, + }, + require: func(params types.Params) { + require.Equal(t, slashWindow, params.SlashWindow) + }, + }, + { + name: "minValidPerWindow", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + MinValidPerWindow: &changedMinValidPerWindow, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedMinValidPerWindow, params.MinValidPerWindow) + }, + }, + { + name: "minValidPerWindow nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + MinValidPerWindow: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, minValidPerWindow, params.MinValidPerWindow) + }, + }, + { + name: "empty minValidPerWindow not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + MinValidPerWindow: &sdk.Dec{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, minValidPerWindow, params.MinValidPerWindow) + }, + }, + { + name: "twapLookbackWindow", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + TwapLookbackWindow: &changedTwapLoopbackWindow, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedTwapLoopbackWindow, params.TwapLookbackWindow) + }, + }, + { + name: "twapLookbackWindow nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + TwapLookbackWindow: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, twapLoopbackWindow, params.TwapLookbackWindow) + }, + }, + { + name: "minVoters", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + MinVoters: chagedMinVoters, + }, + }, + require: func(params types.Params) { + require.Equal(t, chagedMinVoters, params.MinVoters) + }, + }, + { + name: "minVoters zero not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + MinVoters: 0, + }, + }, + require: func(params types.Params) { + require.Equal(t, minVoters, params.MinVoters) + }, + }, + { + name: "validatorFeeRatio", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + ValidatorFeeRatio: &changedMinFeeRatio, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedMinFeeRatio, params.ValidatorFeeRatio) + }, + }, + { + name: "validatorFeeRatio nil not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + ValidatorFeeRatio: nil, + }, + }, + require: func(params types.Params) { + require.Equal(t, minFeeRatio, params.ValidatorFeeRatio) + }, + }, + { + name: "empty validatorFeeRatio not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + ValidatorFeeRatio: &sdk.Dec{}, + }, + }, + require: func(params types.Params) { + require.Equal(t, minFeeRatio, params.ValidatorFeeRatio) + }, + }, + { + name: "expirationTime", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + ExpirationBlocks: changedExpirationBlocks, + }, + }, + require: func(params types.Params) { + require.Equal(t, changedExpirationBlocks, params.ExpirationBlocks) + }, + }, + { + name: "expirationTime zero not updated", + msg: &types.MsgEditOracleParams{ + Params: &types.OracleParamsMsg{ + ExpirationBlocks: 0, + }, + }, + require: func(params types.Params) { + require.Equal(t, expirationBlocks, params.ExpirationBlocks) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt := tt + newParams := mergeOracleParams(tt.msg, initialParams) + tt.require(newParams) + }) + } +} diff --git a/x/oracle/keeper/test_utils.go b/x/oracle/keeper/test_utils.go index 5cef19d0e..b92068f37 100644 --- a/x/oracle/keeper/test_utils.go +++ b/x/oracle/keeper/test_utils.go @@ -2,6 +2,8 @@ package keeper import ( + sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" "testing" "time" @@ -123,6 +125,7 @@ type TestFixture struct { OracleKeeper Keeper StakingKeeper stakingkeeper.Keeper DistrKeeper distrkeeper.Keeper + SudoKeeper sudokeeper.Keeper } // CreateTestFixture nolint @@ -135,6 +138,7 @@ func CreateTestFixture(t *testing.T) TestFixture { keyOracle := sdk.NewKVStoreKey(types.StoreKey) keyStaking := sdk.NewKVStoreKey(stakingtypes.StoreKey) keyDistr := sdk.NewKVStoreKey(distrtypes.StoreKey) + keySudo := sdk.NewKVStoreKey(sudotypes.StoreKey) db := dbm.NewMemDB() ms := store.NewCommitMultiStore(db) @@ -149,6 +153,7 @@ func CreateTestFixture(t *testing.T) TestFixture { ms.MountStoreWithDB(keyOracle, storetypes.StoreTypeIAVL, db) ms.MountStoreWithDB(keyStaking, storetypes.StoreTypeIAVL, db) ms.MountStoreWithDB(keyDistr, storetypes.StoreTypeIAVL, db) + ms.MountStoreWithDB(keySudo, storetypes.StoreTypeIAVL, db) require.NoError(t, ms.LoadLatestVersion()) @@ -236,6 +241,11 @@ func CreateTestFixture(t *testing.T) TestFixture { require.NoError(t, err) } + sudoKeeper := sudokeeper.NewKeeper( + appCodec, + keySudo, + ) + keeper := NewKeeper( appCodec, keyOracle, @@ -254,7 +264,7 @@ func CreateTestFixture(t *testing.T) TestFixture { keeper.Params.Set(ctx, defaults) - return TestFixture{ctx, legacyAmino, accountKeeper, bankKeeper, keeper, *stakingKeeper, distrKeeper} + return TestFixture{ctx, legacyAmino, accountKeeper, bankKeeper, keeper, *stakingKeeper, distrKeeper, sudoKeeper} } // NewTestMsgCreateValidator test msg creator @@ -300,7 +310,7 @@ func Setup(t *testing.T) (TestFixture, types.MsgServer) { params, _ = fixture.OracleKeeper.Params.Get(fixture.Ctx) - h := NewMsgServerImpl(fixture.OracleKeeper) + h := NewMsgServerImpl(fixture.OracleKeeper, fixture.SudoKeeper) sh := stakingkeeper.NewMsgServerImpl(&fixture.StakingKeeper) // Validator created diff --git a/x/oracle/keeper/update_exchange_rates_test.go b/x/oracle/keeper/update_exchange_rates_test.go index 074d68d7c..a1cb34680 100644 --- a/x/oracle/keeper/update_exchange_rates_test.go +++ b/x/oracle/keeper/update_exchange_rates_test.go @@ -134,7 +134,7 @@ func TestOracleTally(t *testing.T) { votes := types.ExchangeRateVotes{} rates, valAddrs, stakingKeeper := types.GenerateRandomTestCase() fixture.OracleKeeper.StakingKeeper = stakingKeeper - h := NewMsgServerImpl(fixture.OracleKeeper) + h := NewMsgServerImpl(fixture.OracleKeeper, fixture.SudoKeeper) for i, rate := range rates { decExchangeRate := sdk.NewDecWithPrec(int64(rate*math.Pow10(OracleDecPrecision)), int64(OracleDecPrecision)) diff --git a/x/oracle/module.go b/x/oracle/module.go index d69df8fdc..18c0d6f71 100644 --- a/x/oracle/module.go +++ b/x/oracle/module.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" + "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" @@ -90,9 +92,11 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { // AppModule implements an application module for the oracle module. type AppModule struct { AppModuleBasic + keeper keeper.Keeper accountKeeper types.AccountKeeper bankKeeper types.BankKeeper + sudoKeeper sudokeeper.Keeper } // NewAppModule creates a new AppModule object @@ -101,12 +105,14 @@ func NewAppModule( keeper keeper.Keeper, accountKeeper types.AccountKeeper, bankKeeper types.BankKeeper, + sudoKeeper sudokeeper.Keeper, ) AppModule { return AppModule{ AppModuleBasic: AppModuleBasic{cdc}, keeper: keeper, accountKeeper: accountKeeper, bankKeeper: bankKeeper, + sudoKeeper: sudoKeeper, } } @@ -118,7 +124,7 @@ func (AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} // RegisterServices registers module services. func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper, am.sudoKeeper)) querier := keeper.NewQuerier(am.keeper) types.RegisterQueryServer(cfg.QueryServer(), querier) } diff --git a/x/oracle/types/msgs.go b/x/oracle/types/msgs.go index b49a5a3ea..8f07aba08 100644 --- a/x/oracle/types/msgs.go +++ b/x/oracle/types/msgs.go @@ -13,11 +13,13 @@ var ( _ sdk.Msg = &MsgDelegateFeedConsent{} _ sdk.Msg = &MsgAggregateExchangeRatePrevote{} _ sdk.Msg = &MsgAggregateExchangeRateVote{} + _ sdk.Msg = &MsgEditOracleParams{} ) // oracle message types const ( TypeMsgDelegateFeedConsent = "delegate_feeder" + TypeMsgEditOracleParams = "edit_oracle_params" TypeMsgAggregateExchangeRatePrevote = "aggregate_exchange_rate_prevote" TypeMsgAggregateExchangeRateVote = "aggregate_exchange_rate_vote" ) @@ -192,3 +194,36 @@ func (msg MsgDelegateFeedConsent) ValidateBasic() error { return nil } + +func (msg MsgEditOracleParams) Route() string { return RouterKey } + +func (msg MsgEditOracleParams) Type() string { return TypeMsgEditOracleParams } + +// GetSignBytes implements sdk.Msg +func (msg MsgEditOracleParams) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +// GetSigners implements sdk.Msg +func (msg MsgEditOracleParams) GetSigners() []sdk.AccAddress { + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + + return []sdk.AccAddress{sdk.AccAddress(sender)} +} + +// ValidateBasic implements sdk.Msg +func (msg MsgEditOracleParams) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return sdkerrors.Wrapf(errors.ErrInvalidAddress, "Invalid sender address (%s)", err) + } + + if msg.Params == nil { + return sdkerrors.Wrap(errors.ErrInvalidRequest, "params cannot be nil") + } + + return nil +} diff --git a/x/oracle/types/tx.pb.go b/x/oracle/types/tx.pb.go index 62ca0e3a4..564538efc 100644 --- a/x/oracle/types/tx.pb.go +++ b/x/oracle/types/tx.pb.go @@ -6,22 +6,28 @@ package types import ( context "context" fmt "fmt" + github_com_NibiruChain_nibiru_x_common_asset "github.com/NibiruChain/nibiru/x/common/asset" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + _ "google.golang.org/protobuf/types/known/durationpb" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -276,6 +282,186 @@ func (m *MsgDelegateFeedConsentResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgDelegateFeedConsentResponse proto.InternalMessageInfo +type MsgEditOracleParams struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Params *OracleParamsMsg `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty" yaml:"params"` +} + +func (m *MsgEditOracleParams) Reset() { *m = MsgEditOracleParams{} } +func (m *MsgEditOracleParams) String() string { return proto.CompactTextString(m) } +func (*MsgEditOracleParams) ProtoMessage() {} +func (*MsgEditOracleParams) Descriptor() ([]byte, []int) { + return fileDescriptor_11e362c65eb610f4, []int{6} +} +func (m *MsgEditOracleParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEditOracleParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEditOracleParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEditOracleParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEditOracleParams.Merge(m, src) +} +func (m *MsgEditOracleParams) XXX_Size() int { + return m.Size() +} +func (m *MsgEditOracleParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEditOracleParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEditOracleParams proto.InternalMessageInfo + +type MsgEditOracleParamsResponse struct { +} + +func (m *MsgEditOracleParamsResponse) Reset() { *m = MsgEditOracleParamsResponse{} } +func (m *MsgEditOracleParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEditOracleParamsResponse) ProtoMessage() {} +func (*MsgEditOracleParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_11e362c65eb610f4, []int{7} +} +func (m *MsgEditOracleParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEditOracleParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEditOracleParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEditOracleParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEditOracleParamsResponse.Merge(m, src) +} +func (m *MsgEditOracleParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEditOracleParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEditOracleParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEditOracleParamsResponse proto.InternalMessageInfo + +type OracleParamsMsg struct { + // VotePeriod defines the number of blocks during which voting takes place. + VotePeriod uint64 `protobuf:"varint,1,opt,name=vote_period,json=votePeriod,proto3" json:"vote_period,omitempty" yaml:"vote_period"` + // VoteThreshold specifies the minimum proportion of votes that must be + // received for a ballot to pass. + VoteThreshold *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=vote_threshold,json=voteThreshold,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"vote_threshold,omitempty" yaml:"vote_threshold"` + // RewardBand defines a maxium divergence that a price vote can have from the + // weighted median in the ballot. If a vote lies within the valid range + // defined by: + // μ := weightedMedian, + // validRange := μ ± (μ * rewardBand / 2), + // then rewards are added to the validator performance. + // Note that if the reward band is smaller than 1 standard + // deviation, the band is taken to be 1 standard deviation.a price + RewardBand *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=reward_band,json=rewardBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"reward_band,omitempty" yaml:"reward_band"` + // The set of whitelisted markets, or asset pairs, for the module. + // Ex. '["unibi:uusd","ubtc:uusd"]' + Whitelist []github_com_NibiruChain_nibiru_x_common_asset.Pair `protobuf:"bytes,4,rep,name=whitelist,proto3,customtype=github.com/NibiruChain/nibiru/x/common/asset.Pair" json:"whitelist,omitempty" yaml:"whitelist"` + // SlashFraction returns the proportion of an oracle's stake that gets + // slashed in the event of slashing. `SlashFraction` specifies the exact + // penalty for failing a voting period. + SlashFraction *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=slash_fraction,json=slashFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"slash_fraction,omitempty" yaml:"slash_fraction"` + // SlashWindow returns the number of voting periods that specify a + // "slash window". After each slash window, all oracles that have missed more + // than the penalty threshold are slashed. Missing the penalty threshold is + // synonymous with submitting fewer valid votes than `MinValidPerWindow`. + SlashWindow uint64 `protobuf:"varint,6,opt,name=slash_window,json=slashWindow,proto3" json:"slash_window,omitempty" yaml:"slash_window"` + MinValidPerWindow *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=min_valid_per_window,json=minValidPerWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_valid_per_window,omitempty" yaml:"min_valid_per_window"` + // Amount of time to look back for TWAP calculations + TwapLookbackWindow *time.Duration `protobuf:"bytes,8,opt,name=twap_lookback_window,json=twapLookbackWindow,proto3,stdduration" json:"twap_lookback_window,omitempty" yaml:"twap_lookback_window"` + // The minimum number of voters (i.e. oracle validators) per pair for it to be + // considered a passing ballot. Recommended at least 4. + MinVoters uint64 `protobuf:"varint,9,opt,name=min_voters,json=minVoters,proto3" json:"min_voters,omitempty" yaml:"min_voters"` + // The validator fee ratio that is given to validators every epoch. + ValidatorFeeRatio *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=validator_fee_ratio,json=validatorFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"validator_fee_ratio,omitempty" yaml:"validator_fee_ratio"` + ExpirationBlocks uint64 `protobuf:"varint,11,opt,name=expiration_blocks,json=expirationBlocks,proto3" json:"expiration_blocks,omitempty" yaml:"expiration_blocks"` +} + +func (m *OracleParamsMsg) Reset() { *m = OracleParamsMsg{} } +func (m *OracleParamsMsg) String() string { return proto.CompactTextString(m) } +func (*OracleParamsMsg) ProtoMessage() {} +func (*OracleParamsMsg) Descriptor() ([]byte, []int) { + return fileDescriptor_11e362c65eb610f4, []int{8} +} +func (m *OracleParamsMsg) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OracleParamsMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_OracleParamsMsg.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *OracleParamsMsg) XXX_Merge(src proto.Message) { + xxx_messageInfo_OracleParamsMsg.Merge(m, src) +} +func (m *OracleParamsMsg) XXX_Size() int { + return m.Size() +} +func (m *OracleParamsMsg) XXX_DiscardUnknown() { + xxx_messageInfo_OracleParamsMsg.DiscardUnknown(m) +} + +var xxx_messageInfo_OracleParamsMsg proto.InternalMessageInfo + +func (m *OracleParamsMsg) GetVotePeriod() uint64 { + if m != nil { + return m.VotePeriod + } + return 0 +} + +func (m *OracleParamsMsg) GetSlashWindow() uint64 { + if m != nil { + return m.SlashWindow + } + return 0 +} + +func (m *OracleParamsMsg) GetTwapLookbackWindow() *time.Duration { + if m != nil { + return m.TwapLookbackWindow + } + return nil +} + +func (m *OracleParamsMsg) GetMinVoters() uint64 { + if m != nil { + return m.MinVoters + } + return 0 +} + +func (m *OracleParamsMsg) GetExpirationBlocks() uint64 { + if m != nil { + return m.ExpirationBlocks + } + return 0 +} + func init() { proto.RegisterType((*MsgAggregateExchangeRatePrevote)(nil), "nibiru.oracle.v1.MsgAggregateExchangeRatePrevote") proto.RegisterType((*MsgAggregateExchangeRatePrevoteResponse)(nil), "nibiru.oracle.v1.MsgAggregateExchangeRatePrevoteResponse") @@ -283,47 +469,170 @@ func init() { proto.RegisterType((*MsgAggregateExchangeRateVoteResponse)(nil), "nibiru.oracle.v1.MsgAggregateExchangeRateVoteResponse") proto.RegisterType((*MsgDelegateFeedConsent)(nil), "nibiru.oracle.v1.MsgDelegateFeedConsent") proto.RegisterType((*MsgDelegateFeedConsentResponse)(nil), "nibiru.oracle.v1.MsgDelegateFeedConsentResponse") + proto.RegisterType((*MsgEditOracleParams)(nil), "nibiru.oracle.v1.MsgEditOracleParams") + proto.RegisterType((*MsgEditOracleParamsResponse)(nil), "nibiru.oracle.v1.MsgEditOracleParamsResponse") + proto.RegisterType((*OracleParamsMsg)(nil), "nibiru.oracle.v1.OracleParamsMsg") } func init() { proto.RegisterFile("nibiru/oracle/v1/tx.proto", fileDescriptor_11e362c65eb610f4) } var fileDescriptor_11e362c65eb610f4 = []byte{ - // 555 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x94, 0x3f, 0x6f, 0xd3, 0x40, - 0x18, 0xc6, 0x73, 0x4d, 0x55, 0xb5, 0x87, 0x4a, 0x8b, 0xfb, 0x47, 0x49, 0x88, 0xec, 0xe8, 0x40, - 0xa5, 0x95, 0xc0, 0x26, 0x45, 0x42, 0xa2, 0x13, 0xb4, 0xd0, 0x2d, 0x08, 0x79, 0x60, 0x60, 0x41, - 0x97, 0xe4, 0xe5, 0x62, 0xc9, 0xf5, 0x59, 0xbe, 0x6b, 0x94, 0xae, 0x88, 0x81, 0x11, 0x89, 0x89, - 0x2d, 0x1f, 0x00, 0x89, 0xaf, 0xc1, 0x58, 0x89, 0x85, 0x29, 0x42, 0x09, 0x03, 0x13, 0x83, 0xf9, - 0x02, 0xc8, 0x77, 0xb6, 0x49, 0x43, 0xfa, 0x27, 0x5b, 0x74, 0xcf, 0xef, 0xde, 0xf7, 0x79, 0x9f, - 0xbc, 0x67, 0x5c, 0x0e, 0xbc, 0xa6, 0x17, 0x1d, 0x3b, 0x3c, 0xa2, 0x2d, 0x1f, 0x9c, 0x6e, 0xdd, - 0x91, 0x3d, 0x3b, 0x8c, 0xb8, 0xe4, 0xc6, 0xaa, 0x96, 0x6c, 0x2d, 0xd9, 0xdd, 0x7a, 0x65, 0x9d, - 0x71, 0xc6, 0x95, 0xe8, 0x24, 0xbf, 0x34, 0x57, 0xa9, 0x32, 0xce, 0x99, 0x0f, 0x0e, 0x0d, 0x3d, - 0x87, 0x06, 0x01, 0x97, 0x54, 0x7a, 0x3c, 0x10, 0x5a, 0x25, 0x5f, 0x10, 0xb6, 0x1a, 0x82, 0x3d, - 0x61, 0x2c, 0x02, 0x46, 0x25, 0x3c, 0xeb, 0xb5, 0x3a, 0x34, 0x60, 0xe0, 0x52, 0x09, 0x2f, 0x22, - 0xe8, 0x72, 0x09, 0xc6, 0x2d, 0x3c, 0xdf, 0xa1, 0xa2, 0x53, 0x42, 0x35, 0xb4, 0xbd, 0xb4, 0xbf, - 0x12, 0x0f, 0xac, 0x6b, 0x27, 0xf4, 0xc8, 0xdf, 0x23, 0xc9, 0x29, 0x71, 0x95, 0x68, 0xec, 0xe0, - 0x85, 0x37, 0x00, 0x6d, 0x88, 0x4a, 0x73, 0x0a, 0xbb, 0x11, 0x0f, 0xac, 0x65, 0x8d, 0xe9, 0x73, - 0xe2, 0xa6, 0x80, 0xb1, 0x8b, 0x97, 0xba, 0xd4, 0xf7, 0xda, 0x54, 0xf2, 0xa8, 0x54, 0x54, 0xf4, - 0x7a, 0x3c, 0xb0, 0x56, 0x35, 0x9d, 0x4b, 0xc4, 0xfd, 0x87, 0xed, 0x2d, 0xbe, 0xef, 0x5b, 0x85, - 0x5f, 0x7d, 0xab, 0x40, 0x76, 0xf0, 0x9d, 0x4b, 0x0c, 0xbb, 0x20, 0x42, 0x1e, 0x08, 0x20, 0xbf, - 0x11, 0xae, 0x9e, 0xc7, 0xbe, 0x4c, 0x27, 0x13, 0xd4, 0x97, 0xff, 0x4f, 0x96, 0x9c, 0x12, 0x57, - 0x89, 0xc6, 0x63, 0x7c, 0x1d, 0xd2, 0x8b, 0xaf, 0x23, 0x2a, 0x41, 0xa4, 0x13, 0x96, 0xe3, 0x81, - 0xb5, 0xa1, 0xf1, 0xb3, 0x3a, 0x71, 0x97, 0x61, 0xac, 0x93, 0x18, 0xcb, 0xa6, 0x38, 0x53, 0x36, - 0xf3, 0xb3, 0x66, 0xb3, 0x85, 0x6f, 0x5f, 0x34, 0x6f, 0x1e, 0xcc, 0x3b, 0x84, 0x37, 0x1b, 0x82, - 0x3d, 0x05, 0x5f, 0x71, 0x87, 0x00, 0xed, 0x83, 0x44, 0x08, 0xa4, 0xe1, 0xe0, 0x45, 0x1e, 0x42, - 0xa4, 0xfa, 0xeb, 0x58, 0xd6, 0xe2, 0x81, 0xb5, 0xa2, 0xfb, 0x67, 0x0a, 0x71, 0x73, 0x28, 0xb9, - 0xd0, 0x4e, 0xeb, 0xa4, 0xc1, 0x8c, 0x5d, 0xc8, 0x14, 0xe2, 0xe6, 0xd0, 0x98, 0xdd, 0x1a, 0x36, - 0xa7, 0xbb, 0xc8, 0x8c, 0xee, 0xfe, 0x29, 0xe2, 0x62, 0x43, 0x30, 0xe3, 0x33, 0xc2, 0xd5, 0x0b, - 0x77, 0xb4, 0x6e, 0x4f, 0x3e, 0x07, 0xfb, 0x92, 0x2d, 0xa9, 0x3c, 0x9a, 0xf9, 0x4a, 0x9e, 0x9f, - 0xf9, 0xf6, 0xdb, 0xcf, 0x8f, 0x73, 0x25, 0xb2, 0xe9, 0x9c, 0x7d, 0x9f, 0x61, 0xea, 0xa6, 0x8f, - 0x70, 0xf9, 0xfc, 0xad, 0xb3, 0xaf, 0xde, 0x38, 0xe1, 0x2b, 0x0f, 0x67, 0xe3, 0x73, 0x97, 0x37, - 0x95, 0xcb, 0x0d, 0xb2, 0x36, 0xe1, 0x52, 0x59, 0xfc, 0x84, 0xf0, 0xda, 0xb4, 0xff, 0x7f, 0x7b, - 0x6a, 0xb3, 0x29, 0x64, 0xe5, 0xfe, 0x55, 0xc9, 0xdc, 0xd0, 0x96, 0x32, 0x54, 0x23, 0xe6, 0x84, - 0x21, 0xbd, 0xfb, 0xf7, 0xb2, 0x0d, 0xd9, 0x3f, 0xfc, 0x3a, 0x34, 0xd1, 0xe9, 0xd0, 0x44, 0x3f, - 0x86, 0x26, 0xfa, 0x30, 0x32, 0x0b, 0xa7, 0x23, 0xb3, 0xf0, 0x7d, 0x64, 0x16, 0x5e, 0xdd, 0x65, - 0x9e, 0xec, 0x1c, 0x37, 0xed, 0x16, 0x3f, 0x72, 0x9e, 0xab, 0x1a, 0x07, 0x1d, 0xea, 0x05, 0x59, - 0xbd, 0x5e, 0x56, 0x51, 0x9e, 0x84, 0x20, 0x9a, 0x0b, 0xea, 0x1b, 0xf7, 0xe0, 0x6f, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xfc, 0x7f, 0x51, 0x06, 0x46, 0x05, 0x00, 0x00, + // 1098 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcf, 0x6b, 0x24, 0x45, + 0x14, 0x4e, 0x6f, 0x62, 0xcc, 0xd4, 0x98, 0x4d, 0xd2, 0x93, 0xac, 0x9d, 0x49, 0xd2, 0x1d, 0x4b, + 0x8d, 0x59, 0xd8, 0x74, 0x9b, 0x08, 0xa2, 0x11, 0x44, 0x67, 0xb3, 0x11, 0x21, 0xa3, 0xa1, 0x90, + 0x15, 0xbc, 0x0c, 0x35, 0xd3, 0x95, 0x9e, 0x26, 0x3d, 0x5d, 0x4d, 0x57, 0xe5, 0x17, 0x88, 0x07, + 0x11, 0xf4, 0x28, 0x08, 0x12, 0x6f, 0xf9, 0x03, 0x04, 0xff, 0x8d, 0x3d, 0x2e, 0x78, 0x11, 0x0f, + 0xa3, 0x24, 0x1e, 0x16, 0x11, 0x0f, 0x73, 0x17, 0xa4, 0x5f, 0xd7, 0xf4, 0x74, 0x26, 0xb3, 0x9b, + 0x0c, 0x7b, 0x9a, 0xa9, 0xf7, 0x7d, 0xf5, 0xde, 0xf7, 0x5e, 0x55, 0xbd, 0xd7, 0x68, 0x3e, 0xf4, + 0xeb, 0x7e, 0x7c, 0xe0, 0xf0, 0x98, 0x36, 0x02, 0xe6, 0x1c, 0xae, 0x3b, 0xf2, 0xd8, 0x8e, 0x62, + 0x2e, 0xb9, 0x3e, 0x9d, 0x42, 0x76, 0x0a, 0xd9, 0x87, 0xeb, 0xe5, 0x59, 0x8f, 0x7b, 0x1c, 0x40, + 0x27, 0xf9, 0x97, 0xf2, 0xca, 0x8b, 0x1e, 0xe7, 0x5e, 0xc0, 0x1c, 0x1a, 0xf9, 0x0e, 0x0d, 0x43, + 0x2e, 0xa9, 0xf4, 0x79, 0x28, 0x14, 0x6a, 0x2a, 0x14, 0x56, 0xf5, 0x83, 0x3d, 0xc7, 0x3d, 0x88, + 0x81, 0xa0, 0xf0, 0xa5, 0x2b, 0x02, 0x54, 0x3c, 0x80, 0xf1, 0x2f, 0x1a, 0xb2, 0xaa, 0xc2, 0xfb, + 0xd0, 0xf3, 0x62, 0xe6, 0x51, 0xc9, 0x1e, 0x1c, 0x37, 0x9a, 0x34, 0xf4, 0x18, 0xa1, 0x92, 0xed, + 0xc6, 0xec, 0x90, 0x4b, 0xa6, 0xbf, 0x8a, 0xc6, 0x9a, 0x54, 0x34, 0x0d, 0x6d, 0x59, 0x5b, 0x2d, + 0x54, 0xa6, 0x3a, 0x6d, 0xab, 0x78, 0x42, 0x5b, 0xc1, 0x26, 0x4e, 0xac, 0x98, 0x00, 0xa8, 0xdf, + 0x45, 0xe3, 0x7b, 0x8c, 0xb9, 0x2c, 0x36, 0x6e, 0x01, 0x6d, 0xa6, 0xd3, 0xb6, 0x26, 0x53, 0x5a, + 0x6a, 0xc7, 0x44, 0x11, 0xf4, 0x0d, 0x54, 0x38, 0xa4, 0x81, 0xef, 0x52, 0xc9, 0x63, 0x63, 0x14, + 0xd8, 0xb3, 0x9d, 0xb6, 0x35, 0x9d, 0xb2, 0x33, 0x08, 0x93, 0x1e, 0x6d, 0x73, 0xe2, 0xbb, 0x33, + 0x6b, 0xe4, 0xc9, 0x99, 0x35, 0x82, 0xef, 0xa2, 0x37, 0xae, 0x11, 0x4c, 0x98, 0x88, 0x78, 0x28, + 0x18, 0xfe, 0x57, 0x43, 0x8b, 0x4f, 0xe3, 0x3e, 0x54, 0x99, 0x09, 0x1a, 0xc8, 0xab, 0x99, 0x25, + 0x56, 0x4c, 0x00, 0xd4, 0x3f, 0x40, 0xb7, 0x99, 0xda, 0x58, 0x8b, 0xa9, 0x64, 0x42, 0x65, 0x38, + 0xdf, 0x69, 0x5b, 0x73, 0x29, 0xfd, 0x32, 0x8e, 0xc9, 0x24, 0xcb, 0x45, 0x12, 0xb9, 0xda, 0x8c, + 0x0e, 0x55, 0x9b, 0xb1, 0x61, 0x6b, 0xb3, 0x82, 0x5e, 0x7b, 0x56, 0xbe, 0x59, 0x61, 0xbe, 0xd1, + 0xd0, 0x9d, 0xaa, 0xf0, 0xb6, 0x58, 0x00, 0xbc, 0x6d, 0xc6, 0xdc, 0xfb, 0x09, 0x10, 0x4a, 0xdd, + 0x41, 0x13, 0x3c, 0x62, 0x31, 0xc4, 0x4f, 0xcb, 0x52, 0xea, 0xb4, 0xad, 0xa9, 0x34, 0x7e, 0x17, + 0xc1, 0x24, 0x23, 0x25, 0x1b, 0x5c, 0xe5, 0x47, 0x15, 0x26, 0xb7, 0xa1, 0x8b, 0x60, 0x92, 0x91, + 0x72, 0x72, 0x97, 0x91, 0x39, 0x58, 0x45, 0x26, 0xf4, 0x54, 0x43, 0xa5, 0xaa, 0xf0, 0x1e, 0xb8, + 0xbe, 0xfc, 0x14, 0xae, 0xed, 0x2e, 0x8d, 0x69, 0x0b, 0x2a, 0x2a, 0x58, 0x98, 0x54, 0x54, 0xeb, + 0xaf, 0x68, 0x6a, 0xc7, 0x44, 0x11, 0xf4, 0x1d, 0x34, 0x1e, 0xc1, 0x26, 0x50, 0x57, 0xdc, 0x78, + 0xc5, 0xee, 0x7f, 0x77, 0x76, 0xde, 0x75, 0x55, 0x78, 0x79, 0x6f, 0xe9, 0x56, 0x4c, 0x94, 0x8f, + 0x9c, 0xf8, 0x25, 0xb4, 0x30, 0x40, 0x59, 0xa6, 0xfc, 0x9f, 0x09, 0x34, 0xd5, 0xe7, 0x57, 0x7f, + 0x0f, 0x15, 0x93, 0xfb, 0x59, 0x8b, 0x58, 0xec, 0x73, 0x17, 0xa4, 0x8f, 0x55, 0xca, 0x8f, 0xda, + 0x96, 0xd6, 0x69, 0x5b, 0xba, 0x3a, 0xe2, 0x1e, 0x01, 0x13, 0x94, 0xac, 0x76, 0x61, 0xa1, 0x87, + 0xe8, 0x36, 0x60, 0xb2, 0x19, 0x33, 0xd1, 0xe4, 0x81, 0xab, 0xaa, 0xfd, 0x51, 0xb2, 0xff, 0xf7, + 0xb6, 0xb5, 0xe2, 0xf9, 0xb2, 0x79, 0x50, 0xb7, 0x1b, 0xbc, 0xe5, 0x34, 0xb8, 0x68, 0x71, 0xa1, + 0x7e, 0xd6, 0x84, 0xbb, 0xef, 0xc8, 0x93, 0x88, 0x09, 0x7b, 0x8b, 0x35, 0x7a, 0x97, 0xf6, 0xb2, + 0x37, 0x4c, 0x26, 0x13, 0xc3, 0x67, 0xdd, 0xb5, 0xce, 0x50, 0x31, 0x66, 0x47, 0x34, 0x76, 0x6b, + 0x75, 0x1a, 0xba, 0xea, 0xe6, 0x6e, 0x0d, 0x1d, 0x4c, 0xa5, 0x95, 0x73, 0x85, 0x09, 0x4a, 0x57, + 0x15, 0x1a, 0xba, 0xfa, 0x3e, 0x2a, 0x1c, 0x35, 0x7d, 0xc9, 0x02, 0x5f, 0x48, 0x63, 0x6c, 0x79, + 0x74, 0xb5, 0x50, 0xa9, 0xaa, 0x20, 0xeb, 0xb9, 0x20, 0x9f, 0xc0, 0x99, 0xdd, 0x6f, 0x52, 0x3f, + 0x74, 0x54, 0x47, 0x3b, 0x76, 0x1a, 0xbc, 0xd5, 0xe2, 0xa1, 0x43, 0x85, 0x60, 0xd2, 0xde, 0xa5, + 0x7e, 0xdc, 0x7b, 0x29, 0x99, 0x4f, 0x4c, 0x7a, 0xfe, 0x93, 0x1a, 0x8a, 0x80, 0x8a, 0x66, 0x6d, + 0x2f, 0xa6, 0x8d, 0xa4, 0x49, 0x1a, 0x2f, 0x3c, 0x5f, 0x0d, 0x2f, 0x7b, 0xc3, 0x64, 0x12, 0x0c, + 0xdb, 0x6a, 0xad, 0xbf, 0x8f, 0x5e, 0x4a, 0x19, 0x47, 0x7e, 0xe8, 0xf2, 0x23, 0x63, 0x1c, 0x4e, + 0x7c, 0x41, 0x9d, 0x78, 0x29, 0xef, 0x23, 0x65, 0x60, 0x52, 0x84, 0xe5, 0xe7, 0xb0, 0xd2, 0xbf, + 0x42, 0xb3, 0x2d, 0x3f, 0xac, 0xc1, 0x53, 0x4f, 0x2e, 0x45, 0xd7, 0xcf, 0x8b, 0xa0, 0xba, 0x3a, + 0xb4, 0xea, 0x85, 0x34, 0xe2, 0x20, 0x9f, 0x98, 0xcc, 0xb4, 0xfc, 0xf0, 0x61, 0x62, 0xdd, 0x65, + 0xb1, 0x8a, 0xff, 0xa3, 0x86, 0x66, 0xe5, 0x11, 0x8d, 0x6a, 0x01, 0xe7, 0xfb, 0x75, 0xda, 0xd8, + 0xef, 0x0a, 0x98, 0x80, 0xa7, 0x34, 0x6f, 0xa7, 0xc3, 0xc7, 0xee, 0x0e, 0x1f, 0x7b, 0x4b, 0x0d, + 0x9f, 0xca, 0xc7, 0x89, 0xb6, 0xbf, 0xdb, 0x96, 0x39, 0x68, 0xfb, 0x3d, 0xde, 0xf2, 0x25, 0x6b, + 0x45, 0xf2, 0xa4, 0xa7, 0x69, 0x10, 0x0f, 0x9f, 0xfe, 0x61, 0x69, 0x44, 0x4f, 0xa0, 0x1d, 0x85, + 0x28, 0x61, 0xef, 0x20, 0x04, 0x49, 0x70, 0xc9, 0x62, 0x61, 0x14, 0xa0, 0xac, 0xf3, 0xaa, 0xac, + 0x33, 0xb9, 0x24, 0x01, 0xc7, 0xa4, 0x90, 0xa4, 0x06, 0xff, 0xf5, 0x2f, 0x51, 0x29, 0xeb, 0x9c, + 0xb5, 0x3d, 0x06, 0x2d, 0xdb, 0xe7, 0x06, 0x82, 0x8a, 0xee, 0x0c, 0x5d, 0xd1, 0x72, 0x5f, 0x63, + 0xee, 0xb9, 0xc4, 0x64, 0x26, 0xb3, 0x6e, 0xb3, 0xa4, 0x07, 0xfb, 0x5c, 0xaf, 0xa2, 0x19, 0x76, + 0x1c, 0xf9, 0x69, 0x91, 0x6a, 0xf5, 0x80, 0x37, 0xf6, 0x85, 0x51, 0x04, 0xf9, 0xcb, 0x4a, 0xbe, + 0xd1, 0x1d, 0x29, 0x7d, 0x34, 0x4c, 0xa6, 0x7b, 0xb6, 0x0a, 0x98, 0x36, 0x27, 0x4e, 0xcf, 0x2c, + 0xed, 0xc9, 0x99, 0xa5, 0x6d, 0xfc, 0x37, 0x86, 0x46, 0x93, 0x16, 0xf3, 0xb3, 0x86, 0x16, 0x9f, + 0x39, 0xcc, 0xd7, 0xaf, 0xb6, 0xbf, 0x6b, 0xc6, 0x69, 0xf9, 0xdd, 0xa1, 0xb7, 0x64, 0x5d, 0xd0, + 0xfc, 0xfa, 0xd7, 0xbf, 0x7e, 0xb8, 0x65, 0xe0, 0x3b, 0xce, 0xe5, 0xcf, 0x90, 0x48, 0xa9, 0x39, + 0xd3, 0xd0, 0xfc, 0xd3, 0xc7, 0xb3, 0x7d, 0xf3, 0xc0, 0x09, 0xbf, 0xfc, 0xf6, 0x70, 0xfc, 0x4c, + 0xe5, 0x02, 0xa8, 0x9c, 0xc3, 0xa5, 0x3e, 0x95, 0x20, 0xf1, 0x27, 0x0d, 0x95, 0x06, 0x0d, 0xca, + 0xd5, 0x81, 0xc1, 0x06, 0x30, 0xcb, 0x6f, 0xde, 0x94, 0x99, 0x09, 0x5a, 0x01, 0x41, 0xcb, 0xd8, + 0xec, 0x13, 0x94, 0x7e, 0x24, 0xac, 0x75, 0x47, 0xa9, 0xfe, 0xad, 0x86, 0xa6, 0xaf, 0xcc, 0xc6, + 0xd7, 0x07, 0x86, 0xeb, 0xa7, 0x95, 0xd7, 0x6e, 0x44, 0xcb, 0x24, 0x2d, 0x81, 0xa4, 0x97, 0xf1, + 0x5c, 0xff, 0x49, 0x02, 0xad, 0xb2, 0xfd, 0xe8, 0xdc, 0xd4, 0x1e, 0x9f, 0x9b, 0xda, 0x9f, 0xe7, + 0xa6, 0xf6, 0xfd, 0x85, 0x39, 0xf2, 0xf8, 0xc2, 0x1c, 0xf9, 0xed, 0xc2, 0x1c, 0xf9, 0xe2, 0xde, + 0x75, 0x5d, 0x5c, 0x39, 0x82, 0x57, 0x55, 0x1f, 0x87, 0x56, 0xf2, 0xd6, 0xff, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x18, 0x46, 0x67, 0xdd, 0x38, 0x0b, 0x00, 0x00, +} + +func (this *OracleParamsMsg) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*OracleParamsMsg) + if !ok { + that2, ok := that.(OracleParamsMsg) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.VotePeriod != that1.VotePeriod { + return false + } + if that1.VoteThreshold == nil { + if this.VoteThreshold != nil { + return false + } + } else if !this.VoteThreshold.Equal(*that1.VoteThreshold) { + return false + } + if that1.RewardBand == nil { + if this.RewardBand != nil { + return false + } + } else if !this.RewardBand.Equal(*that1.RewardBand) { + return false + } + if len(this.Whitelist) != len(that1.Whitelist) { + return false + } + for i := range this.Whitelist { + if !this.Whitelist[i].Equal(that1.Whitelist[i]) { + return false + } + } + if that1.SlashFraction == nil { + if this.SlashFraction != nil { + return false + } + } else if !this.SlashFraction.Equal(*that1.SlashFraction) { + return false + } + if this.SlashWindow != that1.SlashWindow { + return false + } + if that1.MinValidPerWindow == nil { + if this.MinValidPerWindow != nil { + return false + } + } else if !this.MinValidPerWindow.Equal(*that1.MinValidPerWindow) { + return false + } + if this.TwapLookbackWindow != nil && that1.TwapLookbackWindow != nil { + if *this.TwapLookbackWindow != *that1.TwapLookbackWindow { + return false + } + } else if this.TwapLookbackWindow != nil { + return false + } else if that1.TwapLookbackWindow != nil { + return false + } + if this.MinVoters != that1.MinVoters { + return false + } + if that1.ValidatorFeeRatio == nil { + if this.ValidatorFeeRatio != nil { + return false + } + } else if !this.ValidatorFeeRatio.Equal(*that1.ValidatorFeeRatio) { + return false + } + if this.ExpirationBlocks != that1.ExpirationBlocks { + return false + } + return true } // Reference imports to suppress errors if they are not otherwise used. @@ -348,6 +657,7 @@ type MsgClient interface { // to another address known as a price feeder. // See https://github.com/NibiruChain/pricefeeder. DelegateFeedConsent(ctx context.Context, in *MsgDelegateFeedConsent, opts ...grpc.CallOption) (*MsgDelegateFeedConsentResponse, error) + EditOracleParams(ctx context.Context, in *MsgEditOracleParams, opts ...grpc.CallOption) (*MsgEditOracleParamsResponse, error) } type msgClient struct { @@ -385,6 +695,15 @@ func (c *msgClient) DelegateFeedConsent(ctx context.Context, in *MsgDelegateFeed return out, nil } +func (c *msgClient) EditOracleParams(ctx context.Context, in *MsgEditOracleParams, opts ...grpc.CallOption) (*MsgEditOracleParamsResponse, error) { + out := new(MsgEditOracleParamsResponse) + err := c.cc.Invoke(ctx, "/nibiru.oracle.v1.Msg/EditOracleParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // AggregateExchangeRatePrevote defines a method for submitting @@ -397,6 +716,7 @@ type MsgServer interface { // to another address known as a price feeder. // See https://github.com/NibiruChain/pricefeeder. DelegateFeedConsent(context.Context, *MsgDelegateFeedConsent) (*MsgDelegateFeedConsentResponse, error) + EditOracleParams(context.Context, *MsgEditOracleParams) (*MsgEditOracleParamsResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -412,6 +732,9 @@ func (*UnimplementedMsgServer) AggregateExchangeRateVote(ctx context.Context, re func (*UnimplementedMsgServer) DelegateFeedConsent(ctx context.Context, req *MsgDelegateFeedConsent) (*MsgDelegateFeedConsentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DelegateFeedConsent not implemented") } +func (*UnimplementedMsgServer) EditOracleParams(ctx context.Context, req *MsgEditOracleParams) (*MsgEditOracleParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EditOracleParams not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -471,6 +794,24 @@ func _Msg_DelegateFeedConsent_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Msg_EditOracleParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEditOracleParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EditOracleParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.oracle.v1.Msg/EditOracleParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EditOracleParams(ctx, req.(*MsgEditOracleParams)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "nibiru.oracle.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -487,6 +828,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "DelegateFeedConsent", Handler: _Msg_DelegateFeedConsent_Handler, }, + { + MethodName: "EditOracleParams", + Handler: _Msg_EditOracleParams_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "nibiru/oracle/v1/tx.proto", @@ -693,6 +1038,198 @@ func (m *MsgDelegateFeedConsentResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *MsgEditOracleParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEditOracleParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Params != nil { + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEditOracleParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEditOracleParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEditOracleParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *OracleParamsMsg) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OracleParamsMsg) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OracleParamsMsg) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExpirationBlocks != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ExpirationBlocks)) + i-- + dAtA[i] = 0x58 + } + if m.ValidatorFeeRatio != nil { + { + size := m.ValidatorFeeRatio.Size() + i -= size + if _, err := m.ValidatorFeeRatio.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } + if m.MinVoters != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.MinVoters)) + i-- + dAtA[i] = 0x48 + } + if m.TwapLookbackWindow != nil { + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(*m.TwapLookbackWindow, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(*m.TwapLookbackWindow):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintTx(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0x42 + } + if m.MinValidPerWindow != nil { + { + size := m.MinValidPerWindow.Size() + i -= size + if _, err := m.MinValidPerWindow.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.SlashWindow != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.SlashWindow)) + i-- + dAtA[i] = 0x30 + } + if m.SlashFraction != nil { + { + size := m.SlashFraction.Size() + i -= size + if _, err := m.SlashFraction.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Whitelist) > 0 { + for iNdEx := len(m.Whitelist) - 1; iNdEx >= 0; iNdEx-- { + { + size := m.Whitelist[iNdEx].Size() + i -= size + if _, err := m.Whitelist[iNdEx].MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if m.RewardBand != nil { + { + size := m.RewardBand.Size() + i -= size + if _, err := m.RewardBand.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.VoteThreshold != nil { + { + size := m.VoteThreshold.Size() + i -= size + if _, err := m.VoteThreshold.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.VotePeriod != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.VotePeriod)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -794,18 +1331,95 @@ func (m *MsgDelegateFeedConsentResponse) Size() (n int) { return n } -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func (m *MsgEditOracleParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Params != nil { + l = m.Params.Size() + n += 1 + l + sovTx(uint64(l)) + } + return n } -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + +func (m *MsgEditOracleParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n } -func (m *MsgAggregateExchangeRatePrevote) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 + +func (m *OracleParamsMsg) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VotePeriod != 0 { + n += 1 + sovTx(uint64(m.VotePeriod)) + } + if m.VoteThreshold != nil { + l = m.VoteThreshold.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.RewardBand != nil { + l = m.RewardBand.Size() + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Whitelist) > 0 { + for _, e := range m.Whitelist { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + if m.SlashFraction != nil { + l = m.SlashFraction.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.SlashWindow != 0 { + n += 1 + sovTx(uint64(m.SlashWindow)) + } + if m.MinValidPerWindow != nil { + l = m.MinValidPerWindow.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.TwapLookbackWindow != nil { + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(*m.TwapLookbackWindow) + n += 1 + l + sovTx(uint64(l)) + } + if m.MinVoters != 0 { + n += 1 + sovTx(uint64(m.MinVoters)) + } + if m.ValidatorFeeRatio != nil { + l = m.ValidatorFeeRatio.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.ExpirationBlocks != 0 { + n += 1 + sovTx(uint64(m.ExpirationBlocks)) + } + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgAggregateExchangeRatePrevote) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1388,6 +2002,552 @@ func (m *MsgDelegateFeedConsentResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEditOracleParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditOracleParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Params == nil { + m.Params = &OracleParamsMsg{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditOracleParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEditOracleParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditOracleParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OracleParamsMsg) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OracleParamsMsg: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OracleParamsMsg: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field VotePeriod", wireType) + } + m.VotePeriod = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.VotePeriod |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VoteThreshold", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.VoteThreshold = &v + if err := m.VoteThreshold.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RewardBand", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.RewardBand = &v + if err := m.RewardBand.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Whitelist", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_NibiruChain_nibiru_x_common_asset.Pair + m.Whitelist = append(m.Whitelist, v) + if err := m.Whitelist[len(m.Whitelist)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashFraction", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.SlashFraction = &v + if err := m.SlashFraction.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SlashWindow", wireType) + } + m.SlashWindow = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SlashWindow |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinValidPerWindow", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.MinValidPerWindow = &v + if err := m.MinValidPerWindow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TwapLookbackWindow", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.TwapLookbackWindow == nil { + m.TwapLookbackWindow = new(time.Duration) + } + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(m.TwapLookbackWindow, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinVoters", wireType) + } + m.MinVoters = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinVoters |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorFeeRatio", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.ValidatorFeeRatio = &v + if err := m.ValidatorFeeRatio.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationBlocks", wireType) + } + m.ExpirationBlocks = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExpirationBlocks |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/oracle/types/tx.pb.gw.go b/x/oracle/types/tx.pb.gw.go index a37229a8d..46515660b 100644 --- a/x/oracle/types/tx.pb.gw.go +++ b/x/oracle/types/tx.pb.gw.go @@ -141,6 +141,42 @@ func local_request_Msg_DelegateFeedConsent_0(ctx context.Context, marshaler runt } +var ( + filter_Msg_EditOracleParams_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Msg_EditOracleParams_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgEditOracleParams + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_EditOracleParams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EditOracleParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Msg_EditOracleParams_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgEditOracleParams + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_EditOracleParams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EditOracleParams(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". // UnaryRPC :call MsgServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -216,6 +252,29 @@ func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) + mux.Handle("POST", pattern_Msg_EditOracleParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Msg_EditOracleParams_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_EditOracleParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -317,6 +376,26 @@ func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_Msg_EditOracleParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Msg_EditOracleParams_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_EditOracleParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -326,6 +405,8 @@ var ( pattern_Msg_AggregateExchangeRateVote_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "vote"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Msg_DelegateFeedConsent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "feeder-delegate"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Msg_EditOracleParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "params"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -334,4 +415,6 @@ var ( forward_Msg_AggregateExchangeRateVote_0 = runtime.ForwardResponseMessage forward_Msg_DelegateFeedConsent_0 = runtime.ForwardResponseMessage + + forward_Msg_EditOracleParams_0 = runtime.ForwardResponseMessage ) diff --git a/x/sudo/keeper/keeper_test.go b/x/sudo/keeper/keeper_test.go index e0346ece9..9b9bfe2ad 100644 --- a/x/sudo/keeper/keeper_test.go +++ b/x/sudo/keeper/keeper_test.go @@ -25,7 +25,7 @@ func TestCheckPermissions(t *testing.T) { Contracts: mockContractAddrStrs, }) - err := nibiru.SudoKeeper.CheckPermissions(sdk.AccAddress([]byte("addrbbb")), ctx) + err := nibiru.SudoKeeper.CheckPermissions(sdk.AccAddress("addrbbb"), ctx) require.Error(t, err) for _, mockAddr := range mockContractAddrs { err := nibiru.SudoKeeper.CheckPermissions(mockAddr, ctx) From 42c152f19f5da13f53798b0608bf8e0a6a610312 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Thu, 2 Nov 2023 00:15:42 -0500 Subject: [PATCH 13/99] chore: update changelog --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61bcbc4e7..924d3113a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,10 +40,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) + ### Features * [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message +### Bug fixes + +* [#1655](https://github.com/NibiruChain/nibiru/pull/1655) - fix(inflation): inflate NIBI correctly to strategic treasury account + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features @@ -84,7 +90,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1606](https://github.com/NibiruChain/nibiru/pull/1606) - fix(perp): emit `MarketUpdatedEvent` in the absence of index price * [#1649](https://github.com/NibiruChain/nibiru/pull/1649) - fix(ledger): fix ledger for newer macos versions -* [#1655](https://github.com/NibiruChain/nibiru/pull/1655) - fix(inflation): inflate NIBI correctly to strategic treasury account ## [v0.21.10] From cf6acee1e2ef01689190efe3a36594216fc5263f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:27:31 -0500 Subject: [PATCH 14/99] Update CHANGELOG.md --- CHANGELOG.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 924d3113a..cfcbe597b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,16 +40,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - -### Features - -* [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message - -### Bug fixes - -* [#1655](https://github.com/NibiruChain/nibiru/pull/1655) - fix(inflation): inflate NIBI correctly to strategic treasury account - ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features @@ -59,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1620](https://github.com/NibiruChain/nibiru/pull/1620) - Token factory transaction messages for Mint and Burn * [#1573](https://github.com/NibiruChain/nibiru/pull/1573) - feat(perp): Close markets and compute settlement price * [#1632](https://github.com/NibiruChain/nibiru/pull/1632) - feat(perp): Add settle position transaction +* [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message ### State Machine Breaking @@ -90,6 +81,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1606](https://github.com/NibiruChain/nibiru/pull/1606) - fix(perp): emit `MarketUpdatedEvent` in the absence of index price * [#1649](https://github.com/NibiruChain/nibiru/pull/1649) - fix(ledger): fix ledger for newer macos versions +* [#1655](https://github.com/NibiruChain/nibiru/pull/1655) - fix(inflation): inflate NIBI correctly to strategic treasury account ## [v0.21.10] From f1e6859b6d8d26ce52e6b2cb2cdb467941196ef6 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Thu, 2 Nov 2023 11:48:44 -0500 Subject: [PATCH 15/99] chore(oracle): curate default oracle whitelist (#1659) * chore(oracle): curate default oracle whitelist * update changelog --- CHANGELOG.md | 1 + x/oracle/abci_test.go | 10 +- x/oracle/keeper/msg_server_test.go | 18 +-- x/oracle/keeper/reward_test.go | 4 +- x/oracle/keeper/slash_test.go | 44 +++--- x/oracle/keeper/update_exchange_rates_test.go | 138 +++++++++--------- x/oracle/types/params.go | 14 -- 7 files changed, 108 insertions(+), 121 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfcbe597b..6ead75ab5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1630](https://github.com/NibiruChain/nibiru/pull/1630) - refactor(wasm): clean up wasmbinding/ folder structure * [#1631](https://github.com/NibiruChain/nibiru/pull/1631) - fix(.goreleaser.yml): Load version for wasmvm dynamically. * [#1638](https://github.com/NibiruChain/nibiru/pull/1638) - test(tokenfactory): integration test core logic with a real smart contract using `nibiru-std` +* [#1659](https://github.com/NibiruChain/nibiru/pull/1659) - refactor(oracle): curate oracle default whitelist ### Dependencies - Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) diff --git a/x/oracle/abci_test.go b/x/oracle/abci_test.go index 99cd5a9e8..23a5e7ae4 100644 --- a/x/oracle/abci_test.go +++ b/x/oracle/abci_test.go @@ -18,7 +18,7 @@ func TestOracleTallyTiming(t *testing.T) { // all the Addrs vote for the block ... not last period block yet, so tally fails for i := range keeper.Addrs[:4] { keeper.MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), ExchangeRate: sdk.OneDec()}, + {Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: sdk.OneDec()}, }, i) } @@ -31,13 +31,13 @@ func TestOracleTallyTiming(t *testing.T) { require.Equal(t, 1, int(input.Ctx.BlockHeight())) EndBlocker(input.Ctx, input.OracleKeeper) - _, err = input.OracleKeeper.ExchangeRates.Get(input.Ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD)) + _, err = input.OracleKeeper.ExchangeRates.Get(input.Ctx, asset.Registry.Pair(denoms.BTC, denoms.USD)) require.Error(t, err) input.Ctx = input.Ctx.WithBlockHeight(int64(params.VotePeriod - 1)) EndBlocker(input.Ctx, input.OracleKeeper) - _, err = input.OracleKeeper.ExchangeRates.Get(input.Ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD)) + _, err = input.OracleKeeper.ExchangeRates.Get(input.Ctx, asset.Registry.Pair(denoms.BTC, denoms.USD)) require.NoError(t, err) } @@ -45,8 +45,8 @@ func TestOracleTallyTiming(t *testing.T) { // Ensure that the updated pair is not deleted and the other pair is deleted after a certain time. func TestOraclePriceExpiration(t *testing.T) { input, h := keeper.Setup(t) - pair1 := asset.Registry.Pair(denoms.BTC, denoms.NUSD) - pair2 := asset.Registry.Pair(denoms.ETH, denoms.NUSD) + pair1 := asset.Registry.Pair(denoms.BTC, denoms.USD) + pair2 := asset.Registry.Pair(denoms.ETH, denoms.USD) // Set prices for both pairs for i := range keeper.Addrs[:4] { diff --git a/x/oracle/keeper/msg_server_test.go b/x/oracle/keeper/msg_server_test.go index d8f392439..e3a0a7956 100644 --- a/x/oracle/keeper/msg_server_test.go +++ b/x/oracle/keeper/msg_server_test.go @@ -16,7 +16,7 @@ func TestFeederDelegation(t *testing.T) { exchangeRates := types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: testExchangeRate, }, } @@ -83,43 +83,43 @@ func TestAggregatePrevoteVote(t *testing.T) { salt := "1" exchangeRates := types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("1000.23"), }, { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("0.29"), }, { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("0.27"), }, } otherExchangeRate := types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("1000.23"), }, { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("0.29"), }, { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("0.27"), }, } unintendedExchangeRateStr := types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("1000.23"), }, { - Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: sdk.MustNewDecFromStr("0.29"), }, { diff --git a/x/oracle/keeper/reward_test.go b/x/oracle/keeper/reward_test.go index 8b75c3e2a..fe88d7808 100644 --- a/x/oracle/keeper/reward_test.go +++ b/x/oracle/keeper/reward_test.go @@ -15,7 +15,7 @@ import ( ) func TestKeeperRewardsDistributionMultiVotePeriods(t *testing.T) { - // this simulates allocating rewards for the pair nibi:nusd + // this simulates allocating rewards for the pair atom:usd // over 5 voting periods. It simulates rewards are correctly // distributed over 5 voting periods to 5 validators. // then we simulate that after the 5 voting periods are @@ -39,7 +39,7 @@ func TestKeeperRewardsDistributionMultiVotePeriods(t *testing.T) { // then changes the height to current height + vote period for the vote MakeAggregatePrevoteAndVote(t, fixture, msgServer, fixture.Ctx.BlockHeight(), types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate, }, }, valIndex) diff --git a/x/oracle/keeper/slash_test.go b/x/oracle/keeper/slash_test.go index 6a99b8e89..bf7b86a28 100644 --- a/x/oracle/keeper/slash_test.go +++ b/x/oracle/keeper/slash_test.go @@ -92,9 +92,9 @@ func TestInvalidVotesSlashing(t *testing.T) { input, h := Setup(t) params, err := input.OracleKeeper.Params.Get(input.Ctx) require.NoError(t, err) - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)} + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)} input.OracleKeeper.Params.Set(input.Ctx, params) - input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD)) + input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.ATOM, denoms.USD)) votePeriodsPerWindow := sdk.NewDec(int64(input.OracleKeeper.SlashWindow(input.Ctx))).QuoInt64(int64(input.OracleKeeper.VotePeriod(input.Ctx))).TruncateInt64() slashFraction := input.OracleKeeper.SlashFraction(input.Ctx) @@ -105,22 +105,22 @@ func TestInvalidVotesSlashing(t *testing.T) { // Account 1, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 0) // Account 2, govstable, miss vote MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Add(sdk.NewDec(100000000000000))}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Add(sdk.NewDec(100000000000000))}, }, 1) // Account 3, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 2) // Account 4, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 3) input.OracleKeeper.UpdateExchangeRates(input.Ctx) @@ -136,22 +136,22 @@ func TestInvalidVotesSlashing(t *testing.T) { // one more miss vote will inccur ValAddrs[1] slashing // Account 1, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 0) // Account 2, govstable, miss vote MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Add(sdk.NewDec(100000000000000))}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Add(sdk.NewDec(100000000000000))}, }, 1) // Account 3, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 2) // Account 4, govstable MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 3) input.Ctx = input.Ctx.WithBlockHeight(votePeriodsPerWindow - 1) @@ -171,7 +171,7 @@ func TestWhitelistSlashing(t *testing.T) { votePeriodsPerSlashWindow := sdk.NewDec(int64(input.OracleKeeper.SlashWindow(input.Ctx))).QuoInt64(int64(input.OracleKeeper.VotePeriod(input.Ctx))).TruncateInt64() minValidVotePeriodsPerWindow := input.OracleKeeper.MinValidPerWindow(input.Ctx) - pair := asset.Registry.Pair(denoms.NIBI, denoms.NUSD) + pair := asset.Registry.Pair(denoms.ATOM, denoms.USD) priceVoteFromVal := func(valIdx int, block int64, erate sdk.Dec) { MakeAggregatePrevoteAndVote(t, input, msgServer, block, types.ExchangeRateTuples{{Pair: pair, ExchangeRate: erate}}, @@ -207,19 +207,19 @@ func TestNotPassedBallotSlashing(t *testing.T) { input, h := Setup(t) params, err := input.OracleKeeper.Params.Get(input.Ctx) require.NoError(t, err) - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)} + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)} input.OracleKeeper.Params.Set(input.Ctx, params) // clear tobin tax to reset vote targets for _, p := range input.OracleKeeper.WhitelistedPairs.Iterate(input.Ctx, collections.Range[asset.Pair]{}).Keys() { input.OracleKeeper.WhitelistedPairs.Delete(input.Ctx, p) } - input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD)) + input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.ATOM, denoms.USD)) input.Ctx = input.Ctx.WithBlockHeight(input.Ctx.BlockHeight() + 1) // Account 1, govstable - MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}}, 0) + MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}}, 0) input.OracleKeeper.UpdateExchangeRates(input.Ctx) input.OracleKeeper.SlashAndResetMissCounters(input.Ctx) @@ -235,12 +235,12 @@ func TestAbstainSlashing(t *testing.T) { // reset whitelisted pairs params, err := input.OracleKeeper.Params.Get(input.Ctx) require.NoError(t, err) - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)} + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)} input.OracleKeeper.Params.Set(input.Ctx, params) for _, p := range input.OracleKeeper.WhitelistedPairs.Iterate(input.Ctx, collections.Range[asset.Pair]{}).Keys() { input.OracleKeeper.WhitelistedPairs.Delete(input.Ctx, p) } - input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD)) + input.OracleKeeper.WhitelistedPairs.Insert(input.Ctx, asset.Registry.Pair(denoms.ATOM, denoms.USD)) votePeriodsPerWindow := sdk.NewDec(int64(input.OracleKeeper.SlashWindow(input.Ctx))).QuoInt64(int64(input.OracleKeeper.VotePeriod(input.Ctx))).TruncateInt64() minValidPerWindow := input.OracleKeeper.MinValidPerWindow(input.Ctx) @@ -248,14 +248,14 @@ func TestAbstainSlashing(t *testing.T) { for i := uint64(0); i <= uint64(sdk.OneDec().Sub(minValidPerWindow).MulInt64(votePeriodsPerWindow).TruncateInt64()); i++ { input.Ctx = input.Ctx.WithBlockHeight(input.Ctx.BlockHeight() + 1) - // Account 1, NIBI/NUSD - MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}}, 0) + // Account 1, ATOM/USD + MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}}, 0) - // Account 2, NIBI/NUSD, abstain vote - MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: sdk.OneDec().Neg()}}, 1) + // Account 2, ATOM/USD, abstain vote + MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: sdk.OneDec().Neg()}}, 1) - // Account 3, NIBI/NUSD - MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}}, 2) + // Account 3, ATOM/USD + MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}}, 2) input.OracleKeeper.UpdateExchangeRates(input.Ctx) input.OracleKeeper.SlashAndResetMissCounters(input.Ctx) diff --git a/x/oracle/keeper/update_exchange_rates_test.go b/x/oracle/keeper/update_exchange_rates_test.go index a1cb34680..eec7dbd18 100644 --- a/x/oracle/keeper/update_exchange_rates_test.go +++ b/x/oracle/keeper/update_exchange_rates_test.go @@ -23,7 +23,7 @@ import ( func TestOracleThreshold(t *testing.T) { exchangeRates := types.ExchangeRateTuples{ { - Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), + Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: testExchangeRate, }, } @@ -92,7 +92,7 @@ func TestOracleThreshold(t *testing.T) { } func TestResetExchangeRates(t *testing.T) { - pair := asset.Registry.Pair(denoms.BTC, denoms.NUSD) + pair := asset.Registry.Pair(denoms.BTC, denoms.USD) fixture, _ := Setup(t) emptyVotes := map[asset.Pair]types.ExchangeRateVotes{} @@ -139,7 +139,7 @@ func TestOracleTally(t *testing.T) { for i, rate := range rates { decExchangeRate := sdk.NewDecWithPrec(int64(rate*math.Pow10(OracleDecPrecision)), int64(OracleDecPrecision)) exchangeRateStr, err := types.ExchangeRateTuples{ - {ExchangeRate: decExchangeRate, Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD)}, + {ExchangeRate: decExchangeRate, Pair: asset.Registry.Pair(denoms.BTC, denoms.USD)}, }.ToString() require.NoError(t, err) @@ -159,7 +159,7 @@ func TestOracleTally(t *testing.T) { } vote := types.NewExchangeRateVote( - decExchangeRate, asset.Registry.Pair(denoms.BTC, denoms.NUSD), valAddrs[i], power) + decExchangeRate, asset.Registry.Pair(denoms.BTC, denoms.USD), valAddrs[i], power) votes = append(votes, vote) // change power of every three validator @@ -220,35 +220,35 @@ func TestOracleRewardBand(t *testing.T) { params, err := fixture.OracleKeeper.Params.Get(fixture.Ctx) require.NoError(t, err) - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)} + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)} fixture.OracleKeeper.Params.Set(fixture.Ctx, params) // clear pairs to reset vote targets for _, p := range fixture.OracleKeeper.WhitelistedPairs.Iterate(fixture.Ctx, collections.Range[asset.Pair]{}).Keys() { fixture.OracleKeeper.WhitelistedPairs.Delete(fixture.Ctx, p) } - fixture.OracleKeeper.WhitelistedPairs.Insert(fixture.Ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD)) + fixture.OracleKeeper.WhitelistedPairs.Insert(fixture.Ctx, asset.Registry.Pair(denoms.ATOM, denoms.USD)) rewardSpread := testExchangeRate.Mul(fixture.OracleKeeper.RewardBand(fixture.Ctx).QuoInt64(2)) - // Account 1, nibi:nusd + // Account 1, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Sub(rewardSpread)}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Sub(rewardSpread)}, }, 0) - // Account 2, nibi:nusd + // Account 2, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 1) - // Account 3, nibi:nusd + // Account 3, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 2) - // Account 4, nibi:nusd + // Account 4, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Add(rewardSpread)}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Add(rewardSpread)}, }, 3) fixture.OracleKeeper.UpdateExchangeRates(fixture.Ctx) @@ -259,24 +259,24 @@ func TestOracleRewardBand(t *testing.T) { assert.Equal(t, uint64(0), fixture.OracleKeeper.MissCounters.GetOr(fixture.Ctx, ValAddrs[3], 0)) // Account 1 will miss the vote due to raward band condition - // Account 1, nibi:nusd + // Account 1, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Sub(rewardSpread.Add(sdk.OneDec()))}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Sub(rewardSpread.Add(sdk.OneDec()))}, }, 0) - // Account 2, nibi:nusd + // Account 2, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 1) - // Account 3, nibi:nusd + // Account 3, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}, }, 2) - // Account 4, nibi:nusd + // Account 4, atom:usd MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate.Add(rewardSpread)}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate.Add(rewardSpread)}, }, 3) fixture.OracleKeeper.UpdateExchangeRates(fixture.Ctx) @@ -293,13 +293,13 @@ func TestOracleMultiRewardDistribution(t *testing.T) { // SDR and KRW have the same voting power, but KRW has been chosen as referencepair by alphabetical order. // Account 1, SDR, KRW - makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:nusd.String(), ExchangeRate: randomExchangeRate}, {Pair: common.Pairnibi:nusd.String(), ExchangeRate: randomExchangeRate}}, 0) + makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:usd.String(), ExchangeRate: randomExchangeRate}, {Pair: common.Pairatom:usd.String(), ExchangeRate: randomExchangeRate}}, 0) // Account 2, SDR - makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:nusd.String(), ExchangeRate: randomExchangeRate}}, 1) + makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:usd.String(), ExchangeRate: randomExchangeRate}}, 1) // Account 3, KRW - makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:nusd.String(), ExchangeRate: randomExchangeRate}}, 2) + makeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{{Pair: common.Pairbtc:usd.String(), ExchangeRate: randomExchangeRate}}, 2) rewardAmt := sdk.NewInt(1e6) err := input.BankKeeper.MintCoins(input.Ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin(denoms.Gov, rewardAmt))) @@ -323,53 +323,53 @@ func TestOracleMultiRewardDistribution(t *testing.T) { */ func TestOracleExchangeRate(t *testing.T) { - // The following scenario tests four validators providing prices for eth:nusd, nibi:nusd, and btc:nusd. - // eth:nusd and nibi:nusd pass, but btc:nusd fails due to not enough validators voting. + // The following scenario tests four validators providing prices for eth:usd, atom:usd, and btc:usd. + // eth:usd and atom:usd pass, but btc:usd fails due to not enough validators voting. input, h := Setup(t) - nibiNusdExchangeRate := sdk.NewDec(1000000) - ethNusdExchangeRate := sdk.NewDec(1000000) - btcNusdExchangeRate := sdk.NewDec(1e6) + atomUsdExchangeRate := sdk.NewDec(1000000) + ethUsdExchangeRate := sdk.NewDec(1000000) + btcusdExchangeRate := sdk.NewDec(1e6) - // Account 1, eth:nusd, nibi:nusd, btc:nusd + // Account 1, eth:usd, atom:usd, btc:usd MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: ethNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: nibiNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), ExchangeRate: btcNusdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: ethUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: atomUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: btcusdExchangeRate}, }, 0) - // Account 2, eth:nusd, nibi:nusd + // Account 2, eth:usd, atom:usd MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: ethNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: nibiNusdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: ethUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: atomUsdExchangeRate}, }, 1) - // Account 3, eth:nusd, nibi:nusd, btc:nusd(abstain) + // Account 3, eth:usd, atom:usd, btc:usd(abstain) MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: ethNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: nibiNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), ExchangeRate: sdk.ZeroDec()}, + {Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: ethUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: atomUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: sdk.ZeroDec()}, }, 2) - // Account 4, eth:nusd, nibi:nusd, btc:nusd + // Account 4, eth:usd, atom:usd, btc:usd MakeAggregatePrevoteAndVote(t, input, h, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: ethNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: nibiNusdExchangeRate}, - {Pair: asset.Registry.Pair(denoms.BTC, denoms.NUSD), ExchangeRate: sdk.ZeroDec()}, + {Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: ethUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: atomUsdExchangeRate}, + {Pair: asset.Registry.Pair(denoms.BTC, denoms.USD), ExchangeRate: sdk.ZeroDec()}, }, 3) - ethNusdRewards := sdk.NewInt64Coin("ETHREWARD", 1*common.TO_MICRO) - nibiNusdRewards := sdk.NewInt64Coin("NIBIREWARD", 1*common.TO_MICRO) + ethUsdRewards := sdk.NewInt64Coin("ETHREWARD", 1*common.TO_MICRO) + atomUsdRewards := sdk.NewInt64Coin("ATOMREWARD", 1*common.TO_MICRO) - AllocateRewards(t, input, sdk.NewCoins(ethNusdRewards), 1) - AllocateRewards(t, input, sdk.NewCoins(nibiNusdRewards), 1) + AllocateRewards(t, input, sdk.NewCoins(ethUsdRewards), 1) + AllocateRewards(t, input, sdk.NewCoins(atomUsdRewards), 1) input.OracleKeeper.UpdateExchangeRates(input.Ctx) - // total reward pool for the current vote period is 1* common.TO_MICRO for eth:nusd and 1* common.TO_MICRO for nibi:nusd + // total reward pool for the current vote period is 1* common.TO_MICRO for eth:usd and 1* common.TO_MICRO for atom:usd // val 1,2,3,4 all won on 2 pairs // so total votes are 2 * 2 + 2 + 2 = 8 - expectedRewardAmt := sdk.NewDecCoinsFromCoins(ethNusdRewards, nibiNusdRewards). + expectedRewardAmt := sdk.NewDecCoinsFromCoins(ethUsdRewards, atomUsdRewards). QuoDec(sdk.NewDec(8)). // total votes MulDec(sdk.NewDec(2)) // votes won by val1 and val2 rewards := input.DistrKeeper.GetValidatorOutstandingRewards(input.Ctx.WithBlockHeight(2), ValAddrs[0]) @@ -388,8 +388,8 @@ func TestOracleRandomPrices(t *testing.T) { for i := 0; i < 100; i++ { for val := 0; val < 4; val++ { MakeAggregatePrevoteAndVote(t, fixture, msgServer, 0, types.ExchangeRateTuples{ - {Pair: asset.Registry.Pair(denoms.ETH, denoms.NUSD), ExchangeRate: sdk.NewDec(int64(rand.Uint64() % 1e6))}, - {Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: sdk.NewDec(int64(rand.Uint64() % 1e6))}, + {Pair: asset.Registry.Pair(denoms.ETH, denoms.USD), ExchangeRate: sdk.NewDec(int64(rand.Uint64() % 1e6))}, + {Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: sdk.NewDec(int64(rand.Uint64() % 1e6))}, }, val) } @@ -404,15 +404,15 @@ func TestWhitelistedPairs(t *testing.T) { params, err := fixture.OracleKeeper.Params.Get(fixture.Ctx) require.NoError(t, err) - t.Log("whitelist ONLY nibi:nusd") + t.Log("whitelist ONLY atom:usd") for _, p := range fixture.OracleKeeper.WhitelistedPairs.Iterate(fixture.Ctx, collections.Range[asset.Pair]{}).Keys() { fixture.OracleKeeper.WhitelistedPairs.Delete(fixture.Ctx, p) } - fixture.OracleKeeper.WhitelistedPairs.Insert(fixture.Ctx, asset.Registry.Pair(denoms.NIBI, denoms.NUSD)) + fixture.OracleKeeper.WhitelistedPairs.Insert(fixture.Ctx, asset.Registry.Pair(denoms.ATOM, denoms.USD)) - t.Log("vote and prevote from all vals on nibi:nusd") + t.Log("vote and prevote from all vals on atom:usd") priceVoteFromVal := func(valIdx int, block int64) { - MakeAggregatePrevoteAndVote(t, fixture, msgServer, block, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.NIBI, denoms.NUSD), ExchangeRate: testExchangeRate}}, valIdx) + MakeAggregatePrevoteAndVote(t, fixture, msgServer, block, types.ExchangeRateTuples{{Pair: asset.Registry.Pair(denoms.ATOM, denoms.USD), ExchangeRate: testExchangeRate}}, valIdx) } block := int64(0) priceVoteFromVal(0, block) @@ -420,8 +420,8 @@ func TestWhitelistedPairs(t *testing.T) { priceVoteFromVal(2, block) priceVoteFromVal(3, block) - t.Log("whitelist btc:nusd for next vote period") - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD), asset.Registry.Pair(denoms.BTC, denoms.NUSD)} + t.Log("whitelist btc:usd for next vote period") + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD), asset.Registry.Pair(denoms.BTC, denoms.USD)} fixture.OracleKeeper.Params.Set(fixture.Ctx, params) fixture.OracleKeeper.UpdateExchangeRates(fixture.Ctx) @@ -431,22 +431,22 @@ func TestWhitelistedPairs(t *testing.T) { assert.Equal(t, uint64(0), fixture.OracleKeeper.MissCounters.GetOr(fixture.Ctx, ValAddrs[2], 0)) assert.Equal(t, uint64(0), fixture.OracleKeeper.MissCounters.GetOr(fixture.Ctx, ValAddrs[3], 0)) - t.Log("whitelisted pairs are {nibi:nusd, btc:nusd}") + t.Log("whitelisted pairs are {atom:usd, btc:usd}") assert.Equal(t, []asset.Pair{ - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - asset.Registry.Pair(denoms.NIBI, denoms.NUSD), + asset.Registry.Pair(denoms.ATOM, denoms.USD), + asset.Registry.Pair(denoms.BTC, denoms.USD), }, fixture.OracleKeeper.GetWhitelistedPairs(fixture.Ctx)) - t.Log("vote from vals 0-3 on nibi:nusd (but not btc:nusd)") + t.Log("vote from vals 0-3 on atom:usd (but not btc:usd)") priceVoteFromVal(0, block) priceVoteFromVal(1, block) priceVoteFromVal(2, block) priceVoteFromVal(3, block) - t.Log("delete btc:nusd for next vote period") - params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)} + t.Log("delete btc:usd for next vote period") + params.Whitelist = []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)} fixture.OracleKeeper.Params.Set(fixture.Ctx, params) perfs := fixture.OracleKeeper.UpdateExchangeRates(fixture.Ctx) @@ -463,13 +463,13 @@ func TestWhitelistedPairs(t *testing.T) { assert.EqualValues(t, 2, perf.AbstainCount) assert.EqualValues(t, 0, perf.MissCount) - t.Log("btc:nusd must be deleted") - assert.Equal(t, []asset.Pair{asset.Registry.Pair(denoms.NIBI, denoms.NUSD)}, + t.Log("btc:usd must be deleted") + assert.Equal(t, []asset.Pair{asset.Registry.Pair(denoms.ATOM, denoms.USD)}, fixture.OracleKeeper.GetWhitelistedPairs(fixture.Ctx)) require.False(t, fixture.OracleKeeper.WhitelistedPairs.Has( - fixture.Ctx, asset.Registry.Pair(denoms.BTC, denoms.NUSD))) + fixture.Ctx, asset.Registry.Pair(denoms.BTC, denoms.USD))) - t.Log("vote from vals 0-3 on nibi:nusd") + t.Log("vote from vals 0-3 on atom:usd") priceVoteFromVal(0, block) priceVoteFromVal(1, block) priceVoteFromVal(2, block) diff --git a/x/oracle/types/params.go b/x/oracle/types/params.go index da75568ab..c072f3a3a 100644 --- a/x/oracle/types/params.go +++ b/x/oracle/types/params.go @@ -40,21 +40,7 @@ var ( DefaultVoteThreshold = sdk.OneDec().Quo(sdk.NewDec(3)) // 33.33% DefaultRewardBand = sdk.NewDecWithPrec(2, 2) // 2% (-1, 1) DefaultWhitelist = []asset.Pair{ - // paired against NUSD - asset.Registry.Pair(denoms.NIBI, denoms.NUSD), - asset.Registry.Pair(denoms.BTC, denoms.NUSD), - asset.Registry.Pair(denoms.ETH, denoms.NUSD), - asset.Registry.Pair(denoms.ATOM, denoms.NUSD), - asset.Registry.Pair(denoms.BNB, denoms.NUSD), - asset.Registry.Pair(denoms.USDC, denoms.NUSD), - asset.Registry.Pair(denoms.USDT, denoms.NUSD), - // asset.Registry.Pair(denoms.OSMO, denoms.NUSD), - // asset.Registry.Pair(denoms.AVAX, denoms.NUSD), - // asset.Registry.Pair(denoms.SOL, denoms.NUSD), - // asset.Registry.Pair(denoms.ADA, denoms.NUSD), - // paired against the US fiat dollar - asset.Registry.Pair(denoms.NIBI, denoms.USD), asset.Registry.Pair(denoms.BTC, denoms.USD), asset.Registry.Pair(denoms.ETH, denoms.USD), asset.Registry.Pair(denoms.ATOM, denoms.USD), From 3c96eeab1c72e720b41b33e5ba37b0c97d96d0db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:16:51 +0000 Subject: [PATCH 16/99] chore(deps): Bump github.com/CosmWasm/wasmvm from 1.4.1 to 1.5.0 (#1657) Bumps [github.com/CosmWasm/wasmvm](https://github.com/CosmWasm/wasmvm) from 1.4.1 to 1.5.0. - [Release notes](https://github.com/CosmWasm/wasmvm/releases) - [Changelog](https://github.com/CosmWasm/wasmvm/blob/main/CHANGELOG.md) - [Commits](https://github.com/CosmWasm/wasmvm/compare/v1.4.1...v1.5.0) --- updated-dependencies: - dependency-name: github.com/CosmWasm/wasmvm dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: Unique-Divine Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> --- CHANGELOG.md | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ead75ab5..ec0f2c026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,8 +74,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) - Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) - Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) -- Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.4.1 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629)) - Bump `google.golang.org/grpc` from 1.58.2 to 1.58.3 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633)) +- Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) - Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) ### Bug Fixes @@ -781,4 +781,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Testing * [#695](https://github.com/NibiruChain/nibiru/pull/695) Add `OpenPosition` integration tests. -* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. +* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. \ No newline at end of file diff --git a/go.mod b/go.mod index d9bbdfa93..f8b267725 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.1.2 github.com/CosmWasm/wasmd v0.40.2 - github.com/CosmWasm/wasmvm v1.4.1 + github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.3.0 github.com/armon/go-metrics v0.4.1 diff --git a/go.sum b/go.sum index a24d6a159..26babb1d1 100644 --- a/go.sum +++ b/go.sum @@ -225,8 +225,8 @@ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQ github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/CosmWasm/wasmd v0.40.2 h1:GSDHIaeJI7fcDF5mkzSXQI5IZLtvpNq5t3TjJ9bDpPw= github.com/CosmWasm/wasmd v0.40.2/go.mod h1:vqI238yb4D6aNuigS8mCqTyyCV9HN5eBEZARKRoK3ts= -github.com/CosmWasm/wasmvm v1.4.1 h1:YgodVlBrXa2HJZzOXjWDH0EIRwQzK3zuA73dDPRRLS4= -github.com/CosmWasm/wasmvm v1.4.1/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= +github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= +github.com/CosmWasm/wasmvm v1.5.0/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= From afd671aa5717980e992c2858f766d1a0fae30300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 21:48:24 +0000 Subject: [PATCH 17/99] chore(deps): Bump google.golang.org/grpc from 1.58.3 to 1.59.0 (#1643) * chore(deps): Bump google.golang.org/grpc from 1.58.3 to 1.59.0 Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.58.3 to 1.59.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.58.3...v1.59.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Updated changelog - dependabot --------- Signed-off-by: Unique-Divine Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> Co-authored-by: Unique-Divine Co-authored-by: Unique-Divine --- CHANGELOG.md | 2 +- go.mod | 19 +++++++++---------- go.sum | 37 ++++++++++++++++++------------------- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0f2c026..2fbafea9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,8 +74,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) - Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) - Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) -- Bump `google.golang.org/grpc` from 1.58.2 to 1.58.3 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633)) - Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) +- Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) - Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) ### Bug Fixes diff --git a/go.mod b/go.mod index f8b267725..c7ecc1b98 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,6 @@ require ( github.com/google/gofuzz v1.2.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/grpc-gateway v1.16.0 - github.com/holiman/uint256 v1.2.3 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.17.0 github.com/rakyll/statik v0.1.7 @@ -32,15 +31,15 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 - google.golang.org/grpc v1.58.3 + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.110.4 // indirect - cloud.google.com/go/compute v1.21.0 // indirect + cloud.google.com/go v0.110.7 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.1 // indirect cloud.google.com/go/storage v1.30.1 // indirect @@ -94,14 +93,14 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect - github.com/golang/glog v1.1.0 // indirect + github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect @@ -167,7 +166,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.10.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/term v0.13.0 // indirect @@ -175,8 +174,8 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index 26babb1d1..c4e1b4697 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.4 h1:1JYyxKMN9hd5dR2MYTPWkGUgcoxVVhg0LKNKEo0qvmk= -cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= +cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.21.0 h1:JNBsyXVoOoNJtTQcnEY5uYpZIbeCTYIeDe0Xh1bySMk= -cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -564,8 +564,8 @@ github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -663,8 +663,9 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -754,8 +755,6 @@ github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7H github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/holiman/uint256 v1.2.3 h1:K8UWO1HUJpRMXBxbmaY1Y8IAMZC/RsKB+ArEnnK4l5o= -github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/go-assert v1.1.5 h1:fjemmA7sSfYHJD7CUqs9qTwwfdNAx7/j2/ZlHXzNB3c= github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0JrPVhn/06U= @@ -1365,8 +1364,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8= -golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1768,12 +1767,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1815,8 +1814,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 10b09c58f0b4f50e10256d8b5cc2a351d38777ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 20:20:17 +0000 Subject: [PATCH 18/99] chore(deps): Bump github.com/cosmos/ibc-go/v7 from 7.3.0 to 7.3.1 (#1647) --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fbafea9b..3a1d99040 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,6 +77,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) - Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) - Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) +- Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) ### Bug Fixes diff --git a/go.mod b/go.mod index c7ecc1b98..88d9b5c77 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/cosmos/cosmos-sdk v0.47.5 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.3.0 + github.com/cosmos/ibc-go/v7 v7.3.1 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index c4e1b4697..d6934911c 100644 --- a/go.sum +++ b/go.sum @@ -406,8 +406,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.3.0 h1:QtGeVMi/3JeLWuvEuC60sBHpAF40Oenx/y+bP8+wRRw= -github.com/cosmos/ibc-go/v7 v7.3.0/go.mod h1:mUmaHFXpXrEdcxfdXyau+utZf14pGKVUiXwYftRZZfQ= +github.com/cosmos/ibc-go/v7 v7.3.1 h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8= +github.com/cosmos/ibc-go/v7 v7.3.1/go.mod h1:wvx4pPBofe5ZdMNV3OFRxSI4auEP5Qfqf8JXLLNV04g= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= From 2c94aa847adb836d9dcf845d09fb3cab3f4ed537 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:26:04 -0500 Subject: [PATCH 19/99] chore(oracle): remove bnb:usd from default whitelist --- x/oracle/types/params.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/oracle/types/params.go b/x/oracle/types/params.go index c072f3a3a..65be8d23f 100644 --- a/x/oracle/types/params.go +++ b/x/oracle/types/params.go @@ -44,9 +44,9 @@ var ( asset.Registry.Pair(denoms.BTC, denoms.USD), asset.Registry.Pair(denoms.ETH, denoms.USD), asset.Registry.Pair(denoms.ATOM, denoms.USD), - asset.Registry.Pair(denoms.BNB, denoms.USD), asset.Registry.Pair(denoms.USDC, denoms.USD), asset.Registry.Pair(denoms.USDT, denoms.USD), + // asset.Registry.Pair(denoms.BNB, denoms.USD), // asset.Registry.Pair(denoms.OSMO, denoms.USD), // asset.Registry.Pair(denoms.AVAX, denoms.USD), // asset.Registry.Pair(denoms.SOL, denoms.USD), From 6208cfa02b8bba78656131a03fd8853b495e8fe2 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 3 Nov 2023 15:13:41 -0500 Subject: [PATCH 20/99] chore(epochs): add month default epoch --- x/epochs/types/genesis.go | 9 +++++++++ x/epochs/types/identifier.go | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/x/epochs/types/genesis.go b/x/epochs/types/genesis.go index 2c1aea11d..903485fb6 100644 --- a/x/epochs/types/genesis.go +++ b/x/epochs/types/genesis.go @@ -44,6 +44,15 @@ func DefaultGenesisFromTime(startTime time.Time) *GenesisState { CurrentEpochStartTime: startTime, EpochCountingStarted: false, }, + { + Identifier: MonthEpochID, + StartTime: startTime, + Duration: 30 * 24 * time.Hour, + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: startTime, + EpochCountingStarted: false, + }, } return NewGenesisState(epochs) diff --git a/x/epochs/types/identifier.go b/x/epochs/types/identifier.go index 3dd3012cb..0450da907 100644 --- a/x/epochs/types/identifier.go +++ b/x/epochs/types/identifier.go @@ -6,16 +6,18 @@ import ( ) const ( + // WeekEpochID defines the identifier for weekly epochs + MonthEpochID = "month" // WeekEpochID defines the identifier for weekly epochs WeekEpochID = "week" // DayEpochID defines the identifier for daily epochs DayEpochID = "day" // HourEpochID defines the identifier for hourly epochs HourEpochID = "hour" - // FifteenMinuteEpochID defines the identifier for 15 minute epochs - FifteenMinuteEpochID = "15 min" // ThirtyMinuteEpochID defines the identifier for 30 minute epochs ThirtyMinuteEpochID = "30 min" + // FifteenMinuteEpochID defines the identifier for 15 minute epochs + FifteenMinuteEpochID = "15 min" ) // ValidateEpochIdentifierInterface performs a stateless From 0a74da1be6b41a29369bc4951b1187239233893e Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:59:11 -0600 Subject: [PATCH 21/99] chore(wasm): bump wasmd dependency to v0.43.0 (#1660) * chore(wasm): bump wasmd dependency to v0.43.0 * Update CHANGELOG.md * fix: fix linter issues --------- Co-authored-by: Matthias --- CHANGELOG.md | 1 + app/app.go | 15 ++++++++------- app/keepers.go | 19 ++++++++++--------- go.mod | 2 +- go.sum | 4 ++-- wasmbinding/wasm.go | 5 ++--- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a1d99040..825e13540 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) - Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) - Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) +- Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) ### Bug Fixes diff --git a/app/app.go b/app/app.go index c4a21d038..4657d3e51 100644 --- a/app/app.go +++ b/app/app.go @@ -8,8 +8,8 @@ import ( "os" "path/filepath" - "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" @@ -109,16 +109,17 @@ func init() { } // GetWasmOpts build wasm options -func GetWasmOpts(appOpts servertypes.AppOptions, nibiruApp NibiruApp) []wasm.Option { - var wasmOpts []wasm.Option +func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasmkeeper.Option { + var wasmOpts []wasmkeeper.Option if cast.ToBool(appOpts.Get("telemetry.enabled")) { wasmOpts = append(wasmOpts, wasmkeeper.WithVMCacheMetrics(prometheus.DefaultRegisterer)) } + // Add the bindings to the app's set of []wasmkeeper.Option. wasmOpts = append(wasmOpts, wasmbinding.NibiruWasmOptions( - nibiruApp.GRPCQueryRouter(), - nibiruApp.AppCodec(), - nibiruApp.SudoKeeper, + nibiru.GRPCQueryRouter(), + nibiru.AppCodec(), + nibiru.SudoKeeper, )...) // Add the bindings to the app's set of []wasm.Option. return wasmOpts @@ -193,7 +194,7 @@ func NewNibiruApp( SigGasConsumer: authante.DefaultSigVerificationGasConsumer, }, IBCKeeper: app.ibcKeeper, - TxCounterStoreKey: keys[wasm.StoreKey], + TxCounterStoreKey: keys[wasmtypes.StoreKey], WasmConfig: &wasmConfig, DevGasKeeper: &app.DevGasKeeper, DevGasBankKeeper: app.BankKeeper, diff --git a/app/keepers.go b/app/keepers.go index c2429581b..66890104c 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -6,6 +6,7 @@ import ( wasmdapp "github.com/CosmWasm/wasmd/app" "github.com/CosmWasm/wasmd/x/wasm" + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" _ "github.com/cosmos/cosmos-sdk/client/docs/statik" "github.com/cosmos/cosmos-sdk/client/flags" @@ -169,7 +170,7 @@ type AppKeepers struct { TokenFactoryKeeper tokenfactorykeeper.Keeper // WASM keepers - WasmKeeper wasm.Keeper + WasmKeeper wasmkeeper.Keeper ScopedWasmKeeper capabilitykeeper.ScopedKeeper } @@ -204,7 +205,7 @@ func initStoreKeys() ( epochstypes.StoreKey, inflationtypes.StoreKey, sudotypes.StoreKey, - wasm.StoreKey, + wasmtypes.StoreKey, devgastypes.StoreKey, tokenfactorytypes.StoreKey, ) @@ -382,7 +383,7 @@ func (app *NibiruApp) InitKeepers( app.BankKeeper, ) - app.ScopedWasmKeeper = app.capabilityKeeper.ScopeToModule(wasm.ModuleName) + app.ScopedWasmKeeper = app.capabilityKeeper.ScopeToModule(wasmtypes.ModuleName) wasmDir := filepath.Join(homePath, "data") wasmConfig, err := wasm.ReadWasmConfig(appOpts) @@ -399,9 +400,9 @@ func (app *NibiruApp) InitKeepers( // For example, if there are bindings for the x/perp module, then the app // passed to GetWasmOpts must already have a non-nil PerpKeeper. supportedFeatures := strings.Join(wasmdapp.AllCapabilities(), ",") - app.WasmKeeper = wasm.NewKeeper( + app.WasmKeeper = wasmkeeper.NewKeeper( appCodec, - keys[wasm.StoreKey], + keys[wasmtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.stakingKeeper, @@ -417,7 +418,7 @@ func (app *NibiruApp) InitKeepers( wasmConfig, supportedFeatures, authtypes.NewModuleAddress(govtypes.ModuleName).String(), - GetWasmOpts(appOpts, *app)..., + GetWasmOpts(*app, appOpts)..., ) // DevGas uses WasmKeeper @@ -644,7 +645,7 @@ func orderedModuleNames() []string { // -------------------------------------------------------------------- // CosmWasm - wasm.ModuleName, + wasmtypes.ModuleName, devgastypes.ModuleName, tokenfactorytypes.ModuleName, @@ -772,7 +773,7 @@ func ModuleAccPerms() map[string][]string { epochstypes.ModuleName: {}, sudotypes.ModuleName: {}, common.TreasuryPoolModuleAccount: {}, - wasm.ModuleName: {authtypes.Burner}, + wasmtypes.ModuleName: {authtypes.Burner}, tokenfactorytypes.ModuleName: {authtypes.Minter, authtypes.Burner}, } } @@ -799,7 +800,7 @@ func initParamsKeeper( paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(ibcfeetypes.ModuleName) // wasm params keepers - paramsKeeper.Subspace(wasm.ModuleName) + paramsKeeper.Subspace(wasmtypes.ModuleName) paramsKeeper.Subspace(devgastypes.ModuleName) return paramsKeeper diff --git a/go.mod b/go.mod index 88d9b5c77..6842e9728 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.1.2 - github.com/CosmWasm/wasmd v0.40.2 + github.com/CosmWasm/wasmd v0.43.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.3.0 diff --git a/go.sum b/go.sum index d6934911c..acfb08fb1 100644 --- a/go.sum +++ b/go.sum @@ -223,8 +223,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmd v0.40.2 h1:GSDHIaeJI7fcDF5mkzSXQI5IZLtvpNq5t3TjJ9bDpPw= -github.com/CosmWasm/wasmd v0.40.2/go.mod h1:vqI238yb4D6aNuigS8mCqTyyCV9HN5eBEZARKRoK3ts= +github.com/CosmWasm/wasmd v0.43.0 h1:4xQAiNf6Ej+TuYe4PXwrtVJ9C+xyFrbsdqHH/kU9Vxk= +github.com/CosmWasm/wasmd v0.43.0/go.mod h1:gpri8YvkRErBz+qDme5jOThGZmSlHfyN532bWibXOl4= github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= github.com/CosmWasm/wasmvm v1.5.0/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= diff --git a/wasmbinding/wasm.go b/wasmbinding/wasm.go index a717f1a29..44a63372c 100644 --- a/wasmbinding/wasm.go +++ b/wasmbinding/wasm.go @@ -1,7 +1,6 @@ package wasmbinding import ( - "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/codec" @@ -15,7 +14,7 @@ func NibiruWasmOptions( grpcQueryRouter *baseapp.GRPCQueryRouter, appCodec codec.Codec, sudoKeeper keeper.Keeper, -) []wasm.Option { +) []wasmkeeper.Option { wasmQueryOption := wasmkeeper.WithQueryPlugins(&wasmkeeper.QueryPlugins{ Stargate: wasmkeeper.AcceptListStargateQuerier( WasmAcceptedStargateQueries(), @@ -24,5 +23,5 @@ func NibiruWasmOptions( ), }) - return []wasm.Option{wasmQueryOption} + return []wasmkeeper.Option{wasmQueryOption} } From 0d4e8ded76dcde18bc8d4552a3188bcf5b69c0c5 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 6 Nov 2023 14:12:33 -0600 Subject: [PATCH 22/99] fix(epochs): fix epoch tests broken by adding month epoch into default genesis --- x/epochs/genesis_test.go | 73 +++++++++++++++++------------- x/epochs/keeper/grpc_query_test.go | 2 +- x/epochs/keeper/keeper_test.go | 14 +++--- x/epochs/types/epochinfo_test.go | 9 ++++ 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index 1f4b14cb2..2fc851929 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/NibiruChain/nibiru/app" @@ -26,32 +27,40 @@ func TestEpochsExportGenesis(t *testing.T) { ctx := testapp.NewContext(app).WithBlockTime(chainStartTime) genesis := epochs.ExportGenesis(ctx, app.EpochsKeeper) - require.Len(t, genesis.Epochs, 3) + require.Len(t, genesis.Epochs, 4) errMsg := fmt.Sprintf("app.EpochsKeeper.AllEpochInfos(ctx): %v\n", app.EpochsKeeper.AllEpochInfos(ctx)) - require.Equal(t, genesis.Epochs[0].Identifier, "30 min") - require.Equal(t, genesis.Epochs[0].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[0].Duration, time.Minute*30, errMsg) - require.Equal(t, genesis.Epochs[0].CurrentEpoch, uint64(0)) - require.Equal(t, genesis.Epochs[0].CurrentEpochStartHeight, int64(0)) - require.Equal(t, genesis.Epochs[0].CurrentEpochStartTime, chainStartTime) - require.Equal(t, genesis.Epochs[0].EpochCountingStarted, false) - - require.Equal(t, genesis.Epochs[1].Identifier, "day") - require.Equal(t, genesis.Epochs[1].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[1].Duration, time.Hour*24) - require.Equal(t, genesis.Epochs[1].CurrentEpoch, uint64(0)) - require.Equal(t, genesis.Epochs[1].CurrentEpochStartHeight, int64(0)) - require.Equal(t, genesis.Epochs[1].CurrentEpochStartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[1].EpochCountingStarted, false) - - require.Equal(t, genesis.Epochs[2].Identifier, "week") - require.Equal(t, genesis.Epochs[2].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[2].Duration, time.Hour*24*7) - require.Equal(t, genesis.Epochs[2].CurrentEpoch, uint64(0)) - require.Equal(t, genesis.Epochs[2].CurrentEpochStartHeight, int64(0)) - require.Equal(t, genesis.Epochs[2].CurrentEpochStartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[2].EpochCountingStarted, false) + assert.EqualValues(t, genesis.Epochs[0].Identifier, "30 min") + assert.EqualValues(t, genesis.Epochs[0].StartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[0].Duration, time.Minute*30, errMsg) + assert.EqualValues(t, genesis.Epochs[0].CurrentEpoch, uint64(0)) + assert.EqualValues(t, genesis.Epochs[0].CurrentEpochStartHeight, int64(0)) + assert.EqualValues(t, genesis.Epochs[0].CurrentEpochStartTime, chainStartTime) + assert.EqualValues(t, genesis.Epochs[0].EpochCountingStarted, false) + + assert.EqualValues(t, genesis.Epochs[1].Identifier, "day") + assert.EqualValues(t, genesis.Epochs[1].StartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[1].Duration, time.Hour*24) + assert.EqualValues(t, genesis.Epochs[1].CurrentEpoch, uint64(0)) + assert.EqualValues(t, genesis.Epochs[1].CurrentEpochStartHeight, int64(0)) + assert.EqualValues(t, genesis.Epochs[1].CurrentEpochStartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[1].EpochCountingStarted, false) + + assert.EqualValues(t, genesis.Epochs[2].Identifier, "month") + assert.EqualValues(t, genesis.Epochs[2].StartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[2].Duration, time.Hour*24*30) + assert.EqualValues(t, genesis.Epochs[2].CurrentEpoch, uint64(0)) + assert.EqualValues(t, genesis.Epochs[2].CurrentEpochStartHeight, int64(0)) + assert.EqualValues(t, genesis.Epochs[2].CurrentEpochStartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[2].EpochCountingStarted, false) + + assert.EqualValues(t, genesis.Epochs[3].Identifier, "week") + assert.EqualValues(t, genesis.Epochs[3].StartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[3].Duration, time.Hour*24*7) + assert.EqualValues(t, genesis.Epochs[3].CurrentEpoch, uint64(0)) + assert.EqualValues(t, genesis.Epochs[3].CurrentEpochStartHeight, int64(0)) + assert.EqualValues(t, genesis.Epochs[3].CurrentEpochStartTime, chainStartTime, errMsg) + assert.EqualValues(t, genesis.Epochs[3].EpochCountingStarted, false) } func TestEpochsInitGenesis(t *testing.T) { @@ -94,7 +103,7 @@ func TestEpochsInitGenesis(t *testing.T) { err := epochs.InitGenesis(ctx, app.EpochsKeeper, genesisState) require.Error(t, err) - require.EqualError(t, genesisState.Validate(), "epoch identifier should be unique") + assert.EqualError(t, genesisState.Validate(), "epoch identifier should be unique") genesisState = types.GenesisState{ Epochs: []types.EpochInfo{ @@ -114,11 +123,11 @@ func TestEpochsInitGenesis(t *testing.T) { require.NoError(t, err) epochInfo, err := app.EpochsKeeper.GetEpochInfo(ctx, "monthly") require.NoError(t, err) - require.Equal(t, epochInfo.Identifier, "monthly") - require.Equal(t, epochInfo.StartTime.UTC().String(), now.UTC().String()) - require.Equal(t, epochInfo.Duration, time.Hour*24) - require.Equal(t, epochInfo.CurrentEpoch, uint64(0)) - require.Equal(t, epochInfo.CurrentEpochStartHeight, ctx.BlockHeight()) - require.Equal(t, epochInfo.CurrentEpochStartTime.UTC().String(), time.Time{}.String()) - require.Equal(t, epochInfo.EpochCountingStarted, true) + assert.EqualValues(t, epochInfo.Identifier, "monthly") + assert.EqualValues(t, epochInfo.StartTime.UTC().String(), now.UTC().String()) + assert.EqualValues(t, epochInfo.Duration, time.Hour*24) + assert.EqualValues(t, epochInfo.CurrentEpoch, uint64(0)) + assert.EqualValues(t, epochInfo.CurrentEpochStartHeight, ctx.BlockHeight()) + assert.EqualValues(t, epochInfo.CurrentEpochStartTime.UTC().String(), time.Time{}.String()) + assert.EqualValues(t, epochInfo.EpochCountingStarted, true) } diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go index d8d820757..c54e66fd7 100644 --- a/x/epochs/keeper/grpc_query_test.go +++ b/x/epochs/keeper/grpc_query_test.go @@ -31,7 +31,7 @@ func TestQueryEpochInfos(t *testing.T) { gocontext.Background(), &epochstypes.QueryEpochInfosRequest{}, ) require.NoError(t, err, errMsg) - require.Len(t, epochInfosResponse.Epochs, 3) + require.Len(t, epochInfosResponse.Epochs, 4) // check if EpochInfos are correct require.Equal(t, epochInfosResponse.Epochs[0].StartTime, chainStartTime, errMsg) diff --git a/x/epochs/keeper/keeper_test.go b/x/epochs/keeper/keeper_test.go index 74e11e5dd..046e6d630 100644 --- a/x/epochs/keeper/keeper_test.go +++ b/x/epochs/keeper/keeper_test.go @@ -4,6 +4,7 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" @@ -14,9 +15,9 @@ func TestUpsertEpochInfo_HappyPath(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() epochInfo := types.EpochInfo{ - Identifier: "monthly", + Identifier: "year", StartTime: time.Time{}, - Duration: time.Hour * 24 * 30, + Duration: time.Hour * 24 * 365, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: time.Time{}, @@ -25,18 +26,19 @@ func TestUpsertEpochInfo_HappyPath(t *testing.T) { nibiruApp.EpochsKeeper.Epochs.Insert(ctx, epochInfo.Identifier, epochInfo) - epochInfoSaved, err := nibiruApp.EpochsKeeper.GetEpochInfo(ctx, "monthly") + epochInfoSaved, err := nibiruApp.EpochsKeeper.GetEpochInfo(ctx, "year") require.NoError(t, err) - require.Equal(t, epochInfo, epochInfoSaved) + assert.EqualValues(t, epochInfo, epochInfoSaved) allEpochs := nibiruApp.EpochsKeeper.AllEpochInfos(ctx) - require.Len(t, allEpochs, 4) + require.Len(t, allEpochs, 5) // Epochs are ordered in alphabetical order require.Equal(t, "30 min", allEpochs[0].Identifier) require.Equal(t, "day", allEpochs[1].Identifier) - require.Equal(t, "monthly", allEpochs[2].Identifier) + require.Equal(t, "month", allEpochs[2].Identifier) require.Equal(t, "week", allEpochs[3].Identifier) + require.Equal(t, "year", allEpochs[4].Identifier) } func TestEpochExists(t *testing.T) { diff --git a/x/epochs/types/epochinfo_test.go b/x/epochs/types/epochinfo_test.go index f6e5d3d6f..a3624337a 100644 --- a/x/epochs/types/epochinfo_test.go +++ b/x/epochs/types/epochinfo_test.go @@ -38,6 +38,15 @@ func TestDefaultGenesis(t *testing.T) { CurrentEpochStartTime: time.Time{}, EpochCountingStarted: false, }, + { + Identifier: MonthEpochID, + StartTime: time.Time{}, + Duration: 30 * 24 * time.Hour, + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, } // Ensure that genState and expectedEpochs are the same From db04996c552c2bcad85f22c9f251852454640b54 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Mon, 6 Nov 2023 20:10:00 +0100 Subject: [PATCH 23/99] feat: update wasmd to v0.44.0 (#1666) * feat: update wasmd to v0.44.0 * chore: lint --- CHANGELOG.md | 1 + go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 825e13540..449ba1675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) - Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) - Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) +- Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) ### Bug Fixes diff --git a/go.mod b/go.mod index 6842e9728..f90d1595b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.1.2 - github.com/CosmWasm/wasmd v0.43.0 + github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.3.0 diff --git a/go.sum b/go.sum index acfb08fb1..c1bb79276 100644 --- a/go.sum +++ b/go.sum @@ -223,8 +223,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= -github.com/CosmWasm/wasmd v0.43.0 h1:4xQAiNf6Ej+TuYe4PXwrtVJ9C+xyFrbsdqHH/kU9Vxk= -github.com/CosmWasm/wasmd v0.43.0/go.mod h1:gpri8YvkRErBz+qDme5jOThGZmSlHfyN532bWibXOl4= +github.com/CosmWasm/wasmd v0.44.0 h1:2sbcoCAvfjCs1O0SWt53xULKjkV06dbSFthEViIC6Zg= +github.com/CosmWasm/wasmd v0.44.0/go.mod h1:tDyYN050qUcdd7LOxGeo2e185sEShyO3nJGl2Cf59+k= github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= github.com/CosmWasm/wasmvm v1.5.0/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqYsTha2hc= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From c55185ffa2a6190faa791f2611ea919f9563f935 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 7 Nov 2023 16:27:15 -0600 Subject: [PATCH 24/99] chore(inflation)!: remove x/inflation module (#1667) * chore(inflation): remove x/inflation and inflation proto files * fix: wasmbinding imports * chore(inflation): remove inflation from app keepers * update changelog --- CHANGELOG.md | 1 + app/keepers.go | 33 +- proto/nibiru/inflation/v1/genesis.proto | 36 - proto/nibiru/inflation/v1/inflation.proto | 52 - proto/nibiru/inflation/v1/query.proto | 119 - wasmbinding/stargate_query.go | 14 +- wasmbinding/stargate_query_test.go | 2 - x/common/testutil/action/account.go | 10 +- x/common/testutil/testapp/testapp.go | 12 +- x/inflation/client/cli/query.go | 213 -- x/inflation/genesis.go | 40 - x/inflation/keeper/grpc_query.go | 78 - x/inflation/keeper/grpc_query_test.go | 103 - x/inflation/keeper/hooks.go | 154 -- x/inflation/keeper/hooks_test.go | 192 -- x/inflation/keeper/inflation.go | 140 -- x/inflation/keeper/inflation_test.go | 185 -- x/inflation/keeper/keeper.go | 72 - x/inflation/keeper/params.go | 41 - x/inflation/module.go | 171 -- x/inflation/types/events.go | 9 - x/inflation/types/export.go | 12 - x/inflation/types/genesis.go | 37 - x/inflation/types/genesis.pb.go | 715 ------ x/inflation/types/genesis_test.go | 57 - x/inflation/types/inflation.pb.go | 695 ------ x/inflation/types/inflation_calculation.go | 33 - .../types/inflation_calculation_test.go | 76 - x/inflation/types/interfaces.go | 45 - x/inflation/types/keys.go | 13 - x/inflation/types/params.go | 171 -- x/inflation/types/params_test.go | 208 -- x/inflation/types/query.pb.go | 2191 ----------------- x/inflation/types/query.pb.gw.go | 478 ---- 34 files changed, 27 insertions(+), 6381 deletions(-) delete mode 100644 proto/nibiru/inflation/v1/genesis.proto delete mode 100644 proto/nibiru/inflation/v1/inflation.proto delete mode 100644 proto/nibiru/inflation/v1/query.proto delete mode 100644 x/inflation/client/cli/query.go delete mode 100644 x/inflation/genesis.go delete mode 100644 x/inflation/keeper/grpc_query.go delete mode 100644 x/inflation/keeper/grpc_query_test.go delete mode 100644 x/inflation/keeper/hooks.go delete mode 100644 x/inflation/keeper/hooks_test.go delete mode 100644 x/inflation/keeper/inflation.go delete mode 100644 x/inflation/keeper/inflation_test.go delete mode 100644 x/inflation/keeper/keeper.go delete mode 100644 x/inflation/keeper/params.go delete mode 100644 x/inflation/module.go delete mode 100644 x/inflation/types/events.go delete mode 100644 x/inflation/types/export.go delete mode 100644 x/inflation/types/genesis.go delete mode 100644 x/inflation/types/genesis.pb.go delete mode 100644 x/inflation/types/genesis_test.go delete mode 100644 x/inflation/types/inflation.pb.go delete mode 100644 x/inflation/types/inflation_calculation.go delete mode 100644 x/inflation/types/inflation_calculation_test.go delete mode 100644 x/inflation/types/interfaces.go delete mode 100644 x/inflation/types/keys.go delete mode 100644 x/inflation/types/params.go delete mode 100644 x/inflation/types/params_test.go delete mode 100644 x/inflation/types/query.pb.go delete mode 100644 x/inflation/types/query.pb.gw.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 449ba1675..097de9bb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1617](https://github.com/NibiruChain/nibiru/pull/1617) - fix(app)!: non-nil snapshot manager is not guaranteed in testapp * [#1645](https://github.com/NibiruChain/nibiru/pull/1645) - fix(tokenfactory)!: token supply in bank keeper must be correct after MsgBurn. * [#1646](https://github.com/NibiruChain/nibiru/pull/1646) - feat(wasmbinding)!: whitelisted stargate queries for QueryRequest::Stargate: auth, bank, gov, tokenfactory, epochs, inflation, oracle, sudo, devgas +* [#1667](https://github.com/NibiruChain/nibiru/pull/1667) - chore(inflation)!: unwire x/inflation ### Improvements diff --git a/app/keepers.go b/app/keepers.go index 66890104c..5b02fb860 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -104,9 +104,6 @@ import ( epochskeeper "github.com/NibiruChain/nibiru/x/epochs/keeper" epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" "github.com/NibiruChain/nibiru/x/genmsg" - "github.com/NibiruChain/nibiru/x/inflation" - inflationkeeper "github.com/NibiruChain/nibiru/x/inflation/keeper" - inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" oracle "github.com/NibiruChain/nibiru/x/oracle" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" @@ -164,7 +161,6 @@ type AppKeepers struct { // --------------- EpochsKeeper epochskeeper.Keeper OracleKeeper oraclekeeper.Keeper - InflationKeeper inflationkeeper.Keeper SudoKeeper keeper.Keeper DevGasKeeper devgaskeeper.Keeper TokenFactoryKeeper tokenfactorykeeper.Keeper @@ -203,7 +199,6 @@ func initStoreKeys() ( // nibiru x/ keys oracletypes.StoreKey, epochstypes.StoreKey, - inflationtypes.StoreKey, sudotypes.StoreKey, wasmtypes.StoreKey, devgastypes.StoreKey, @@ -350,14 +345,8 @@ func (app *NibiruApp) InitKeepers( appCodec, keys[sudotypes.StoreKey], ) - app.InflationKeeper = inflationkeeper.NewKeeper( - appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, - ) - app.EpochsKeeper.SetHooks( epochstypes.NewMultiEpochHooks( - app.InflationKeeper.Hooks(), app.OracleKeeper.Hooks(), ), ) @@ -567,7 +556,6 @@ func (app *NibiruApp) initAppModules( // Nibiru modules oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper, app.SudoKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), - inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.stakingKeeper), sudo.NewAppModule(appCodec, app.SudoKeeper), genmsg.NewAppModule(app.MsgServiceRouter()), @@ -634,7 +622,6 @@ func orderedModuleNames() []string { // Native x/ Modules epochstypes.ModuleName, oracletypes.ModuleName, - inflationtypes.ModuleName, sudotypes.ModuleName, // -------------------------------------------------------------------- @@ -748,7 +735,6 @@ func ModuleBasicManager() module.BasicManager { // native x/ oracle.AppModuleBasic{}, epochs.AppModuleBasic{}, - inflation.AppModuleBasic{}, sudo.AppModuleBasic{}, wasm.AppModuleBasic{}, devgas.AppModuleBasic{}, @@ -760,16 +746,14 @@ func ModuleBasicManager() module.BasicManager { func ModuleAccPerms() map[string][]string { return map[string][]string{ - authtypes.FeeCollectorName: nil, - distrtypes.ModuleName: nil, - inflationtypes.ModuleName: {authtypes.Minter}, - stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, - stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, - govtypes.ModuleName: {authtypes.Burner}, - oracletypes.ModuleName: {}, - ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, - ibcfeetypes.ModuleName: {}, - + authtypes.FeeCollectorName: nil, + distrtypes.ModuleName: nil, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + govtypes.ModuleName: {authtypes.Burner}, + oracletypes.ModuleName: {}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + ibcfeetypes.ModuleName: {}, epochstypes.ModuleName: {}, sudotypes.ModuleName: {}, common.TreasuryPoolModuleAccount: {}, @@ -794,7 +778,6 @@ func initParamsKeeper( paramsKeeper.Subspace(crisistypes.ModuleName) // Nibiru core params keepers | x/ paramsKeeper.Subspace(epochstypes.ModuleName) - paramsKeeper.Subspace(inflationtypes.ModuleName) // ibc params keepers paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibcexported.ModuleName) diff --git a/proto/nibiru/inflation/v1/genesis.proto b/proto/nibiru/inflation/v1/genesis.proto deleted file mode 100644 index 6eacf44c4..000000000 --- a/proto/nibiru/inflation/v1/genesis.proto +++ /dev/null @@ -1,36 +0,0 @@ -syntax = "proto3"; - -package nibiru.inflation.v1; - -import "gogoproto/gogo.proto"; -import "nibiru/inflation/v1/inflation.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; - -// GenesisState defines the inflation module's genesis state. -message GenesisState { - // params defines all the parameters of the module. - Params params = 1 [ (gogoproto.nullable) = false ]; - // period is the amount of past periods, based on the epochs per period param - uint64 period = 2; - // skipped_epochs is the number of epochs that have passed while inflation is - // disabled - uint64 skipped_epochs = 3; -} - -// Params holds parameters for the inflation module. -message Params { - // inflation_enabled is the parameter that enables inflation and halts - // increasing the skipped_epochs - bool inflation_enabled = 1; - // exponential_calculation takes in the variables to calculate exponential - // inflation - ExponentialCalculation exponential_calculation = 2 - [ (gogoproto.nullable) = false ]; - // inflation_distribution of the minted denom - InflationDistribution inflation_distribution = 3 - [ (gogoproto.nullable) = false ]; - // epochs_per_period is the number of epochs that must pass before a new - // period is created - uint64 epochs_per_period = 4; -} diff --git a/proto/nibiru/inflation/v1/inflation.proto b/proto/nibiru/inflation/v1/inflation.proto deleted file mode 100644 index ca900bb9e..000000000 --- a/proto/nibiru/inflation/v1/inflation.proto +++ /dev/null @@ -1,52 +0,0 @@ -syntax = "proto3"; -package nibiru.inflation.v1; - -import "gogoproto/gogo.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; - -// InflationDistribution defines the distribution in which inflation is -// allocated through minting on each epoch (staking, community, strategic). It -// excludes the team vesting distribution. -message InflationDistribution { - // staking_rewards defines the proportion of the minted_denom that is - // to be allocated as staking rewards - string staking_rewards = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // community_pool defines the proportion of the minted_denom that is to - // be allocated to the community pool - string community_pool = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // strategic_reserves defines the proportion of the minted_denom that - // is to be allocated to the strategic reserves module address - string strategic_reserves = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// ExponentialCalculation holds factors to calculate exponential inflation on -// each period. Calculation reference: -// periodProvision = exponentialDecay -// f(x) = a * (1 - r) ^ x + c -message ExponentialCalculation { - // a defines the initial value - string a = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // r defines the reduction factor - string r = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; - // c defines the parameter for long term inflation - string c = 3 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} diff --git a/proto/nibiru/inflation/v1/query.proto b/proto/nibiru/inflation/v1/query.proto deleted file mode 100644 index e7b6ec57a..000000000 --- a/proto/nibiru/inflation/v1/query.proto +++ /dev/null @@ -1,119 +0,0 @@ -syntax = "proto3"; -package nibiru.inflation.v1; - -import "cosmos/base/v1beta1/coin.proto"; -import "nibiru/inflation/v1/genesis.proto"; -import "gogoproto/gogo.proto"; -import "google/api/annotations.proto"; - -option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; - -// Query provides defines the gRPC querier service. -service Query { - // Period retrieves current period. - rpc Period(QueryPeriodRequest) returns (QueryPeriodResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/period"; - } - - // EpochMintProvision retrieves current minting epoch provision value. - rpc EpochMintProvision(QueryEpochMintProvisionRequest) - returns (QueryEpochMintProvisionResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/epoch_mint_provision"; - } - - // SkippedEpochs retrieves the total number of skipped epochs. - rpc SkippedEpochs(QuerySkippedEpochsRequest) - returns (QuerySkippedEpochsResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/skipped_epochs"; - } - - // CirculatingSupply retrieves the total number of tokens that are in - // circulation (i.e. excluding unvested tokens). - rpc CirculatingSupply(QueryCirculatingSupplyRequest) - returns (QueryCirculatingSupplyResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/circulating_supply"; - } - - // InflationRate retrieves the inflation rate of the current period. - rpc InflationRate(QueryInflationRateRequest) - returns (QueryInflationRateResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/inflation_rate"; - } - - // Params retrieves the total set of minting parameters. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/nibiru/inflation/v1/params"; - } -} - -// QueryPeriodRequest is the request type for the Query/Period RPC method. -message QueryPeriodRequest {} - -// QueryPeriodResponse is the response type for the Query/Period RPC method. -message QueryPeriodResponse { - // period is the current minting per epoch provision value. - uint64 period = 1; -} - -// QueryEpochMintProvisionRequest is the request type for the -// Query/EpochMintProvision RPC method. -message QueryEpochMintProvisionRequest {} - -// QueryEpochMintProvisionResponse is the response type for the -// Query/EpochMintProvision RPC method. -message QueryEpochMintProvisionResponse { - // epoch_mint_provision is the current minting per epoch provision value. - cosmos.base.v1beta1.DecCoin epoch_mint_provision = 1 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins" - ]; -} - -// QuerySkippedEpochsRequest is the request type for the Query/SkippedEpochs RPC -// method. -message QuerySkippedEpochsRequest {} - -// QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs -// RPC method. -message QuerySkippedEpochsResponse { - // skipped_epochs is the number of epochs that the inflation module has been - // disabled. - uint64 skipped_epochs = 1; -} - -// QueryCirculatingSupplyRequest is the request type for the -// Query/CirculatingSupply RPC method. -message QueryCirculatingSupplyRequest {} - -// QueryCirculatingSupplyResponse is the response type for the -// Query/CirculatingSupply RPC method. -message QueryCirculatingSupplyResponse { - // circulating_supply is the total amount of coins in circulation - cosmos.base.v1beta1.DecCoin circulating_supply = 1 [ - (gogoproto.nullable) = false, - (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.DecCoins" - ]; -} - -// QueryInflationRateRequest is the request type for the Query/InflationRate RPC -// method. -message QueryInflationRateRequest {} - -// QueryInflationRateResponse is the response type for the Query/InflationRate -// RPC method. -message QueryInflationRateResponse { - // inflation_rate by which the total supply increases within one period - string inflation_rate = 1 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", - (gogoproto.nullable) = false - ]; -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - nibiru.inflation.v1.Params params = 1 [ (gogoproto.nullable) = false ]; -} diff --git a/wasmbinding/stargate_query.go b/wasmbinding/stargate_query.go index b8de0e43b..059f777cf 100644 --- a/wasmbinding/stargate_query.go +++ b/wasmbinding/stargate_query.go @@ -5,7 +5,6 @@ import ( devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" epochs "github.com/NibiruChain/nibiru/x/epochs/types" - inflation "github.com/NibiruChain/nibiru/x/inflation/types" oracle "github.com/NibiruChain/nibiru/x/oracle/types" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" @@ -110,13 +109,14 @@ func WasmAcceptedStargateQueries() wasmkeeper.AcceptedStargateQueries { "/nibiru.epochs.v1.Query/EpochInfos": new(epochs.QueryEpochInfosResponse), "/nibiru.epochs.v1.Query/CurrentEpoch": new(epochs.QueryCurrentEpochResponse), + // TODO: for post v1 // nibiru inflation - "/nibiru.inflation.v1.Query/Period": new(inflation.QueryPeriodResponse), - "/nibiru.inflation.v1.Query/EpochMintProvision": new(inflation.QueryEpochMintProvisionResponse), - "/nibiru.inflation.v1.Query/SkippedEpochs": new(inflation.QuerySkippedEpochsResponse), - "/nibiru.inflation.v1.Query/CirculatingSupply": new(inflation.QueryCirculatingSupplyResponse), - "/nibiru.inflation.v1.Query/InflationRate": new(inflation.QueryInflationRateResponse), - "/nibiru.inflation.v1.Query/Params": new(inflation.QueryParamsResponse), + // "/nibiru.inflation.v1.Query/Period": new(inflation.QueryPeriodResponse), + // "/nibiru.inflation.v1.Query/EpochMintProvision": new(inflation.QueryEpochMintProvisionResponse), + // "/nibiru.inflation.v1.Query/SkippedEpochs": new(inflation.QuerySkippedEpochsResponse), + // "/nibiru.inflation.v1.Query/CirculatingSupply": new(inflation.QueryCirculatingSupplyResponse), + // "/nibiru.inflation.v1.Query/InflationRate": new(inflation.QueryInflationRateResponse), + // "/nibiru.inflation.v1.Query/Params": new(inflation.QueryParamsResponse), // nibiru oracle "/nibiru.oracle.v1.Query/ExchangeRate": new(oracle.QueryExchangeRateResponse), diff --git a/wasmbinding/stargate_query_test.go b/wasmbinding/stargate_query_test.go index e809753ae..3a06723f3 100644 --- a/wasmbinding/stargate_query_test.go +++ b/wasmbinding/stargate_query_test.go @@ -15,7 +15,6 @@ import ( devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" epochs "github.com/NibiruChain/nibiru/x/epochs/types" - inflation "github.com/NibiruChain/nibiru/x/inflation/types" oracle "github.com/NibiruChain/nibiru/x/oracle/types" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" @@ -41,7 +40,6 @@ func TestWasmAcceptedStargateQueries(t *testing.T) { queryServiceDescriptions := []grpc.ServiceDesc{ epochs.GrpcQueryServiceDesc(), devgas.GrpcQueryServiceDesc(), - inflation.GrpcQueryServiceDesc(), oracle.GrpcQueryServiceDesc(), sudotypes.GrpcQueryServiceDesc(), tokenfactory.GrpcQueryServiceDesc(), diff --git a/x/common/testutil/action/account.go b/x/common/testutil/action/account.go index 2cfb74291..d681ae9e6 100644 --- a/x/common/testutil/action/account.go +++ b/x/common/testutil/action/account.go @@ -4,7 +4,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/NibiruChain/nibiru/app" - inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" + tokenfactorytypes "github.com/NibiruChain/nibiru/x/tokenfactory/types" ) type fundAccount struct { @@ -17,12 +17,12 @@ func FundAccount(account sdk.AccAddress, amount sdk.Coins) Action { } func (c fundAccount) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, c.Amount) + err := app.BankKeeper.MintCoins(ctx, tokenfactorytypes.ModuleName, c.Amount) if err != nil { return ctx, err, true } - err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, inflationtypes.ModuleName, c.Account, c.Amount) + err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, tokenfactorytypes.ModuleName, c.Account, c.Amount) if err != nil { return ctx, err, true } @@ -40,12 +40,12 @@ func FundModule(module string, amount sdk.Coins) Action { } func (c fundModule) Do(app *app.NibiruApp, ctx sdk.Context) (sdk.Context, error, bool) { - err := app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, c.Amount) + err := app.BankKeeper.MintCoins(ctx, tokenfactorytypes.ModuleName, c.Amount) if err != nil { return ctx, err, true } - err = app.BankKeeper.SendCoinsFromModuleToModule(ctx, inflationtypes.ModuleName, c.Module, c.Amount) + err = app.BankKeeper.SendCoinsFromModuleToModule(ctx, tokenfactorytypes.ModuleName, c.Module, c.Amount) if err != nil { return ctx, err, true } diff --git a/x/common/testutil/testapp/testapp.go b/x/common/testutil/testapp/testapp.go index 360b549d1..63912c1a3 100644 --- a/x/common/testutil/testapp/testapp.go +++ b/x/common/testutil/testapp/testapp.go @@ -16,14 +16,14 @@ import ( "github.com/NibiruChain/nibiru/x/common/asset" "github.com/NibiruChain/nibiru/x/common/denoms" epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" + tokenfactorytypes "github.com/NibiruChain/nibiru/x/tokenfactory/types" ) // NewNibiruTestAppAndContext creates an 'app.NibiruApp' instance with an // in-memory 'tmdb.MemDB' and fresh 'sdk.Context'. func NewNibiruTestAppAndContext() (*app.NibiruApp, sdk.Context) { encoding := app.MakeEncodingConfig() - var appGenesis = app.NewDefaultGenesisState(encoding.Marshaler) + appGenesis := app.NewDefaultGenesisState(encoding.Marshaler) genModEpochs := epochstypes.DefaultGenesisFromTime(time.Now().UTC()) appGenesis[epochstypes.ModuleName] = encoding.Marshaler.MustMarshalJSON( genModEpochs, @@ -94,11 +94,11 @@ func FundAccount( bankKeeper bankkeeper.Keeper, ctx sdk.Context, addr sdk.AccAddress, amounts sdk.Coins, ) error { - if err := bankKeeper.MintCoins(ctx, inflationtypes.ModuleName, amounts); err != nil { + if err := bankKeeper.MintCoins(ctx, tokenfactorytypes.ModuleName, amounts); err != nil { return err } - return bankKeeper.SendCoinsFromModuleToAccount(ctx, inflationtypes.ModuleName, addr, amounts) + return bankKeeper.SendCoinsFromModuleToAccount(ctx, tokenfactorytypes.ModuleName, addr, amounts) } // FundModuleAccount is a utility function that funds a module account by @@ -108,11 +108,11 @@ func FundModuleAccount( bankKeeper bankkeeper.Keeper, ctx sdk.Context, recipientMod string, amounts sdk.Coins, ) error { - if err := bankKeeper.MintCoins(ctx, inflationtypes.ModuleName, amounts); err != nil { + if err := bankKeeper.MintCoins(ctx, tokenfactorytypes.ModuleName, amounts); err != nil { return err } - return bankKeeper.SendCoinsFromModuleToModule(ctx, inflationtypes.ModuleName, recipientMod, amounts) + return bankKeeper.SendCoinsFromModuleToModule(ctx, tokenfactorytypes.ModuleName, recipientMod, amounts) } // EnsureNibiruPrefix sets the account address prefix to Nibiru's rather than diff --git a/x/inflation/client/cli/query.go b/x/inflation/client/cli/query.go deleted file mode 100644 index 53db6f67c..000000000 --- a/x/inflation/client/cli/query.go +++ /dev/null @@ -1,213 +0,0 @@ -package cli - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// GetQueryCmd returns the cli query commands for the inflation module. -func GetQueryCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: types.ModuleName, - Short: "Querying commands for the inflation module", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - GetPeriod(), - GetEpochMintProvision(), - GetSkippedEpochs(), - GetCirculatingSupply(), - GetInflationRate(), - GetParams(), - ) - - return cmd -} - -// GetPeriod implements a command to return the current inflation -// period -func GetPeriod() *cobra.Command { - cmd := &cobra.Command{ - Use: "period", - Short: "Query the current inflation period", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - params := &types.QueryPeriodRequest{} - res, err := queryClient.Period(context.Background(), params) - if err != nil { - return err - } - - return clientCtx.PrintString(fmt.Sprintf("%v\n", res.Period)) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetEpochMintProvision implements a command to return the current inflation -// epoch provisions value. -func GetEpochMintProvision() *cobra.Command { - cmd := &cobra.Command{ - Use: "epoch-mint-provision", - Short: "Query the current inflation epoch provisions value", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryEpochMintProvisionRequest{} - res, err := queryClient.EpochMintProvision(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintString(fmt.Sprintf("%s\n", res.EpochMintProvision)) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetSkippedEpochs implements a command to return the current inflation -// period -func GetSkippedEpochs() *cobra.Command { - cmd := &cobra.Command{ - Use: "skipped-epochs", - Short: "Query the current number of skipped epochs", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QuerySkippedEpochsRequest{} - res, err := queryClient.SkippedEpochs(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintString(fmt.Sprintf("%v\n", res.SkippedEpochs)) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetCirculatingSupply implements a command to return the current circulating supply -func GetCirculatingSupply() *cobra.Command { - cmd := &cobra.Command{ - Use: "circulating-supply", - Short: "Query the current supply of tokens in circulation", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryCirculatingSupplyRequest{} - res, err := queryClient.CirculatingSupply(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintString(fmt.Sprintf("%s\n", res.CirculatingSupply)) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetInflationRate implements a command to return the inflation rate in % -func GetInflationRate() *cobra.Command { - cmd := &cobra.Command{ - Use: "inflation-rate", - Short: "Query the inflation rate of the current period", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryInflationRateRequest{} - res, err := queryClient.InflationRate(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintString(fmt.Sprintf("%s%%\n", res.InflationRate)) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} - -// GetParams implements a command to return the current inflation -// parameters. -func GetParams() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "Query the current inflation parameters", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryParamsRequest{} - res, err := queryClient.Params(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintProto(&res.Params) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - - return cmd -} diff --git a/x/inflation/genesis.go b/x/inflation/genesis.go deleted file mode 100644 index 0424a7fdb..000000000 --- a/x/inflation/genesis.go +++ /dev/null @@ -1,40 +0,0 @@ -package inflation - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/inflation/keeper" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// InitGenesis import module genesis -func InitGenesis( - ctx sdk.Context, - k keeper.Keeper, - ak types.AccountKeeper, - _ types.StakingKeeper, - data types.GenesisState, -) { - // Ensure inflation module account is set on genesis - if acc := ak.GetModuleAccount(ctx, types.ModuleName); acc == nil { - panic("the inflation module account has not been set") - } - - // Set genesis state - k.SetParams(ctx, data.Params) - - period := data.Period - k.CurrentPeriod.Set(ctx, period) - - skippedEpochs := data.SkippedEpochs - k.NumSkippedEpochs.Set(ctx, skippedEpochs) -} - -// ExportGenesis returns a GenesisState for a given context and keeper. -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - return &types.GenesisState{ - Params: k.GetParams(ctx), - Period: k.CurrentPeriod.Peek(ctx), - SkippedEpochs: k.NumSkippedEpochs.Peek(ctx), - } -} diff --git a/x/inflation/keeper/grpc_query.go b/x/inflation/keeper/grpc_query.go deleted file mode 100644 index 395c7db7e..000000000 --- a/x/inflation/keeper/grpc_query.go +++ /dev/null @@ -1,78 +0,0 @@ -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -var _ types.QueryServer = Keeper{} - -// Period returns the current period of the inflation module. -func (k Keeper) Period( - c context.Context, - _ *types.QueryPeriodRequest, -) (*types.QueryPeriodResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - period := k.CurrentPeriod.Peek(ctx) - return &types.QueryPeriodResponse{Period: period}, nil -} - -// EpochMintProvision returns the EpochMintProvision of the inflation module. -func (k Keeper) EpochMintProvision( - c context.Context, - _ *types.QueryEpochMintProvisionRequest, -) (*types.QueryEpochMintProvisionResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - epochMintProvision := k.GetEpochMintProvision(ctx) - coin := sdk.NewDecCoinFromDec(denoms.NIBI, epochMintProvision) - return &types.QueryEpochMintProvisionResponse{EpochMintProvision: coin}, nil -} - -// SkippedEpochs returns the number of skipped Epochs of the inflation module. -func (k Keeper) SkippedEpochs( - c context.Context, - _ *types.QuerySkippedEpochsRequest, -) (*types.QuerySkippedEpochsResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - skippedEpochs := k.NumSkippedEpochs.Peek(ctx) - return &types.QuerySkippedEpochsResponse{SkippedEpochs: skippedEpochs}, nil -} - -// InflationRate returns the inflation rate for the current period. -func (k Keeper) InflationRate( - c context.Context, - _ *types.QueryInflationRateRequest, -) (*types.QueryInflationRateResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - inflationRate := k.GetInflationRate(ctx, denoms.NIBI) - return &types.QueryInflationRateResponse{InflationRate: inflationRate}, nil -} - -// CirculatingSupply returns the total supply in circulation excluding the team -// allocation in the first year -func (k Keeper) CirculatingSupply( - c context.Context, - _ *types.QueryCirculatingSupplyRequest, -) (*types.QueryCirculatingSupplyResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - - circulatingSupply := k.GetCirculatingSupply(ctx, denoms.NIBI) - circulatingToDec := sdk.NewDecFromInt(circulatingSupply) - coin := sdk.NewDecCoinFromDec(denoms.NIBI, circulatingToDec) - - return &types.QueryCirculatingSupplyResponse{CirculatingSupply: coin}, nil -} - -// Params returns params of the mint module. -func (k Keeper) Params( - c context.Context, - _ *types.QueryParamsRequest, -) (*types.QueryParamsResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - params := k.GetParams(ctx) - return &types.QueryParamsResponse{Params: params}, nil -} diff --git a/x/inflation/keeper/grpc_query_test.go b/x/inflation/keeper/grpc_query_test.go deleted file mode 100644 index ae75a09d2..000000000 --- a/x/inflation/keeper/grpc_query_test.go +++ /dev/null @@ -1,103 +0,0 @@ -package keeper_test - -import ( - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - - inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" -) - -type QueryServerSuite struct { - suite.Suite - - nibiruApp *app.NibiruApp - ctx sdk.Context -} - -func (s *QueryServerSuite) SetupSuite() { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - s.nibiruApp = nibiruApp - s.ctx = ctx -} - -func TestSuite_QueryServerSuite_RunAll(t *testing.T) { - suite.Run(t, new(QueryServerSuite)) -} - -func (s *QueryServerSuite) TestQueryPeriod() { - nibiruApp, ctx := s.nibiruApp, s.ctx - - resp, err := nibiruApp.InflationKeeper.Period( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryPeriodRequest{}, - ) - - s.NoError(err) - s.Assert().Equal(uint64(0), resp.Period) - - nibiruApp.InflationKeeper.CurrentPeriod.Next(ctx) - - resp, err = nibiruApp.InflationKeeper.Period( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryPeriodRequest{}, - ) - s.NoError(err) - s.Assert().Equal(uint64(1), resp.Period) -} - -func (s *QueryServerSuite) TestQuerySkippedEpochs() { - nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.SkippedEpochs( - sdk.WrapSDKContext(ctx), &inflationtypes.QuerySkippedEpochsRequest{}, - ) - - s.Require().NoError(err) - s.Assert().Equal(uint64(0), resp.SkippedEpochs) - - nibiruApp.InflationKeeper.NumSkippedEpochs.Next(ctx) - - resp, err = nibiruApp.InflationKeeper.SkippedEpochs( - sdk.WrapSDKContext(ctx), &inflationtypes.QuerySkippedEpochsRequest{}, - ) - s.NoError(err) - s.Assert().Equal(uint64(1), resp.SkippedEpochs) -} - -func (s *QueryServerSuite) TestQueryEpochMintProvision() { - nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.EpochMintProvision( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryEpochMintProvisionRequest{}, - ) - s.NoError(err) - s.NotNil(resp) -} - -func (s *QueryServerSuite) TestQueryInflationRate() { - nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.InflationRate( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryInflationRateRequest{}, - ) - s.NoError(err) - s.NotNil(resp) -} - -func (s *QueryServerSuite) TestQueryCirculatingSupply() { - nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.CirculatingSupply( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryCirculatingSupplyRequest{}, - ) - s.NoError(err) - s.NotNil(resp) -} - -func (s *QueryServerSuite) TestQueryParams() { - nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.Params( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryParamsRequest{}, - ) - s.NoError(err) - s.NotNil(resp) -} diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go deleted file mode 100644 index 0299a0cfa..000000000 --- a/x/inflation/keeper/hooks.go +++ /dev/null @@ -1,154 +0,0 @@ -package keeper - -import ( - "fmt" - - "github.com/armon/go-metrics" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/denoms" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// BeforeEpochStart: noop, We don't need to do anything here -func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} - -// AfterEpochEnd mints and allocates coins at the end of each epoch end -func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - if epochIdentifier != epochstypes.DayEpochID { - return - } - - params := k.GetParams(ctx) - - // Skip inflation if it is disabled and increment number of skipped epochs - if !params.InflationEnabled { - prevSkippedEpochs := k.NumSkippedEpochs.Next(ctx) - - k.Logger(ctx).Debug( - "skipping inflation mint and allocation", - "height", ctx.BlockHeight(), - "epoch-id", epochIdentifier, - "epoch-number", epochNumber, - "skipped-epochs", prevSkippedEpochs+1, - ) - return - } - - // mint coins, update supply - period := k.CurrentPeriod.Peek(ctx) - epochsPerPeriod := k.EpochsPerPeriod(ctx) - - epochMintProvision := types.CalculateEpochMintProvision( - params, - period, - ) - - if !epochMintProvision.IsPositive() { - k.Logger(ctx).Error( - "SKIPPING INFLATION: negative epoch mint provision", - "value", epochMintProvision.String(), - ) - return - } - - mintedCoin := sdk.Coin{ - Denom: denoms.NIBI, - Amount: epochMintProvision.TruncateInt(), - } - - staking, strategic, communityPool, err := k.MintAndAllocateInflation(ctx, mintedCoin, params) - if err != nil { - k.Logger(ctx).Error( - "SKIPPING INFLATION: failed to mint and allocate inflation", - "error", err, - ) - return - } - - // If period is passed, update the period. A period is - // passed if the current epoch number surpasses the epochsPerPeriod for the - // current period. Skipped epochs are subtracted to only account for epochs - // where inflation minted tokens. - // - // Examples: - // Given, epochNumber = 1, period = 0, epochPerPeriod = 365, skippedEpochs = 0 - // => 1 - 365 * 0 - 0 < 365 --- nothing to do here - // Given, epochNumber = 741, period = 1, epochPerPeriod = 365, skippedEpochs = 10 - // => 741 - 1 * 365 - 10 > 365 --- a period has passed! we set a new period - peek := k.NumSkippedEpochs.Peek(ctx) - if int64(epochNumber)- - int64(epochsPerPeriod*period)- - int64(peek) > int64(epochsPerPeriod) { - k.CurrentPeriod.Next(ctx) - } - - defer func() { - stakingAmt := staking.Amount - strategicAmt := strategic.Amount - cpAmt := communityPool.Amount - - if mintedCoin.Amount.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "allocate", "total"}, - float32(mintedCoin.Amount.Int64()), - []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, - ) - } - if stakingAmt.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "allocate", "staking", "total"}, - float32(stakingAmt.Int64()), - []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, - ) - } - if strategicAmt.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "allocate", "strategic", "total"}, - float32(strategicAmt.Int64()), - []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, - ) - } - if cpAmt.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "allocate", "community_pool", "total"}, - float32(cpAmt.Int64()), - []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, - ) - } - }() - - ctx.EventManager().EmitEvent( - sdk.NewEvent( - types.EventTypeMint, - sdk.NewAttribute(types.AttributeEpochNumber, fmt.Sprintf("%d", epochNumber)), - sdk.NewAttribute(types.AttributeKeyEpochProvisions, epochMintProvision.String()), - sdk.NewAttribute(sdk.AttributeKeyAmount, mintedCoin.Amount.String()), - ), - ) -} - -// ___________________________________________________________________________________________________ - -// Hooks wrapper struct for inflation keeper -type Hooks struct { - k Keeper -} - -var _ epochstypes.EpochHooks = Hooks{} - -// Return the wrapper struct -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// epochs hooks -func (h Hooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.BeforeEpochStart(ctx, epochIdentifier, epochNumber) -} - -func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.AfterEpochEnd(ctx, epochIdentifier, epochNumber) -} diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go deleted file mode 100644 index 97ccd310f..000000000 --- a/x/inflation/keeper/hooks_test.go +++ /dev/null @@ -1,192 +0,0 @@ -package keeper_test - -import ( - "fmt" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -func TestEpochIdentifierAfterEpochEnd(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - - feePoolOld := nibiruApp.DistrKeeper.GetFeePool(ctx) - nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, 1) - feePoolNew := nibiruApp.DistrKeeper.GetFeePool(ctx) - - require.Greater(t, feePoolNew.CommunityPool.AmountOf(denoms.NIBI).BigInt().Uint64(), - feePoolOld.CommunityPool.AmountOf(denoms.NIBI).BigInt().Uint64()) -} - -func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - currentEpochPeriod := nibiruApp.InflationKeeper.EpochsPerPeriod(ctx) - - testCases := []struct { - name string - currentPeriod uint64 - height uint64 - epochIdentifier string - skippedEpochs uint64 - InflationEnabled bool - periodChanges bool - }{ - { - "SkippedEpoch set DayEpochID disabledInflation", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - false, - false, - }, - { - "SkippedEpoch set WeekEpochID disabledInflation ", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.WeekEpochID, - 0, - false, - false, - }, - { - "[Period 0] disabledInflation", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - false, - false, - }, - { - "[Period 0] period stays the same under epochs per period", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - true, - false, - }, - { - "[Period 0] period changes once enough epochs have passed", - 0, - currentEpochPeriod + 1, - epochstypes.DayEpochID, - 0, - true, - true, - }, - { - "[Period 1] period stays the same under the epoch per period", - 1, - 2*currentEpochPeriod - 1, - epochstypes.DayEpochID, - 0, - true, - false, - }, - { - "[Period 1] period changes once enough epochs have passed", - 1, - 2*currentEpochPeriod + 1, - epochstypes.DayEpochID, - 0, - true, - true, - }, - { - "[Period 0] with skipped epochs - period stays the same under epochs per period", - 0, - currentEpochPeriod - 1, - epochstypes.DayEpochID, - 10, - true, - false, - }, - { - "[Period 0] with skipped epochs - period stays the same under epochs per period", - 0, - currentEpochPeriod + 1, - epochstypes.DayEpochID, - 10, - true, - false, - }, - { - "[Period 0] with skipped epochs - period changes once enough epochs have passed", - 0, - currentEpochPeriod + 11, - epochstypes.DayEpochID, - 10, - true, - true, - }, - { - "[Period 1] with skipped epochs - period stays the same under epochs per period", - 1, - 2*currentEpochPeriod + 1, - epochstypes.DayEpochID, - 10, - true, - false, - }, - { - "[Period 1] with skipped epochs - period changes once enough epochs have passed", - 1, - 2*currentEpochPeriod + 11, - epochstypes.DayEpochID, - 10, - true, - true, - }, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - params := nibiruApp.InflationKeeper.GetParams(ctx) - params.InflationEnabled = tc.InflationEnabled - nibiruApp.InflationKeeper.SetParams(ctx, params) - - nibiruApp.InflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) - nibiruApp.InflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) - - currentSkippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) - currentPeriod := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) - originalProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) - - // Perform Epoch Hooks - futureCtx := ctx.WithBlockTime(time.Now().Add(time.Minute)) - nibiruApp.EpochsKeeper.BeforeEpochStart(futureCtx, tc.epochIdentifier, tc.height) - nibiruApp.EpochsKeeper.AfterEpochEnd(futureCtx, tc.epochIdentifier, tc.height) - - skippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) - period := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) - - if tc.periodChanges { - newProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) - expectedProvision := types.CalculateEpochMintProvision( - nibiruApp.InflationKeeper.GetParams(ctx), - period, - ) - require.Equal(t, expectedProvision, newProvision) - // mint provisions will change - require.NotEqual(t, newProvision.BigInt().Uint64(), originalProvision.BigInt().Uint64()) - require.Equal(t, currentSkippedEpochs, skippedEpochs) - require.Equal(t, currentPeriod+1, period) - } else { - require.Equal(t, currentPeriod, period) - if !tc.InflationEnabled { - // Check for epochIdentifier for skippedEpoch increment - if tc.epochIdentifier == epochstypes.DayEpochID { - require.Equal(t, currentSkippedEpochs+1, skippedEpochs) - } - } - } - }) - } -} diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go deleted file mode 100644 index ab9355b67..000000000 --- a/x/inflation/keeper/inflation.go +++ /dev/null @@ -1,140 +0,0 @@ -package keeper - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// MintAndAllocateInflation performs inflation minting and allocation -func (k Keeper) MintAndAllocateInflation( - ctx sdk.Context, - coins sdk.Coin, - params types.Params, -) ( - staking, strategic, community sdk.Coin, - err error, -) { - // skip as no coins need to be minted - if coins.Amount.IsNil() || !coins.Amount.IsPositive() { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil - } - - // Mint coins for distribution - if err := k.MintCoins(ctx, coins); err != nil { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err - } - - // Allocate minted coins according to allocation proportions (staking, strategic, community pool) - return k.AllocateExponentialInflation(ctx, coins, params) -} - -// MintCoins implements an alias call to the underlying supply keeper's -// MintCoins to be used in BeginBlocker. -func (k Keeper) MintCoins(ctx sdk.Context, coin sdk.Coin) error { - coins := sdk.Coins{coin} - return k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) -} - -// AllocateExponentialInflation allocates coins from the inflation to external -// modules according to allocation proportions: -// - staking rewards -> sdk `auth` module fee collector -// - strategic reserves -> root account of x/sudo module -// - community pool -> `sdk `distr` module community pool -func (k Keeper) AllocateExponentialInflation( - ctx sdk.Context, - mintedCoin sdk.Coin, - params types.Params, -) ( - staking, strategic, community sdk.Coin, - err error, -) { - inflationDistribution := params.InflationDistribution - inflationModuleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) - // Allocate staking rewards into fee collector account - staking = k.GetProportions(ctx, mintedCoin, inflationDistribution.StakingRewards) - - if err := k.bankKeeper.SendCoinsFromModuleToModule( - ctx, - types.ModuleName, - k.feeCollectorName, - sdk.NewCoins(staking), - ); err != nil { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err - } - - // Allocate community pool rewards into community pool - community = k.GetProportions(ctx, mintedCoin, inflationDistribution.CommunityPool) - - if err = k.distrKeeper.FundCommunityPool( - ctx, - sdk.NewCoins(community), - inflationModuleAddr, - ); err != nil { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err - } - - // Remaining balance is strategic reserve allocation to the root account of the x/sudo module - strategic = k.bankKeeper.GetBalance(ctx, inflationModuleAddr, denoms.NIBI) - strategicAccountAddr, err := k.sudoKeeper.GetRoot(ctx) - if err != nil { - k.Logger(ctx).Error("get root account error", "error", err) - return staking, strategic, community, nil - } - - if err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic)); err != nil { - k.Logger(ctx).Error("send coins to root account error", "error", err) - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil - } - - return staking, strategic, community, nil -} - -// GetAllocationProportion calculates the proportion of coins that is to be -// allocated during inflation for a given distribution. -func (k Keeper) GetProportions( - _ sdk.Context, - coin sdk.Coin, - proportion sdk.Dec, -) sdk.Coin { - return sdk.Coin{ - Denom: coin.Denom, - Amount: sdk.NewDecFromInt(coin.Amount).Mul(proportion).TruncateInt(), - } -} - -// GetCirculatingSupply returns the bank supply of the mintDenom excluding the -// team allocation in the first year -func (k Keeper) GetCirculatingSupply(ctx sdk.Context, mintDenom string) sdkmath.Int { - return k.bankKeeper.GetSupply(ctx, mintDenom).Amount -} - -// GetInflationRate returns the inflation rate for the current period. -func (k Keeper) GetInflationRate(ctx sdk.Context, mintDenom string) sdk.Dec { - epochMintProvision := k.GetEpochMintProvision(ctx) - if epochMintProvision.IsZero() { - return sdk.ZeroDec() - } - - circulatingSupply := k.GetCirculatingSupply(ctx, mintDenom) - if circulatingSupply.IsZero() { - return sdk.ZeroDec() - } - - // EpochMintProvision * 365 / circulatingSupply * 100 - circulatingSupplyToDec := sdk.NewDecFromInt(circulatingSupply) - return epochMintProvision.MulInt64(int64(k.EpochsPerPeriod(ctx))).Quo(circulatingSupplyToDec).Mul(sdk.NewDec(100)) -} - -// GetEpochMintProvision retrieves necessary params KV storage -// and calculate EpochMintProvision -func (k Keeper) GetEpochMintProvision(ctx sdk.Context) sdk.Dec { - peek := k.CurrentPeriod.Peek(ctx) - - return types.CalculateEpochMintProvision( - k.GetParams(ctx), - peek, - ) -} diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go deleted file mode 100644 index 103e6d721..000000000 --- a/x/inflation/keeper/inflation_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package keeper_test - -import ( - "fmt" - "testing" - - sdkmath "cosmossdk.io/math" - - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/app" - "github.com/NibiruChain/nibiru/x/common/denoms" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/inflation/types" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" -) - -func init() { - testapp.EnsureNibiruPrefix() -} - -func TestMintAndAllocateInflation(t *testing.T) { - testCases := []struct { - name string - coinsToMint sdk.Coin - expectedStakingAmt sdk.Coin - expectedStrategicAmt sdk.Coin - expectedCommunityAmt sdk.Coin - expectedStakingRewardsBalance sdk.Coin - expectedStrategicReservesBalance sdk.Coin - expectedCommunityPoolBalance sdk.DecCoins - rootAccount string - }{ - { - name: "pass", - coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), - rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", - }, - { - name: "pass - no coins minted ", - coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - expectedStakingAmt: sdk.Coin{}, - expectedStrategicAmt: sdk.Coin{}, - expectedCommunityAmt: sdk.Coin{}, - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), - expectedCommunityPoolBalance: nil, - rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", - }, - { - name: "pass - no root account", - coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), - rootAccount: "", - }, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - - if tc.rootAccount != "" { - t.Logf("setting root account to %s", tc.rootAccount) - nibiruApp.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ - Root: sdk.MustAccAddressFromBech32(tc.rootAccount).String(), - Contracts: []string{}, - }) - } - - staking, strategic, community, err := nibiruApp.InflationKeeper.MintAndAllocateInflation(ctx, tc.coinsToMint, types.DefaultParams()) - require.NoError(t, err) - assert.Equal(t, tc.expectedStakingAmt, staking) - assert.Equal(t, tc.expectedStrategicAmt, strategic) - assert.Equal(t, tc.expectedCommunityAmt, community) - - // Get balances - var balanceStrategicReserve sdk.Coin - if tc.rootAccount != "" { - strategicAccount, err := nibiruApp.SudoKeeper.GetRoot(ctx) - require.NoError(t, err) - balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance( - ctx, - strategicAccount, - denoms.NIBI, - ) - } else { - // if no root account is specified, then the strategic reserve remains in the x/inflation module account - balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance(ctx, nibiruApp.AccountKeeper.GetModuleAddress(types.ModuleName), denoms.NIBI) - } - - balanceStakingRewards := nibiruApp.BankKeeper.GetBalance( - ctx, - nibiruApp.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName), - denoms.NIBI, - ) - - balanceCommunityPool := nibiruApp.DistrKeeper.GetFeePoolCommunityCoins(ctx) - - require.NoError(t, err, tc.name) - assert.Equal(t, tc.expectedStakingRewardsBalance, balanceStakingRewards) - assert.Equal(t, tc.expectedStrategicReservesBalance, balanceStrategicReserve) - assert.Equal(t, tc.expectedCommunityPoolBalance, balanceCommunityPool) - }) - } -} - -func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { - testCases := []struct { - name string - supply sdkmath.Int - malleate func(nibiruApp *app.NibiruApp, ctx sdk.Context) - expInflationRate sdk.Dec - }{ - { - "no epochs per period", - sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), - func(nibiruApp *app.NibiruApp, ctx sdk.Context) { - nibiruApp.InflationKeeper.SetParams(ctx, types.Params{ - EpochsPerPeriod: 0, - InflationEnabled: true, - ExponentialCalculation: types.DefaultExponentialCalculation, - InflationDistribution: types.DefaultInflationDistribution, - }) - }, - sdk.ZeroDec(), - }, - { - "high supply", - sdk.TokensFromConsensusPower(800_000_000, sdk.DefaultPowerReduction), - func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, - sdk.MustNewDecFromStr("50.674438476562500000"), - }, - { - "low supply", - sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), - func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, - sdk.MustNewDecFromStr("101.348876953125000000"), - }, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - - tc.malleate(nibiruApp, ctx) - - // Mint coins to increase supply - coin := sdk.NewCoin( - denoms.NIBI, - tc.supply, - ) - err := nibiruApp.InflationKeeper.MintCoins(ctx, coin) - require.NoError(t, err) - - circulatingSupply := nibiruApp.InflationKeeper.GetCirculatingSupply(ctx, denoms.NIBI) - require.EqualValues(t, tc.supply, circulatingSupply) - - inflationRate := nibiruApp.InflationKeeper.GetInflationRate(ctx, denoms.NIBI) - require.Equal(t, tc.expInflationRate, inflationRate) - }) - } -} - -func TestGetters(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - k := nibiruApp.InflationKeeper - require.NotPanics(t, func() { - _ = k.ExponentialCalculation(ctx) - _ = k.InflationDistribution(ctx) - _ = k.InflationEnabled(ctx) - _ = k.EpochsPerPeriod(ctx) - }) -} diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go deleted file mode 100644 index b9172322e..000000000 --- a/x/inflation/keeper/keeper.go +++ /dev/null @@ -1,72 +0,0 @@ -package keeper - -import ( - "github.com/NibiruChain/collections" - "github.com/cometbft/cometbft/libs/log" - "github.com/cosmos/cosmos-sdk/codec" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// Keeper of the inflation store -type Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - paramSpace paramstypes.Subspace - - // the address capable of executing a MsgUpdateParams message. Typically, this should be the x/gov module account. - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistrKeeper - stakingKeeper types.StakingKeeper - sudoKeeper types.SudoKeeper - feeCollectorName string - - CurrentPeriod collections.Sequence - NumSkippedEpochs collections.Sequence -} - -// NewKeeper creates a new mint Keeper instance -func NewKeeper( - cdc codec.BinaryCodec, - storeKey storetypes.StoreKey, - paramspace paramstypes.Subspace, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distributionKeeper types.DistrKeeper, - stakingKeeper types.StakingKeeper, - sudoKeeper types.SudoKeeper, - feeCollectorName string, -) Keeper { - // ensure mint module account is set - if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { - panic("the inflation module account has not been set") - } - - // set KeyTable if it has not already been set - if !paramspace.HasKeyTable() { - paramspace = paramspace.WithKeyTable(types.ParamKeyTable()) - } - - return Keeper{ - storeKey: storeKey, - cdc: cdc, - paramSpace: paramspace, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - distrKeeper: distributionKeeper, - stakingKeeper: stakingKeeper, - sudoKeeper: sudoKeeper, - feeCollectorName: feeCollectorName, - CurrentPeriod: collections.NewSequence(storeKey, 0), - NumSkippedEpochs: collections.NewSequence(storeKey, 1), - } -} - -// Logger returns a module-specific logger. -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", "x/"+types.ModuleName) -} diff --git a/x/inflation/keeper/params.go b/x/inflation/keeper/params.go deleted file mode 100644 index 7b8b2ce0b..000000000 --- a/x/inflation/keeper/params.go +++ /dev/null @@ -1,41 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// GetParams returns the total set of inflation parameters. -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramSpace.GetParamSet(ctx, ¶ms) - return -} - -// SetParams sets the inflation params in a single key -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramSpace.SetParamSet(ctx, ¶ms) -} - -// VotePeriod returns the number of blocks during which voting takes place. -func (k Keeper) ExponentialCalculation(ctx sdk.Context) (res types.ExponentialCalculation) { - k.paramSpace.Get(ctx, types.KeyExponentialCalculation, &res) - return -} - -// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. -func (k Keeper) InflationDistribution(ctx sdk.Context) (res types.InflationDistribution) { - k.paramSpace.Get(ctx, types.KeyInflationDistribution, &res) - return -} - -// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. -func (k Keeper) InflationEnabled(ctx sdk.Context) (res bool) { - k.paramSpace.Get(ctx, types.KeyInflationEnabled, &res) - return -} - -func (k Keeper) EpochsPerPeriod(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeyEpochsPerPeriod, &res) - return -} diff --git a/x/inflation/module.go b/x/inflation/module.go deleted file mode 100644 index c21b4682b..000000000 --- a/x/inflation/module.go +++ /dev/null @@ -1,171 +0,0 @@ -package inflation - -import ( - "context" - "encoding/json" - "fmt" - - abci "github.com/cometbft/cometbft/abci/types" - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - - "github.com/NibiruChain/nibiru/x/inflation/client/cli" - "github.com/NibiruChain/nibiru/x/inflation/keeper" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -// type check to ensure the interface is properly implemented -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} - _ module.AppModuleSimulation = AppModule{} -) - -// app module Basics object -type AppModuleBasic struct{} - -// Name returns the inflation module's name. -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -// RegisterLegacyAminoCodec registers the inflation module's types on the given LegacyAmino codec. -func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - // types.RegisterLegacyAminoCodec(cdc) -} - -// ConsensusVersion returns the consensus state-breaking version for the module. -func (AppModuleBasic) ConsensusVersion() uint64 { - return 1 -} - -// RegisterInterfaces registers interfaces and implementations of the inflation -// module. -func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { -} - -// DefaultGenesis returns default genesis state as raw bytes for the inflation -// module. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesisState()) -} - -// ValidateGenesis performs genesis state validation for the inflation module. -func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { - var genesisState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genesisState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - - return genesisState.Validate() -} - -// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the inflation module. -func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { - if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the root tx command for the inflation module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } - -// GetQueryCmd returns no root query command for the inflation module. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() -} - -// ___________________________________________________________________________ - -// AppModule implements an application module for the inflation module. -type AppModule struct { - AppModuleBasic - keeper keeper.Keeper - ak authkeeper.AccountKeeper - sk stakingkeeper.Keeper -} - -// NewAppModule creates a new AppModule Object -func NewAppModule( - k keeper.Keeper, - ak authkeeper.AccountKeeper, - sk stakingkeeper.Keeper, -) AppModule { - return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, - ak: ak, - sk: sk, - } -} - -// Name returns the inflation module's name. -func (AppModule) Name() string { - return types.ModuleName -} - -// RegisterInvariants registers the inflation module invariants. -func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} - -// RegisterServices registers a gRPC query service to respond to the -// module-specific gRPC queries. -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterQueryServer(cfg.QueryServer(), am.keeper) -} - -// BeginBlock returns the begin blocker for the inflation module. -func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) { -} - -// EndBlock returns the end blocker for the inflation module. It returns no validator -// updates. -func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} - -// InitGenesis performs genesis initialization for the inflation module. It returns -// no validator updates. -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState types.GenesisState - - cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, am.ak, am.sk, genesisState) - return []abci.ValidatorUpdate{} -} - -// ExportGenesis returns the exported genesis state as raw bytes for the inflation -// module. -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(gs) -} - -// ___________________________________________________________________________ - -// AppModuleSimulation functions - -// GenerateGenesisState creates a randomized GenState of the inflation module. -func (am AppModule) GenerateGenesisState(_ *module.SimulationState) { -} - -// ProposalContents doesn't return any content functions for governance proposals. -func (am AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { - return []simtypes.WeightedProposalMsg{} -} - -// RegisterStoreDecoder registers a decoder for inflation module's types. -func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { -} - -// WeightedOperations doesn't return any inflation module operation. -func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { - return []simtypes.WeightedOperation{} -} diff --git a/x/inflation/types/events.go b/x/inflation/types/events.go deleted file mode 100644 index 5f6374c54..000000000 --- a/x/inflation/types/events.go +++ /dev/null @@ -1,9 +0,0 @@ -package types - -// Minting module event types -const ( - EventTypeMint = ModuleName - - AttributeKeyEpochProvisions = "epoch_provisions" - AttributeEpochNumber = "epoch_number" -) diff --git a/x/inflation/types/export.go b/x/inflation/types/export.go deleted file mode 100644 index fb4b6e3b6..000000000 --- a/x/inflation/types/export.go +++ /dev/null @@ -1,12 +0,0 @@ -package types - -import ( - grpc "google.golang.org/grpc" -) - -// GrpcQueryServiceDesc represents the query server's RPC service specification. -// This gives access to the service name and method names needed for stargate -// queries. -func GrpcQueryServiceDesc() grpc.ServiceDesc { - return _Query_serviceDesc -} diff --git a/x/inflation/types/genesis.go b/x/inflation/types/genesis.go deleted file mode 100644 index e85896bfa..000000000 --- a/x/inflation/types/genesis.go +++ /dev/null @@ -1,37 +0,0 @@ -package types - -// NewGenesisState creates a new GenesisState object -func NewGenesisState( - params Params, - period uint64, - skippedEpochs uint64, -) GenesisState { - return GenesisState{ - Params: params, - Period: period, - SkippedEpochs: skippedEpochs, - } -} - -// DefaultGenesisState creates a default GenesisState object -func DefaultGenesisState() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - Period: 0, - SkippedEpochs: 0, - } -} - -// Validate performs basic genesis state validation returning an error upon any -// failure. -func (gs GenesisState) Validate() error { - if err := validateUint64(gs.SkippedEpochs); err != nil { - return err - } - - if err := validateUint64(gs.Period); err != nil { - return err - } - - return gs.Params.Validate() -} diff --git a/x/inflation/types/genesis.pb.go b/x/inflation/types/genesis.pb.go deleted file mode 100644 index c008f5889..000000000 --- a/x/inflation/types/genesis.pb.go +++ /dev/null @@ -1,715 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/inflation/v1/genesis.proto - -package types - -import ( - fmt "fmt" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the inflation module's genesis state. -type GenesisState struct { - // params defines all the parameters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` - // period is the amount of past periods, based on the epochs per period param - Period uint64 `protobuf:"varint,2,opt,name=period,proto3" json:"period,omitempty"` - // skipped_epochs is the number of epochs that have passed while inflation is - // disabled - SkippedEpochs uint64 `protobuf:"varint,3,opt,name=skipped_epochs,json=skippedEpochs,proto3" json:"skipped_epochs,omitempty"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_2d00e2bb98c08f74, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func (m *GenesisState) GetPeriod() uint64 { - if m != nil { - return m.Period - } - return 0 -} - -func (m *GenesisState) GetSkippedEpochs() uint64 { - if m != nil { - return m.SkippedEpochs - } - return 0 -} - -// Params holds parameters for the inflation module. -type Params struct { - // inflation_enabled is the parameter that enables inflation and halts - // increasing the skipped_epochs - InflationEnabled bool `protobuf:"varint,1,opt,name=inflation_enabled,json=inflationEnabled,proto3" json:"inflation_enabled,omitempty"` - // exponential_calculation takes in the variables to calculate exponential - // inflation - ExponentialCalculation ExponentialCalculation `protobuf:"bytes,2,opt,name=exponential_calculation,json=exponentialCalculation,proto3" json:"exponential_calculation"` - // inflation_distribution of the minted denom - InflationDistribution InflationDistribution `protobuf:"bytes,3,opt,name=inflation_distribution,json=inflationDistribution,proto3" json:"inflation_distribution"` - // epochs_per_period is the number of epochs that must pass before a new - // period is created - EpochsPerPeriod uint64 `protobuf:"varint,4,opt,name=epochs_per_period,json=epochsPerPeriod,proto3" json:"epochs_per_period,omitempty"` -} - -func (m *Params) Reset() { *m = Params{} } -func (m *Params) String() string { return proto.CompactTextString(m) } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_2d00e2bb98c08f74, []int{1} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetInflationEnabled() bool { - if m != nil { - return m.InflationEnabled - } - return false -} - -func (m *Params) GetExponentialCalculation() ExponentialCalculation { - if m != nil { - return m.ExponentialCalculation - } - return ExponentialCalculation{} -} - -func (m *Params) GetInflationDistribution() InflationDistribution { - if m != nil { - return m.InflationDistribution - } - return InflationDistribution{} -} - -func (m *Params) GetEpochsPerPeriod() uint64 { - if m != nil { - return m.EpochsPerPeriod - } - return 0 -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "nibiru.inflation.v1.GenesisState") - proto.RegisterType((*Params)(nil), "nibiru.inflation.v1.Params") -} - -func init() { proto.RegisterFile("nibiru/inflation/v1/genesis.proto", fileDescriptor_2d00e2bb98c08f74) } - -var fileDescriptor_2d00e2bb98c08f74 = []byte{ - // 375 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4d, 0x4f, 0xfa, 0x30, - 0x1c, 0xde, 0x80, 0x2c, 0xff, 0x94, 0xbf, 0x2f, 0x54, 0x45, 0x82, 0xc9, 0x44, 0x8c, 0x09, 0x81, - 0x64, 0x0b, 0x78, 0xf2, 0x0a, 0x12, 0xc3, 0xc5, 0x10, 0xbc, 0x79, 0x59, 0xba, 0xad, 0x8e, 0xea, - 0x68, 0x9b, 0xad, 0x23, 0xf8, 0x0d, 0x3c, 0xfa, 0x69, 0xfc, 0x0c, 0x1c, 0x39, 0x7a, 0x32, 0x06, - 0xbe, 0x88, 0xb1, 0x9d, 0x8c, 0xc3, 0x6e, 0xed, 0xf3, 0xd2, 0xe7, 0xe9, 0x2f, 0x3f, 0x70, 0x41, - 0x89, 0x4b, 0xa2, 0xc4, 0x26, 0xf4, 0x29, 0x44, 0x82, 0x30, 0x6a, 0xcf, 0xbb, 0x76, 0x80, 0x29, - 0x8e, 0x49, 0x6c, 0xf1, 0x88, 0x09, 0x06, 0x8f, 0x94, 0xc4, 0xda, 0x4a, 0xac, 0x79, 0xb7, 0x7e, - 0x1c, 0xb0, 0x80, 0x49, 0xde, 0xfe, 0x3d, 0x29, 0x69, 0xfd, 0x32, 0xef, 0xb5, 0xcc, 0x27, 0x45, - 0xcd, 0x37, 0x1d, 0xfc, 0xbf, 0x53, 0x09, 0x0f, 0x02, 0x09, 0x0c, 0x6f, 0x80, 0xc1, 0x51, 0x84, - 0x66, 0x71, 0x4d, 0x6f, 0xe8, 0xad, 0x72, 0xef, 0xcc, 0xca, 0x49, 0xb4, 0xc6, 0x52, 0xd2, 0x2f, - 0x2d, 0xbf, 0xce, 0xb5, 0x49, 0x6a, 0x80, 0x55, 0x60, 0x70, 0x1c, 0x11, 0xe6, 0xd7, 0x0a, 0x0d, - 0xbd, 0x55, 0x9a, 0xa4, 0x37, 0x78, 0x05, 0xf6, 0xe3, 0x17, 0xc2, 0x39, 0xf6, 0x1d, 0xcc, 0x99, - 0x37, 0x8d, 0x6b, 0x45, 0xc9, 0xef, 0xa5, 0xe8, 0x50, 0x82, 0xcd, 0x8f, 0x02, 0x30, 0xd4, 0xbb, - 0xb0, 0x03, 0x2a, 0xdb, 0x38, 0x07, 0x53, 0xe4, 0x86, 0xd8, 0x97, 0x7d, 0xfe, 0x4d, 0x0e, 0xb7, - 0xc4, 0x50, 0xe1, 0xf0, 0x19, 0x9c, 0xe2, 0x05, 0x67, 0x14, 0x53, 0x41, 0x50, 0xe8, 0x78, 0x28, - 0xf4, 0x12, 0xa5, 0x90, 0x3d, 0xca, 0xbd, 0x4e, 0xee, 0x17, 0x86, 0x99, 0x67, 0x90, 0x59, 0xd2, - 0x2f, 0x55, 0x71, 0x2e, 0x0b, 0x03, 0x50, 0xcd, 0x8a, 0xf9, 0x24, 0x16, 0x11, 0x71, 0x13, 0x19, - 0x55, 0x94, 0x51, 0xed, 0xdc, 0xa8, 0xd1, 0xdf, 0xe5, 0x76, 0xc7, 0x91, 0x26, 0x9d, 0x90, 0x3c, - 0x12, 0xb6, 0x41, 0x45, 0xcd, 0xca, 0xe1, 0x38, 0x72, 0xd2, 0xb1, 0x96, 0xe4, 0xd8, 0x0e, 0x14, - 0x31, 0xc6, 0xd1, 0x58, 0xc2, 0xfd, 0xd1, 0x72, 0x6d, 0xea, 0xab, 0xb5, 0xa9, 0x7f, 0xaf, 0x4d, - 0xfd, 0x7d, 0x63, 0x6a, 0xab, 0x8d, 0xa9, 0x7d, 0x6e, 0x4c, 0xed, 0xd1, 0x0e, 0x88, 0x98, 0x26, - 0xae, 0xe5, 0xb1, 0x99, 0x7d, 0x2f, 0x8b, 0x0d, 0xa6, 0x88, 0x50, 0x3b, 0xdd, 0x8c, 0xc5, 0xce, - 0x6e, 0x88, 0x57, 0x8e, 0x63, 0xd7, 0x90, 0x5b, 0x71, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0xb4, - 0xdb, 0xd9, 0x20, 0x8a, 0x02, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.SkippedEpochs != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.SkippedEpochs)) - i-- - dAtA[i] = 0x18 - } - if m.Period != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.Period)) - i-- - dAtA[i] = 0x10 - } - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.EpochsPerPeriod != 0 { - i = encodeVarintGenesis(dAtA, i, uint64(m.EpochsPerPeriod)) - i-- - dAtA[i] = 0x20 - } - { - size, err := m.InflationDistribution.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.ExponentialCalculation.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.InflationEnabled { - i-- - if m.InflationEnabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.Period != 0 { - n += 1 + sovGenesis(uint64(m.Period)) - } - if m.SkippedEpochs != 0 { - n += 1 + sovGenesis(uint64(m.SkippedEpochs)) - } - return n -} - -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.InflationEnabled { - n += 2 - } - l = m.ExponentialCalculation.Size() - n += 1 + l + sovGenesis(uint64(l)) - l = m.InflationDistribution.Size() - n += 1 + l + sovGenesis(uint64(l)) - if m.EpochsPerPeriod != 0 { - n += 1 + sovGenesis(uint64(m.EpochsPerPeriod)) - } - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType) - } - m.Period = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Period |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SkippedEpochs", wireType) - } - m.SkippedEpochs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SkippedEpochs |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field InflationEnabled", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.InflationEnabled = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExponentialCalculation", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ExponentialCalculation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InflationDistribution", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InflationDistribution.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EpochsPerPeriod", wireType) - } - m.EpochsPerPeriod = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EpochsPerPeriod |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/inflation/types/genesis_test.go b/x/inflation/types/genesis_test.go deleted file mode 100644 index 1c89d6d15..000000000 --- a/x/inflation/types/genesis_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package types - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestValidateGenesis(t *testing.T) { - // Team Address needs to be set manually at Genesis - validParams := DefaultParams() - - newGen := NewGenesisState(validParams, 0, 0) - - testCases := []struct { - name string - genState *GenesisState - expPass bool - }{ - { - "empty genesis", - &GenesisState{}, - false, - }, - { - "invalid default genesis", - DefaultGenesisState(), - true, - }, - { - "valid genesis constructor", - &newGen, - true, - }, - { - "valid genesis", - &GenesisState{ - Params: validParams, - Period: 5, - SkippedEpochs: 0, - }, - true, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.genState.Validate() - if tc.expPass { - require.NoError(t, err, tc.name) - } else { - require.Error(t, err, tc.name) - } - }) - } -} diff --git a/x/inflation/types/inflation.pb.go b/x/inflation/types/inflation.pb.go deleted file mode 100644 index ecc0666b3..000000000 --- a/x/inflation/types/inflation.pb.go +++ /dev/null @@ -1,695 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/inflation/v1/inflation.proto - -package types - -import ( - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - proto "github.com/cosmos/gogoproto/proto" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// InflationDistribution defines the distribution in which inflation is -// allocated through minting on each epoch (staking, community, strategic). It -// excludes the team vesting distribution. -type InflationDistribution struct { - // staking_rewards defines the proportion of the minted_denom that is - // to be allocated as staking rewards - StakingRewards github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=staking_rewards,json=stakingRewards,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"staking_rewards"` - // community_pool defines the proportion of the minted_denom that is to - // be allocated to the community pool - CommunityPool github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=community_pool,json=communityPool,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"community_pool"` - // strategic_reserves defines the proportion of the minted_denom that - // is to be allocated to the strategic reserves module address - StrategicReserves github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=strategic_reserves,json=strategicReserves,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"strategic_reserves"` -} - -func (m *InflationDistribution) Reset() { *m = InflationDistribution{} } -func (m *InflationDistribution) String() string { return proto.CompactTextString(m) } -func (*InflationDistribution) ProtoMessage() {} -func (*InflationDistribution) Descriptor() ([]byte, []int) { - return fileDescriptor_37da805e9a324a97, []int{0} -} -func (m *InflationDistribution) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *InflationDistribution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_InflationDistribution.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *InflationDistribution) XXX_Merge(src proto.Message) { - xxx_messageInfo_InflationDistribution.Merge(m, src) -} -func (m *InflationDistribution) XXX_Size() int { - return m.Size() -} -func (m *InflationDistribution) XXX_DiscardUnknown() { - xxx_messageInfo_InflationDistribution.DiscardUnknown(m) -} - -var xxx_messageInfo_InflationDistribution proto.InternalMessageInfo - -// ExponentialCalculation holds factors to calculate exponential inflation on -// each period. Calculation reference: -// periodProvision = exponentialDecay -// f(x) = a * (1 - r) ^ x + c -type ExponentialCalculation struct { - // a defines the initial value - A github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=a,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"a"` - // r defines the reduction factor - R github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=r,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"r"` - // c defines the parameter for long term inflation - C github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=c,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"c"` -} - -func (m *ExponentialCalculation) Reset() { *m = ExponentialCalculation{} } -func (m *ExponentialCalculation) String() string { return proto.CompactTextString(m) } -func (*ExponentialCalculation) ProtoMessage() {} -func (*ExponentialCalculation) Descriptor() ([]byte, []int) { - return fileDescriptor_37da805e9a324a97, []int{1} -} -func (m *ExponentialCalculation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ExponentialCalculation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ExponentialCalculation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ExponentialCalculation) XXX_Merge(src proto.Message) { - xxx_messageInfo_ExponentialCalculation.Merge(m, src) -} -func (m *ExponentialCalculation) XXX_Size() int { - return m.Size() -} -func (m *ExponentialCalculation) XXX_DiscardUnknown() { - xxx_messageInfo_ExponentialCalculation.DiscardUnknown(m) -} - -var xxx_messageInfo_ExponentialCalculation proto.InternalMessageInfo - -func init() { - proto.RegisterType((*InflationDistribution)(nil), "nibiru.inflation.v1.InflationDistribution") - proto.RegisterType((*ExponentialCalculation)(nil), "nibiru.inflation.v1.ExponentialCalculation") -} - -func init() { - proto.RegisterFile("nibiru/inflation/v1/inflation.proto", fileDescriptor_37da805e9a324a97) -} - -var fileDescriptor_37da805e9a324a97 = []byte{ - // 329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0xcd, 0x4a, 0x3b, 0x31, - 0x14, 0xc5, 0x27, 0xfd, 0xc3, 0x1f, 0x0c, 0x58, 0x71, 0xfc, 0xa0, 0xb8, 0x48, 0xa5, 0x82, 0xb8, - 0x71, 0x42, 0x71, 0xeb, 0xaa, 0xad, 0x8b, 0x6e, 0x44, 0x0a, 0x22, 0x08, 0x52, 0x32, 0x69, 0x9c, - 0x86, 0xce, 0xe4, 0x0e, 0x49, 0xa6, 0xb6, 0x6f, 0xe1, 0x53, 0xf8, 0x2c, 0x5d, 0x16, 0x57, 0xe2, - 0xa2, 0x48, 0xe7, 0x45, 0x64, 0x3e, 0x6c, 0xbb, 0x9e, 0x55, 0x6e, 0x92, 0x73, 0x7e, 0x70, 0x0f, - 0x07, 0x5f, 0x28, 0xe9, 0x4b, 0x9d, 0x50, 0xa9, 0x5e, 0x43, 0x66, 0x25, 0x28, 0x3a, 0x6d, 0x6f, - 0x2f, 0x5e, 0xac, 0xc1, 0x82, 0x7b, 0x54, 0x88, 0xbc, 0xed, 0xfb, 0xb4, 0x7d, 0x76, 0x1c, 0x40, - 0x00, 0xf9, 0x3f, 0xcd, 0xa6, 0x42, 0xda, 0xfa, 0xa8, 0xe1, 0x93, 0xfe, 0x9f, 0xac, 0x27, 0x8d, - 0xd5, 0xd2, 0x4f, 0xb2, 0xd9, 0x7d, 0xc2, 0x07, 0xc6, 0xb2, 0x89, 0x54, 0xc1, 0x50, 0x8b, 0x37, - 0xa6, 0x47, 0xa6, 0x81, 0xce, 0xd1, 0xd5, 0x5e, 0xc7, 0x5b, 0xac, 0x9a, 0xce, 0xf7, 0xaa, 0x79, - 0x19, 0x48, 0x3b, 0x4e, 0x7c, 0x8f, 0x43, 0x44, 0x39, 0x98, 0x08, 0x4c, 0x79, 0x5c, 0x9b, 0xd1, - 0x84, 0xda, 0x79, 0x2c, 0x8c, 0xd7, 0x13, 0x7c, 0x50, 0x2f, 0x31, 0x83, 0x82, 0xe2, 0x3e, 0xe2, - 0x3a, 0x87, 0x28, 0x4a, 0x94, 0xb4, 0xf3, 0x61, 0x0c, 0x10, 0x36, 0x6a, 0x95, 0xb8, 0xfb, 0x1b, - 0xca, 0x03, 0x40, 0xe8, 0xbe, 0x60, 0xd7, 0x58, 0xcd, 0xac, 0x08, 0x24, 0x1f, 0x6a, 0x61, 0x84, - 0x9e, 0x0a, 0xd3, 0xf8, 0x57, 0x09, 0x7d, 0xb8, 0x21, 0x0d, 0x4a, 0x50, 0xeb, 0x13, 0xe1, 0xd3, - 0xbb, 0x59, 0x0c, 0x4a, 0x28, 0x2b, 0x59, 0xd8, 0x65, 0x21, 0x4f, 0x8a, 0xd4, 0xdc, 0x5b, 0x8c, - 0x58, 0xc5, 0x6c, 0x10, 0xcb, 0xdc, 0xba, 0x62, 0x02, 0x48, 0x67, 0x6e, 0x5e, 0x71, 0x49, 0xc4, - 0x3b, 0xfd, 0xc5, 0x9a, 0xa0, 0xe5, 0x9a, 0xa0, 0x9f, 0x35, 0x41, 0xef, 0x29, 0x71, 0x96, 0x29, - 0x71, 0xbe, 0x52, 0xe2, 0x3c, 0xd3, 0x1d, 0xc8, 0x7d, 0xde, 0xa6, 0xee, 0x98, 0x49, 0x45, 0xcb, - 0xfa, 0xcd, 0x76, 0x0a, 0x98, 0x13, 0xfd, 0xff, 0x79, 0x9f, 0x6e, 0x7e, 0x03, 0x00, 0x00, 0xff, - 0xff, 0xe0, 0x01, 0x1c, 0xb7, 0xa1, 0x02, 0x00, 0x00, -} - -func (m *InflationDistribution) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *InflationDistribution) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *InflationDistribution) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.StrategicReserves.Size() - i -= size - if _, err := m.StrategicReserves.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.CommunityPool.Size() - i -= size - if _, err := m.CommunityPool.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.StakingRewards.Size() - i -= size - if _, err := m.StakingRewards.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *ExponentialCalculation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ExponentialCalculation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ExponentialCalculation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.C.Size() - i -= size - if _, err := m.C.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size := m.R.Size() - i -= size - if _, err := m.R.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size := m.A.Size() - i -= size - if _, err := m.A.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintInflation(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintInflation(dAtA []byte, offset int, v uint64) int { - offset -= sovInflation(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *InflationDistribution) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.StakingRewards.Size() - n += 1 + l + sovInflation(uint64(l)) - l = m.CommunityPool.Size() - n += 1 + l + sovInflation(uint64(l)) - l = m.StrategicReserves.Size() - n += 1 + l + sovInflation(uint64(l)) - return n -} - -func (m *ExponentialCalculation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.A.Size() - n += 1 + l + sovInflation(uint64(l)) - l = m.R.Size() - n += 1 + l + sovInflation(uint64(l)) - l = m.C.Size() - n += 1 + l + sovInflation(uint64(l)) - return n -} - -func sovInflation(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozInflation(x uint64) (n int) { - return sovInflation(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *InflationDistribution) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: InflationDistribution: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: InflationDistribution: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StakingRewards", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.StakingRewards.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommunityPool", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CommunityPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StrategicReserves", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.StrategicReserves.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipInflation(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthInflation - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ExponentialCalculation) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ExponentialCalculation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ExponentialCalculation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field A", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.A.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field R", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.R.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field C", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowInflation - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthInflation - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthInflation - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.C.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipInflation(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthInflation - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipInflation(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowInflation - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowInflation - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowInflation - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthInflation - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupInflation - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthInflation - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthInflation = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowInflation = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupInflation = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/inflation/types/inflation_calculation.go b/x/inflation/types/inflation_calculation.go deleted file mode 100644 index 9fa5e542f..000000000 --- a/x/inflation/types/inflation_calculation.go +++ /dev/null @@ -1,33 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// CalculateEpochProvisions returns mint provision per epoch -func CalculateEpochMintProvision( - params Params, - period uint64, -) sdk.Dec { - if params.EpochsPerPeriod == 0 { - return sdk.ZeroDec() - } - - x := period // period - a := params.ExponentialCalculation.A // initial value - r := params.ExponentialCalculation.R // reduction factor - c := params.ExponentialCalculation.C // long term inflation - - // exponentialDecay := a * (1 - r) ^ x + c - decay := sdk.OneDec().Sub(r) - periodProvision := a.Mul(decay.Power(x)).Add(c) - - // epochProvision = periodProvision / epochsPerPeriod - epochProvision := periodProvision.QuoInt64(int64(params.EpochsPerPeriod)) - - // Multiply epochMintProvision with power reduction (10^6 for unibi) as the - // calculation is based on `NIBI` and the issued tokens need to be given in - // `uNIBI` - epochProvision = epochProvision.MulInt(sdk.DefaultPowerReduction) - return epochProvision -} diff --git a/x/inflation/types/inflation_calculation_test.go b/x/inflation/types/inflation_calculation_test.go deleted file mode 100644 index 1b9b21ba8..000000000 --- a/x/inflation/types/inflation_calculation_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package types - -import ( - fmt "fmt" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" -) - -func TestCalculateEpochMintProvision(t *testing.T) { - testCases := []struct { - name string - period uint64 - expEpochProvision sdk.Dec - }{ - { - "pass - initial period", - 0, - sdk.MustNewDecFromStr("1110672624143.835616438356000000"), - }, - { - "pass - period 1", - 1, - sdk.MustNewDecFromStr("555878103595.890410958904000000"), - }, - { - "pass - period 2", - 2, - sdk.MustNewDecFromStr("278480843321.917808219178000000"), - }, - { - "pass - period 3", - 3, - sdk.MustNewDecFromStr("139782213184.931506849315000000"), - }, - { - "pass - period 4", - 4, - sdk.MustNewDecFromStr("70432898116.438356164383000000"), - }, - { - "pass - period 5", - 5, - sdk.MustNewDecFromStr("35758240582.191780821917000000"), - }, - { - "pass - period 6", - 6, - sdk.MustNewDecFromStr("18420911815.068493150684000000"), - }, - { - "pass - period 7", - 7, - sdk.MustNewDecFromStr("9752247431.506849315068000000"), - }, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - epochMintProvisions := CalculateEpochMintProvision( - DefaultParams(), - tc.period, - ) - - require.Equal(t, tc.expEpochProvision, epochMintProvisions) - }) - } -} - -func TestCalculateEpochMintProvision_ZeroEpochs(t *testing.T) { - params := DefaultParams() - params.EpochsPerPeriod = 0 - - epochMintProvisions := CalculateEpochMintProvision(params, 1) - require.Equal(t, epochMintProvisions, sdk.ZeroDec()) -} diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go deleted file mode 100644 index 17b3a362e..000000000 --- a/x/inflation/types/interfaces.go +++ /dev/null @@ -1,45 +0,0 @@ -package types // noalias - -import ( - sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/types" -) - -// AccountKeeper defines the contract required for account APIs. -type AccountKeeper interface { - GetModuleAddress(name string) sdk.AccAddress - GetModuleAccount(ctx sdk.Context, moduleName string) types.ModuleAccountI - GetAccount(sdk.Context, sdk.AccAddress) types.AccountI - SetAccount(sdk.Context, types.AccountI) -} - -// BankKeeper defines the contract needed to be fulfilled for banking and supply -// dependencies. -type BankKeeper interface { - GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin - GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error - SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error - MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error - BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error - HasSupply(ctx sdk.Context, denom string) bool - GetSupply(ctx sdk.Context, denom string) sdk.Coin -} - -// DistrKeeper defines the contract needed to be fulfilled for distribution keeper -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -// StakingKeeper expected staking keeper -type StakingKeeper interface { - // BondedRatio the fraction of the staking tokens which are currently bonded - BondedRatio(ctx sdk.Context) sdk.Dec - StakingTokenSupply(ctx sdk.Context) sdkmath.Int - TotalBondedTokens(ctx sdk.Context) sdkmath.Int -} - -type SudoKeeper interface { - GetRoot(ctx sdk.Context) (sdk.AccAddress, error) -} diff --git a/x/inflation/types/keys.go b/x/inflation/types/keys.go deleted file mode 100644 index 62bef8202..000000000 --- a/x/inflation/types/keys.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -// constants -const ( - // module name - ModuleName = "inflation" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey to be used for message routing - RouterKey = ModuleName -) diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go deleted file mode 100644 index f043f1eb1..000000000 --- a/x/inflation/types/params.go +++ /dev/null @@ -1,171 +0,0 @@ -package types - -import ( - "errors" - "fmt" - - sdk "github.com/cosmos/cosmos-sdk/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" -) - -var ( - KeyInflationEnabled = []byte("InflationEnabled") - KeyExponentialCalculation = []byte("ExponentialCalculation") - KeyInflationDistribution = []byte("InflationDistribution") - KeyEpochsPerPeriod = []byte("EpochsPerPeriod") -) - -var ( - DefaultInflation = true - DefaultExponentialCalculation = ExponentialCalculation{ - A: sdk.NewDec(int64(405_000_000)), - R: sdk.NewDecWithPrec(50, 2), // 50% - C: sdk.NewDecWithPrec(395_507_8125, 4), - } - DefaultInflationDistribution = InflationDistribution{ - StakingRewards: sdk.NewDecWithPrec(27_8, 3), // 27.8% - CommunityPool: sdk.NewDecWithPrec(62_20, 4), // 62.20% - StrategicReserves: sdk.NewDecWithPrec(10, 2), // 10% - } - DefaultEpochsPerPeriod = uint64(365) -) - -func NewParams( - exponentialCalculation ExponentialCalculation, - inflationDistribution InflationDistribution, - inflationEnabled bool, - epochsPerPeriod uint64, -) Params { - return Params{ - ExponentialCalculation: exponentialCalculation, - InflationDistribution: inflationDistribution, - InflationEnabled: inflationEnabled, - EpochsPerPeriod: epochsPerPeriod, - } -} - -// default minting module parameters -func DefaultParams() Params { - return Params{ - ExponentialCalculation: DefaultExponentialCalculation, - InflationDistribution: DefaultInflationDistribution, - InflationEnabled: DefaultInflation, - EpochsPerPeriod: DefaultEpochsPerPeriod, - } -} - -// ParamKeyTable returns the parameter key table. -func ParamKeyTable() paramstypes.KeyTable { - return paramstypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -var _ paramstypes.ParamSet = (*Params)(nil) - -// ParamSetPairs returns all the of key, value type, and validation function -// for each module parameter. ParamSetPairs implements the ParamSet interface. -func (p *Params) ParamSetPairs() paramstypes.ParamSetPairs { - return paramstypes.ParamSetPairs{ - paramstypes.NewParamSetPair(KeyInflationEnabled, &p.InflationEnabled, validateBool), - paramstypes.NewParamSetPair(KeyExponentialCalculation, &p.ExponentialCalculation, validateExponentialCalculation), - paramstypes.NewParamSetPair(KeyInflationDistribution, &p.InflationDistribution, validateInflationDistribution), - paramstypes.NewParamSetPair(KeyEpochsPerPeriod, &p.EpochsPerPeriod, validateUint64), - } -} - -func validateExponentialCalculation(i interface{}) error { - v, ok := i.(ExponentialCalculation) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - // validate initial value - if v.A.IsNegative() { - return fmt.Errorf("initial value cannot be negative") - } - - // validate reduction factor - if v.R.GT(sdk.OneDec()) { - return fmt.Errorf("reduction factor cannot be greater than 1") - } - - if v.R.IsNegative() { - return fmt.Errorf("reduction factor cannot be negative") - } - - // validate long term inflation - if v.C.IsNegative() { - return fmt.Errorf("long term inflation cannot be negative") - } - - return nil -} - -func validateInflationDistribution(i interface{}) error { - v, ok := i.(InflationDistribution) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if v.StakingRewards.IsNegative() { - return errors.New("staking distribution ratio must not be negative") - } - - if v.CommunityPool.IsNegative() { - return errors.New("community pool distribution ratio must not be negative") - } - - if v.StrategicReserves.IsNegative() { - return errors.New("pool incentives distribution ratio must not be negative") - } - - totalProportions := v.StakingRewards.Add(v.StrategicReserves).Add(v.CommunityPool) - if !totalProportions.Equal(sdk.OneDec()) { - return errors.New("total distributions ratio should be 1") - } - - return nil -} - -func validateBool(i interface{}) error { - _, ok := i.(bool) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateUint64(i interface{}) error { - _, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid genesis state type: %T", i) - } - return nil -} - -func validateEpochsPerPeriod(i interface{}) error { - val, ok := i.(uint64) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if val <= 0 { - return fmt.Errorf("epochs per period must be positive: %d", val) - } - - return nil -} - -func (p Params) Validate() error { - if err := validateEpochsPerPeriod(p.EpochsPerPeriod); err != nil { - return err - } - if err := validateExponentialCalculation(p.ExponentialCalculation); err != nil { - return err - } - if err := validateInflationDistribution(p.InflationDistribution); err != nil { - return err - } - - return validateBool(p.InflationEnabled) -} diff --git a/x/inflation/types/params_test.go b/x/inflation/types/params_test.go deleted file mode 100644 index 1dbadcef1..000000000 --- a/x/inflation/types/params_test.go +++ /dev/null @@ -1,208 +0,0 @@ -package types_test - -import ( - "testing" - - storetypes "github.com/cosmos/cosmos-sdk/store/types" - - "github.com/NibiruChain/nibiru/app/codec" - inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" -) - -func TestParamsValidate(t *testing.T) { - testCases := []struct { - name string - params inflationtypes.Params - expError bool - }{ - { - "default", - inflationtypes.DefaultParams(), - false, - }, - { - "valid", - inflationtypes.NewParams( - inflationtypes.DefaultExponentialCalculation, - inflationtypes.DefaultInflationDistribution, - true, - inflationtypes.DefaultEpochsPerPeriod, - ), - false, - }, - { - "valid param literal", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.DefaultExponentialCalculation, - InflationDistribution: inflationtypes.DefaultInflationDistribution, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - false, - }, - { - "invalid - exponential calculation - negative A", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.ExponentialCalculation{ - A: sdk.NewDec(int64(-1)), - R: sdk.NewDecWithPrec(5, 1), - C: sdk.NewDec(int64(9_375_000)), - }, - InflationDistribution: inflationtypes.DefaultInflationDistribution, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - exponential calculation - R greater than 1", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.ExponentialCalculation{ - A: sdk.NewDec(int64(300_000_000)), - R: sdk.NewDecWithPrec(5, 0), - C: sdk.NewDec(int64(9_375_000)), - }, - InflationDistribution: inflationtypes.DefaultInflationDistribution, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - exponential calculation - negative R", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.ExponentialCalculation{ - A: sdk.NewDec(int64(300_000_000)), - R: sdk.NewDecWithPrec(-5, 1), - C: sdk.NewDec(int64(9_375_000)), - }, - InflationDistribution: inflationtypes.DefaultInflationDistribution, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - exponential calculation - negative C", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.ExponentialCalculation{ - A: sdk.NewDec(int64(300_000_000)), - R: sdk.NewDecWithPrec(5, 1), - C: sdk.NewDec(int64(-9_375_000)), - }, - InflationDistribution: inflationtypes.DefaultInflationDistribution, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - inflation distribution - negative staking rewards", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.DefaultExponentialCalculation, - InflationDistribution: inflationtypes.InflationDistribution{ - StakingRewards: sdk.OneDec().Neg(), - CommunityPool: sdk.NewDecWithPrec(133333, 6), - StrategicReserves: sdk.NewDecWithPrec(333333, 6), - }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - inflation distribution - negative usage incentives", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.DefaultExponentialCalculation, - InflationDistribution: inflationtypes.InflationDistribution{ - StakingRewards: sdk.NewDecWithPrec(533334, 6), - CommunityPool: sdk.NewDecWithPrec(133333, 6), - StrategicReserves: sdk.OneDec().Neg(), - }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - inflation distribution - negative community pool rewards", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.DefaultExponentialCalculation, - InflationDistribution: inflationtypes.InflationDistribution{ - StakingRewards: sdk.NewDecWithPrec(533334, 6), - CommunityPool: sdk.OneDec().Neg(), - StrategicReserves: sdk.NewDecWithPrec(333333, 6), - }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - { - "invalid - inflation distribution - total distribution ratio unequal 1", - inflationtypes.Params{ - ExponentialCalculation: inflationtypes.DefaultExponentialCalculation, - InflationDistribution: inflationtypes.InflationDistribution{ - StakingRewards: sdk.NewDecWithPrec(533333, 6), - CommunityPool: sdk.NewDecWithPrec(133333, 6), - StrategicReserves: sdk.NewDecWithPrec(333333, 6), - }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - }, - true, - }, - } - - for _, tc := range testCases { - tc := tc - t.Run(tc.name, func(t *testing.T) { - err := tc.params.Validate() - - if tc.expError { - require.Error(t, err, tc.name) - } else { - require.NoError(t, err, tc.name) - } - }) - } -} - -type ParamKeyTableTestSuite struct { - suite.Suite -} - -func (s *ParamKeyTableTestSuite) TestParamKeyTable() { - encCfg := codec.MakeEncodingConfig() - cdc := encCfg.Marshaler - amino := encCfg.Amino - - storeKey := storetypes.NewKVStoreKey("mockStoreKey") - transientStoreKey := storetypes.NewTransientStoreKey("mockTransientKey") - - var keyTable paramstypes.KeyTable - s.Require().NotPanics(func() { - keyTable = inflationtypes.ParamKeyTable() - }) - s.Require().NotPanics(func() { - subspace := paramstypes.NewSubspace( - cdc, - amino, - storeKey, transientStoreKey, "inflationsubspace", - ) - subspace.WithKeyTable(keyTable) - }) -} - -func (s *ParamKeyTableTestSuite) TestParamSetPairs() { - s.NotPanics(func() { - moduleParams := inflationtypes.DefaultParams() - _ = moduleParams.ParamSetPairs() - }) -} diff --git a/x/inflation/types/query.pb.go b/x/inflation/types/query.pb.go deleted file mode 100644 index 4b15226dc..000000000 --- a/x/inflation/types/query.pb.go +++ /dev/null @@ -1,2191 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: nibiru/inflation/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" - _ "github.com/cosmos/gogoproto/gogoproto" - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryPeriodRequest is the request type for the Query/Period RPC method. -type QueryPeriodRequest struct { -} - -func (m *QueryPeriodRequest) Reset() { *m = QueryPeriodRequest{} } -func (m *QueryPeriodRequest) String() string { return proto.CompactTextString(m) } -func (*QueryPeriodRequest) ProtoMessage() {} -func (*QueryPeriodRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{0} -} -func (m *QueryPeriodRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPeriodRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPeriodRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPeriodRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPeriodRequest.Merge(m, src) -} -func (m *QueryPeriodRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryPeriodRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPeriodRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPeriodRequest proto.InternalMessageInfo - -// QueryPeriodResponse is the response type for the Query/Period RPC method. -type QueryPeriodResponse struct { - // period is the current minting per epoch provision value. - Period uint64 `protobuf:"varint,1,opt,name=period,proto3" json:"period,omitempty"` -} - -func (m *QueryPeriodResponse) Reset() { *m = QueryPeriodResponse{} } -func (m *QueryPeriodResponse) String() string { return proto.CompactTextString(m) } -func (*QueryPeriodResponse) ProtoMessage() {} -func (*QueryPeriodResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{1} -} -func (m *QueryPeriodResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryPeriodResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryPeriodResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryPeriodResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryPeriodResponse.Merge(m, src) -} -func (m *QueryPeriodResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryPeriodResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryPeriodResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryPeriodResponse proto.InternalMessageInfo - -func (m *QueryPeriodResponse) GetPeriod() uint64 { - if m != nil { - return m.Period - } - return 0 -} - -// QueryEpochMintProvisionRequest is the request type for the -// Query/EpochMintProvision RPC method. -type QueryEpochMintProvisionRequest struct { -} - -func (m *QueryEpochMintProvisionRequest) Reset() { *m = QueryEpochMintProvisionRequest{} } -func (m *QueryEpochMintProvisionRequest) String() string { return proto.CompactTextString(m) } -func (*QueryEpochMintProvisionRequest) ProtoMessage() {} -func (*QueryEpochMintProvisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{2} -} -func (m *QueryEpochMintProvisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryEpochMintProvisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryEpochMintProvisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryEpochMintProvisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochMintProvisionRequest.Merge(m, src) -} -func (m *QueryEpochMintProvisionRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryEpochMintProvisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochMintProvisionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryEpochMintProvisionRequest proto.InternalMessageInfo - -// QueryEpochMintProvisionResponse is the response type for the -// Query/EpochMintProvision RPC method. -type QueryEpochMintProvisionResponse struct { - // epoch_mint_provision is the current minting per epoch provision value. - EpochMintProvision types.DecCoin `protobuf:"bytes,1,opt,name=epoch_mint_provision,json=epochMintProvision,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"epoch_mint_provision"` -} - -func (m *QueryEpochMintProvisionResponse) Reset() { *m = QueryEpochMintProvisionResponse{} } -func (m *QueryEpochMintProvisionResponse) String() string { return proto.CompactTextString(m) } -func (*QueryEpochMintProvisionResponse) ProtoMessage() {} -func (*QueryEpochMintProvisionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{3} -} -func (m *QueryEpochMintProvisionResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryEpochMintProvisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryEpochMintProvisionResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryEpochMintProvisionResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryEpochMintProvisionResponse.Merge(m, src) -} -func (m *QueryEpochMintProvisionResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryEpochMintProvisionResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryEpochMintProvisionResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryEpochMintProvisionResponse proto.InternalMessageInfo - -func (m *QueryEpochMintProvisionResponse) GetEpochMintProvision() types.DecCoin { - if m != nil { - return m.EpochMintProvision - } - return types.DecCoin{} -} - -// QuerySkippedEpochsRequest is the request type for the Query/SkippedEpochs RPC -// method. -type QuerySkippedEpochsRequest struct { -} - -func (m *QuerySkippedEpochsRequest) Reset() { *m = QuerySkippedEpochsRequest{} } -func (m *QuerySkippedEpochsRequest) String() string { return proto.CompactTextString(m) } -func (*QuerySkippedEpochsRequest) ProtoMessage() {} -func (*QuerySkippedEpochsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{4} -} -func (m *QuerySkippedEpochsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySkippedEpochsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySkippedEpochsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySkippedEpochsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySkippedEpochsRequest.Merge(m, src) -} -func (m *QuerySkippedEpochsRequest) XXX_Size() int { - return m.Size() -} -func (m *QuerySkippedEpochsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySkippedEpochsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySkippedEpochsRequest proto.InternalMessageInfo - -// QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs -// RPC method. -type QuerySkippedEpochsResponse struct { - // skipped_epochs is the number of epochs that the inflation module has been - // disabled. - SkippedEpochs uint64 `protobuf:"varint,1,opt,name=skipped_epochs,json=skippedEpochs,proto3" json:"skipped_epochs,omitempty"` -} - -func (m *QuerySkippedEpochsResponse) Reset() { *m = QuerySkippedEpochsResponse{} } -func (m *QuerySkippedEpochsResponse) String() string { return proto.CompactTextString(m) } -func (*QuerySkippedEpochsResponse) ProtoMessage() {} -func (*QuerySkippedEpochsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{5} -} -func (m *QuerySkippedEpochsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QuerySkippedEpochsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QuerySkippedEpochsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QuerySkippedEpochsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuerySkippedEpochsResponse.Merge(m, src) -} -func (m *QuerySkippedEpochsResponse) XXX_Size() int { - return m.Size() -} -func (m *QuerySkippedEpochsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QuerySkippedEpochsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QuerySkippedEpochsResponse proto.InternalMessageInfo - -func (m *QuerySkippedEpochsResponse) GetSkippedEpochs() uint64 { - if m != nil { - return m.SkippedEpochs - } - return 0 -} - -// QueryCirculatingSupplyRequest is the request type for the -// Query/CirculatingSupply RPC method. -type QueryCirculatingSupplyRequest struct { -} - -func (m *QueryCirculatingSupplyRequest) Reset() { *m = QueryCirculatingSupplyRequest{} } -func (m *QueryCirculatingSupplyRequest) String() string { return proto.CompactTextString(m) } -func (*QueryCirculatingSupplyRequest) ProtoMessage() {} -func (*QueryCirculatingSupplyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{6} -} -func (m *QueryCirculatingSupplyRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryCirculatingSupplyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryCirculatingSupplyRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryCirculatingSupplyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryCirculatingSupplyRequest.Merge(m, src) -} -func (m *QueryCirculatingSupplyRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryCirculatingSupplyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryCirculatingSupplyRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryCirculatingSupplyRequest proto.InternalMessageInfo - -// QueryCirculatingSupplyResponse is the response type for the -// Query/CirculatingSupply RPC method. -type QueryCirculatingSupplyResponse struct { - // circulating_supply is the total amount of coins in circulation - CirculatingSupply types.DecCoin `protobuf:"bytes,1,opt,name=circulating_supply,json=circulatingSupply,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"circulating_supply"` -} - -func (m *QueryCirculatingSupplyResponse) Reset() { *m = QueryCirculatingSupplyResponse{} } -func (m *QueryCirculatingSupplyResponse) String() string { return proto.CompactTextString(m) } -func (*QueryCirculatingSupplyResponse) ProtoMessage() {} -func (*QueryCirculatingSupplyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{7} -} -func (m *QueryCirculatingSupplyResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryCirculatingSupplyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryCirculatingSupplyResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryCirculatingSupplyResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryCirculatingSupplyResponse.Merge(m, src) -} -func (m *QueryCirculatingSupplyResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryCirculatingSupplyResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryCirculatingSupplyResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryCirculatingSupplyResponse proto.InternalMessageInfo - -func (m *QueryCirculatingSupplyResponse) GetCirculatingSupply() types.DecCoin { - if m != nil { - return m.CirculatingSupply - } - return types.DecCoin{} -} - -// QueryInflationRateRequest is the request type for the Query/InflationRate RPC -// method. -type QueryInflationRateRequest struct { -} - -func (m *QueryInflationRateRequest) Reset() { *m = QueryInflationRateRequest{} } -func (m *QueryInflationRateRequest) String() string { return proto.CompactTextString(m) } -func (*QueryInflationRateRequest) ProtoMessage() {} -func (*QueryInflationRateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{8} -} -func (m *QueryInflationRateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryInflationRateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryInflationRateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryInflationRateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryInflationRateRequest.Merge(m, src) -} -func (m *QueryInflationRateRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryInflationRateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryInflationRateRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryInflationRateRequest proto.InternalMessageInfo - -// QueryInflationRateResponse is the response type for the Query/InflationRate -// RPC method. -type QueryInflationRateResponse struct { - // inflation_rate by which the total supply increases within one period - InflationRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=inflation_rate,json=inflationRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"inflation_rate"` -} - -func (m *QueryInflationRateResponse) Reset() { *m = QueryInflationRateResponse{} } -func (m *QueryInflationRateResponse) String() string { return proto.CompactTextString(m) } -func (*QueryInflationRateResponse) ProtoMessage() {} -func (*QueryInflationRateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{9} -} -func (m *QueryInflationRateResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryInflationRateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryInflationRateResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryInflationRateResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryInflationRateResponse.Merge(m, src) -} -func (m *QueryInflationRateResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryInflationRateResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryInflationRateResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryInflationRateResponse proto.InternalMessageInfo - -// QueryParamsRequest is the request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{10} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is the response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params defines the parameters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9cef9ea5e4d20e5e, []int{11} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func init() { - proto.RegisterType((*QueryPeriodRequest)(nil), "nibiru.inflation.v1.QueryPeriodRequest") - proto.RegisterType((*QueryPeriodResponse)(nil), "nibiru.inflation.v1.QueryPeriodResponse") - proto.RegisterType((*QueryEpochMintProvisionRequest)(nil), "nibiru.inflation.v1.QueryEpochMintProvisionRequest") - proto.RegisterType((*QueryEpochMintProvisionResponse)(nil), "nibiru.inflation.v1.QueryEpochMintProvisionResponse") - proto.RegisterType((*QuerySkippedEpochsRequest)(nil), "nibiru.inflation.v1.QuerySkippedEpochsRequest") - proto.RegisterType((*QuerySkippedEpochsResponse)(nil), "nibiru.inflation.v1.QuerySkippedEpochsResponse") - proto.RegisterType((*QueryCirculatingSupplyRequest)(nil), "nibiru.inflation.v1.QueryCirculatingSupplyRequest") - proto.RegisterType((*QueryCirculatingSupplyResponse)(nil), "nibiru.inflation.v1.QueryCirculatingSupplyResponse") - proto.RegisterType((*QueryInflationRateRequest)(nil), "nibiru.inflation.v1.QueryInflationRateRequest") - proto.RegisterType((*QueryInflationRateResponse)(nil), "nibiru.inflation.v1.QueryInflationRateResponse") - proto.RegisterType((*QueryParamsRequest)(nil), "nibiru.inflation.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "nibiru.inflation.v1.QueryParamsResponse") -} - -func init() { proto.RegisterFile("nibiru/inflation/v1/query.proto", fileDescriptor_9cef9ea5e4d20e5e) } - -var fileDescriptor_9cef9ea5e4d20e5e = []byte{ - // 686 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x95, 0x4f, 0x4f, 0x14, 0x3d, - 0x1c, 0xc7, 0xb7, 0x4f, 0x78, 0xd6, 0x58, 0x03, 0x09, 0x85, 0x18, 0x1d, 0x60, 0x16, 0x97, 0x20, - 0x10, 0x42, 0x9b, 0x65, 0xbd, 0x78, 0x65, 0xf5, 0xc0, 0x41, 0x83, 0x43, 0xbc, 0x78, 0xd9, 0xcc, - 0x0e, 0x75, 0x68, 0x60, 0xdb, 0x32, 0x9d, 0xd9, 0xc8, 0xcd, 0xe8, 0x1b, 0x30, 0xf1, 0xec, 0xc9, - 0x83, 0x89, 0x89, 0x17, 0x5e, 0x05, 0x47, 0x12, 0x2f, 0xc6, 0x03, 0x1a, 0xf0, 0x85, 0x98, 0xe9, - 0x74, 0x96, 0x1d, 0xb6, 0xb3, 0xc0, 0xc1, 0xd3, 0xce, 0xf6, 0xf7, 0xef, 0xdb, 0x6f, 0xfb, 0x99, - 0x81, 0x35, 0xce, 0x3a, 0x2c, 0x4a, 0x08, 0xe3, 0xaf, 0xf7, 0xfd, 0x98, 0x09, 0x4e, 0x7a, 0x0d, - 0x72, 0x90, 0xd0, 0xe8, 0x10, 0xcb, 0x48, 0xc4, 0x02, 0x4d, 0x65, 0x09, 0xb8, 0x9f, 0x80, 0x7b, - 0x0d, 0xc7, 0x0d, 0x84, 0xea, 0x0a, 0x45, 0x3a, 0xbe, 0xa2, 0xa4, 0xd7, 0xe8, 0xd0, 0xd8, 0x6f, - 0x90, 0x40, 0x30, 0x9e, 0x15, 0x39, 0x0f, 0x6c, 0x5d, 0x43, 0xca, 0xa9, 0x62, 0xca, 0xa4, 0x4c, - 0x87, 0x22, 0x14, 0xfa, 0x91, 0xa4, 0x4f, 0x66, 0x75, 0x36, 0x14, 0x22, 0xdc, 0xa7, 0xc4, 0x97, - 0x8c, 0xf8, 0x9c, 0x8b, 0x58, 0x57, 0x9b, 0x9a, 0xfa, 0x34, 0x44, 0x2f, 0x52, 0x69, 0x5b, 0x34, - 0x62, 0x62, 0xc7, 0xa3, 0x07, 0x09, 0x55, 0x71, 0x7d, 0x0d, 0x4e, 0x15, 0x56, 0x95, 0x14, 0x5c, - 0x51, 0x74, 0x17, 0x56, 0xa5, 0x5e, 0xb9, 0x07, 0xe6, 0xc1, 0xf2, 0x98, 0x67, 0xfe, 0xd5, 0xe7, - 0xa1, 0xab, 0xd3, 0x9f, 0x4a, 0x11, 0xec, 0x3e, 0x63, 0x3c, 0xde, 0x8a, 0x44, 0x8f, 0x29, 0x26, - 0x78, 0xde, 0xf0, 0x0b, 0x80, 0xb5, 0xd2, 0x14, 0xd3, 0xfd, 0x3d, 0x80, 0xd3, 0x34, 0x0d, 0xb7, - 0xbb, 0x8c, 0xc7, 0x6d, 0x99, 0x27, 0xe8, 0x61, 0x77, 0xd6, 0x67, 0x71, 0xe6, 0x10, 0x4e, 0x1d, - 0xc2, 0xc6, 0x21, 0xfc, 0x84, 0x06, 0x2d, 0xc1, 0xf8, 0x46, 0xf3, 0xf8, 0xb4, 0x56, 0xf9, 0xfa, - 0xab, 0xb6, 0x1a, 0xb2, 0x78, 0x37, 0xe9, 0xe0, 0x40, 0x74, 0x89, 0x71, 0x34, 0xfb, 0x59, 0x53, - 0x3b, 0x7b, 0x24, 0x3e, 0x94, 0x54, 0xe5, 0x35, 0xca, 0x43, 0x74, 0x48, 0x4d, 0x7d, 0x06, 0xde, - 0xd7, 0x42, 0xb7, 0xf7, 0x98, 0x94, 0x74, 0x47, 0xeb, 0x55, 0xf9, 0x36, 0x5a, 0xd0, 0xb1, 0x05, - 0xcd, 0x06, 0x16, 0xe1, 0x84, 0xca, 0x02, 0x6d, 0xdd, 0x58, 0x19, 0x9b, 0xc6, 0xd5, 0x60, 0x7a, - 0xbd, 0x06, 0xe7, 0x74, 0x93, 0x16, 0x8b, 0x82, 0x24, 0x3d, 0x4b, 0x1e, 0x6e, 0x27, 0x52, 0xee, - 0x1f, 0xe6, 0x53, 0x3e, 0x03, 0xe3, 0xa7, 0x25, 0xc3, 0x8c, 0x7a, 0x0b, 0x20, 0x0a, 0x2e, 0xa2, - 0x6d, 0xa5, 0xc3, 0xff, 0xce, 0xa9, 0xc9, 0xe0, 0xb2, 0x94, 0xbe, 0x51, 0x9b, 0xf9, 0x85, 0xf4, - 0xfc, 0x98, 0xe6, 0x5b, 0x50, 0xc6, 0xa8, 0x4b, 0x41, 0xa3, 0xfe, 0x25, 0x9c, 0xe8, 0x5f, 0xe3, - 0x76, 0xe4, 0xc7, 0x54, 0x0b, 0xbf, 0xbd, 0x81, 0x53, 0x69, 0x3f, 0x4f, 0x6b, 0x0f, 0xaf, 0x27, - 0xcd, 0x1b, 0x67, 0x83, 0xed, 0x2f, 0xee, 0xb2, 0x1f, 0xf9, 0xdd, 0xfe, 0x99, 0x6d, 0xe5, 0x77, - 0xd9, 0xac, 0x1a, 0x0d, 0x8f, 0x61, 0x55, 0xea, 0x15, 0x63, 0xda, 0x0c, 0xb6, 0x50, 0x89, 0xb3, - 0xa2, 0x8d, 0xb1, 0x54, 0x98, 0x67, 0x0a, 0xd6, 0x8f, 0x6e, 0xc1, 0xff, 0x75, 0xcb, 0xf4, 0x18, - 0xaa, 0x19, 0x23, 0x68, 0xc9, 0x5a, 0x3f, 0xcc, 0x96, 0xb3, 0x7c, 0x75, 0x62, 0x26, 0xb1, 0xbe, - 0xf0, 0xee, 0xfb, 0x9f, 0x8f, 0xff, 0xcd, 0xa1, 0x19, 0x62, 0x63, 0x3f, 0x63, 0x0f, 0x1d, 0x01, - 0x88, 0x86, 0xa1, 0x42, 0xcd, 0xf2, 0x29, 0xa5, 0x94, 0x3a, 0x8f, 0x6e, 0x56, 0x64, 0x64, 0x36, - 0xb4, 0xcc, 0x55, 0xb4, 0x62, 0x95, 0x69, 0x23, 0x1a, 0x7d, 0x02, 0x70, 0xbc, 0xc0, 0x10, 0xc2, - 0xe5, 0xa3, 0x6d, 0x24, 0x3a, 0xe4, 0xda, 0xf9, 0x46, 0xe5, 0xaa, 0x56, 0xb9, 0x88, 0x16, 0xac, - 0x2a, 0x8b, 0xdc, 0xa2, 0x6f, 0x00, 0x4e, 0x0e, 0xc1, 0x87, 0xd6, 0xcb, 0x67, 0x96, 0xb1, 0xec, - 0x34, 0x6f, 0x54, 0x63, 0xb4, 0x12, 0xad, 0x75, 0x05, 0x2d, 0x59, 0xb5, 0x0e, 0x73, 0xaf, 0xfd, - 0x2c, 0xa0, 0x36, 0xca, 0x4f, 0x1b, 0xb0, 0xa3, 0xfc, 0xb4, 0x32, 0x7c, 0x85, 0x9f, 0x45, 0xbc, - 0x33, 0x4e, 0x34, 0x3c, 0x23, 0x39, 0x19, 0xe4, 0x76, 0x24, 0x27, 0x05, 0x94, 0xaf, 0xe2, 0x24, - 0x43, 0x78, 0xf3, 0xf8, 0xcc, 0x05, 0x27, 0x67, 0x2e, 0xf8, 0x7d, 0xe6, 0x82, 0x0f, 0xe7, 0x6e, - 0xe5, 0xe4, 0xdc, 0xad, 0xfc, 0x38, 0x77, 0x2b, 0xaf, 0xc8, 0xc0, 0xdb, 0xe6, 0xb9, 0x6e, 0xd0, - 0xda, 0xf5, 0x19, 0xcf, 0x9b, 0xbd, 0x19, 0x68, 0xa7, 0x5f, 0x3d, 0x9d, 0xaa, 0xfe, 0x74, 0x36, - 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x40, 0x82, 0x21, 0x19, 0xe9, 0x07, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Period retrieves current period. - Period(ctx context.Context, in *QueryPeriodRequest, opts ...grpc.CallOption) (*QueryPeriodResponse, error) - // EpochMintProvision retrieves current minting epoch provision value. - EpochMintProvision(ctx context.Context, in *QueryEpochMintProvisionRequest, opts ...grpc.CallOption) (*QueryEpochMintProvisionResponse, error) - // SkippedEpochs retrieves the total number of skipped epochs. - SkippedEpochs(ctx context.Context, in *QuerySkippedEpochsRequest, opts ...grpc.CallOption) (*QuerySkippedEpochsResponse, error) - // CirculatingSupply retrieves the total number of tokens that are in - // circulation (i.e. excluding unvested tokens). - CirculatingSupply(ctx context.Context, in *QueryCirculatingSupplyRequest, opts ...grpc.CallOption) (*QueryCirculatingSupplyResponse, error) - // InflationRate retrieves the inflation rate of the current period. - InflationRate(ctx context.Context, in *QueryInflationRateRequest, opts ...grpc.CallOption) (*QueryInflationRateResponse, error) - // Params retrieves the total set of minting parameters. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) Period(ctx context.Context, in *QueryPeriodRequest, opts ...grpc.CallOption) (*QueryPeriodResponse, error) { - out := new(QueryPeriodResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/Period", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) EpochMintProvision(ctx context.Context, in *QueryEpochMintProvisionRequest, opts ...grpc.CallOption) (*QueryEpochMintProvisionResponse, error) { - out := new(QueryEpochMintProvisionResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/EpochMintProvision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) SkippedEpochs(ctx context.Context, in *QuerySkippedEpochsRequest, opts ...grpc.CallOption) (*QuerySkippedEpochsResponse, error) { - out := new(QuerySkippedEpochsResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/SkippedEpochs", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) CirculatingSupply(ctx context.Context, in *QueryCirculatingSupplyRequest, opts ...grpc.CallOption) (*QueryCirculatingSupplyResponse, error) { - out := new(QueryCirculatingSupplyResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/CirculatingSupply", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) InflationRate(ctx context.Context, in *QueryInflationRateRequest, opts ...grpc.CallOption) (*QueryInflationRateResponse, error) { - out := new(QueryInflationRateResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/InflationRate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Period retrieves current period. - Period(context.Context, *QueryPeriodRequest) (*QueryPeriodResponse, error) - // EpochMintProvision retrieves current minting epoch provision value. - EpochMintProvision(context.Context, *QueryEpochMintProvisionRequest) (*QueryEpochMintProvisionResponse, error) - // SkippedEpochs retrieves the total number of skipped epochs. - SkippedEpochs(context.Context, *QuerySkippedEpochsRequest) (*QuerySkippedEpochsResponse, error) - // CirculatingSupply retrieves the total number of tokens that are in - // circulation (i.e. excluding unvested tokens). - CirculatingSupply(context.Context, *QueryCirculatingSupplyRequest) (*QueryCirculatingSupplyResponse, error) - // InflationRate retrieves the inflation rate of the current period. - InflationRate(context.Context, *QueryInflationRateRequest) (*QueryInflationRateResponse, error) - // Params retrieves the total set of minting parameters. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) Period(ctx context.Context, req *QueryPeriodRequest) (*QueryPeriodResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Period not implemented") -} -func (*UnimplementedQueryServer) EpochMintProvision(ctx context.Context, req *QueryEpochMintProvisionRequest) (*QueryEpochMintProvisionResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method EpochMintProvision not implemented") -} -func (*UnimplementedQueryServer) SkippedEpochs(ctx context.Context, req *QuerySkippedEpochsRequest) (*QuerySkippedEpochsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SkippedEpochs not implemented") -} -func (*UnimplementedQueryServer) CirculatingSupply(ctx context.Context, req *QueryCirculatingSupplyRequest) (*QueryCirculatingSupplyResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CirculatingSupply not implemented") -} -func (*UnimplementedQueryServer) InflationRate(ctx context.Context, req *QueryInflationRateRequest) (*QueryInflationRateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method InflationRate not implemented") -} -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_Period_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryPeriodRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Period(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/Period", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Period(ctx, req.(*QueryPeriodRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_EpochMintProvision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryEpochMintProvisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).EpochMintProvision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/EpochMintProvision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).EpochMintProvision(ctx, req.(*QueryEpochMintProvisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_SkippedEpochs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QuerySkippedEpochsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).SkippedEpochs(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/SkippedEpochs", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).SkippedEpochs(ctx, req.(*QuerySkippedEpochsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_CirculatingSupply_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryCirculatingSupplyRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).CirculatingSupply(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/CirculatingSupply", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).CirculatingSupply(ctx, req.(*QueryCirculatingSupplyRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_InflationRate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryInflationRateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).InflationRate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/InflationRate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).InflationRate(ctx, req.(*QueryInflationRateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "nibiru.inflation.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Period", - Handler: _Query_Period_Handler, - }, - { - MethodName: "EpochMintProvision", - Handler: _Query_EpochMintProvision_Handler, - }, - { - MethodName: "SkippedEpochs", - Handler: _Query_SkippedEpochs_Handler, - }, - { - MethodName: "CirculatingSupply", - Handler: _Query_CirculatingSupply_Handler, - }, - { - MethodName: "InflationRate", - Handler: _Query_InflationRate_Handler, - }, - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "nibiru/inflation/v1/query.proto", -} - -func (m *QueryPeriodRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPeriodRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPeriodRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryPeriodResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryPeriodResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryPeriodResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.Period != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.Period)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryEpochMintProvisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryEpochMintProvisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryEpochMintProvisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryEpochMintProvisionResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryEpochMintProvisionResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryEpochMintProvisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.EpochMintProvision.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QuerySkippedEpochsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySkippedEpochsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySkippedEpochsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QuerySkippedEpochsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QuerySkippedEpochsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QuerySkippedEpochsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.SkippedEpochs != 0 { - i = encodeVarintQuery(dAtA, i, uint64(m.SkippedEpochs)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *QueryCirculatingSupplyRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryCirculatingSupplyRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryCirculatingSupplyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryCirculatingSupplyResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryCirculatingSupplyResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryCirculatingSupplyResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.CirculatingSupply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryInflationRateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryInflationRateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryInflationRateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryInflationRateResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryInflationRateResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryInflationRateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size := m.InflationRate.Size() - i -= size - if _, err := m.InflationRate.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryPeriodRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryPeriodResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Period != 0 { - n += 1 + sovQuery(uint64(m.Period)) - } - return n -} - -func (m *QueryEpochMintProvisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryEpochMintProvisionResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.EpochMintProvision.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QuerySkippedEpochsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QuerySkippedEpochsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.SkippedEpochs != 0 { - n += 1 + sovQuery(uint64(m.SkippedEpochs)) - } - return n -} - -func (m *QueryCirculatingSupplyRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryCirculatingSupplyResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.CirculatingSupply.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryInflationRateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryInflationRateResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.InflationRate.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryPeriodRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPeriodRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPeriodRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryPeriodResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryPeriodResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryPeriodResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType) - } - m.Period = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Period |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryEpochMintProvisionRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryEpochMintProvisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochMintProvisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryEpochMintProvisionResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryEpochMintProvisionResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryEpochMintProvisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EpochMintProvision", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.EpochMintProvision.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySkippedEpochsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySkippedEpochsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySkippedEpochsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QuerySkippedEpochsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QuerySkippedEpochsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QuerySkippedEpochsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field SkippedEpochs", wireType) - } - m.SkippedEpochs = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.SkippedEpochs |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryCirculatingSupplyRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryCirculatingSupplyRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryCirculatingSupplyRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryCirculatingSupplyResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryCirculatingSupplyResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryCirculatingSupplyResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CirculatingSupply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CirculatingSupply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryInflationRateRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryInflationRateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryInflationRateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryInflationRateResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryInflationRateResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryInflationRateResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InflationRate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.InflationRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/inflation/types/query.pb.gw.go b/x/inflation/types/query.pb.gw.go deleted file mode 100644 index 5d12e647b..000000000 --- a/x/inflation/types/query.pb.gw.go +++ /dev/null @@ -1,478 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: nibiru/inflation/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_Query_Period_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPeriodRequest - var metadata runtime.ServerMetadata - - msg, err := client.Period(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Period_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryPeriodRequest - var metadata runtime.ServerMetadata - - msg, err := server.Period(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_EpochMintProvision_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochMintProvisionRequest - var metadata runtime.ServerMetadata - - msg, err := client.EpochMintProvision(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_EpochMintProvision_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryEpochMintProvisionRequest - var metadata runtime.ServerMetadata - - msg, err := server.EpochMintProvision(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_SkippedEpochs_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySkippedEpochsRequest - var metadata runtime.ServerMetadata - - msg, err := client.SkippedEpochs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_SkippedEpochs_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QuerySkippedEpochsRequest - var metadata runtime.ServerMetadata - - msg, err := server.SkippedEpochs(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_CirculatingSupply_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCirculatingSupplyRequest - var metadata runtime.ServerMetadata - - msg, err := client.CirculatingSupply(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_CirculatingSupply_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryCirculatingSupplyRequest - var metadata runtime.ServerMetadata - - msg, err := server.CirculatingSupply(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_InflationRate_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryInflationRateRequest - var metadata runtime.ServerMetadata - - msg, err := client.InflationRate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_InflationRate_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryInflationRateRequest - var metadata runtime.ServerMetadata - - msg, err := server.InflationRate(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Period_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Period_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Period_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EpochMintProvision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_EpochMintProvision_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EpochMintProvision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SkippedEpochs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_SkippedEpochs_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SkippedEpochs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_CirculatingSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_CirculatingSupply_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CirculatingSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_InflationRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_InflationRate_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_InflationRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_Period_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Period_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Period_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_EpochMintProvision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_EpochMintProvision_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_EpochMintProvision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_SkippedEpochs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_SkippedEpochs_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_SkippedEpochs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_CirculatingSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_CirculatingSupply_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_CirculatingSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_InflationRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_InflationRate_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_InflationRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_Period_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "period"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_EpochMintProvision_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "epoch_mint_provision"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_SkippedEpochs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "skipped_epochs"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_CirculatingSupply_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "circulating_supply"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_InflationRate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "inflation_rate"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) -) - -var ( - forward_Query_Period_0 = runtime.ForwardResponseMessage - - forward_Query_EpochMintProvision_0 = runtime.ForwardResponseMessage - - forward_Query_SkippedEpochs_0 = runtime.ForwardResponseMessage - - forward_Query_CirculatingSupply_0 = runtime.ForwardResponseMessage - - forward_Query_InflationRate_0 = runtime.ForwardResponseMessage - - forward_Query_Params_0 = runtime.ForwardResponseMessage -) From e2011cd08e29e3fb6d44ffd0258eb9521d599320 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Tue, 14 Nov 2023 17:02:01 +0000 Subject: [PATCH 25/99] feat(inflation)!: make inflation follow a polynomial distribution (#1670) * feat: make inflation follow a polynomial distribution * chore: changelog * fix: fix inflation test * fix: fix epoch/period confusion --- CHANGELOG.md | 2 +- app/app.go | 6 +- app/encoding.go | 2 + app/keepers.go | 34 +- proto/nibiru/inflation/v1/genesis.proto | 45 + proto/nibiru/inflation/v1/inflation.proto | 30 + x/epochs/types/query.pb.go | 54 +- x/inflation/client/cli/query.go | 213 ++ x/inflation/genesis.go | 40 + x/inflation/keeper/grpc_query.go | 78 + x/inflation/keeper/grpc_query_test.go | 103 + x/inflation/keeper/hooks.go | 154 ++ x/inflation/keeper/hooks_test.go | 201 ++ x/inflation/keeper/inflation.go | 144 ++ x/inflation/keeper/inflation_test.go | 186 ++ x/inflation/keeper/keeper.go | 72 + x/inflation/keeper/params.go | 46 + x/inflation/module.go | 171 ++ x/inflation/types/events.go | 9 + x/inflation/types/export.go | 12 + x/inflation/types/genesis.go | 37 + x/inflation/types/genesis.pb.go | 797 ++++++ x/inflation/types/genesis_test.go | 57 + x/inflation/types/inflation.pb.go | 425 ++++ x/inflation/types/inflation_calculation.go | 39 + .../types/inflation_calculation_test.go | 70 + x/inflation/types/interfaces.go | 45 + x/inflation/types/keys.go | 13 + x/inflation/types/params.go | 189 ++ x/inflation/types/params_test.go | 170 ++ x/inflation/types/query.pb.go | 2191 +++++++++++++++++ x/inflation/types/query.pb.gw.go | 478 ++++ 32 files changed, 6074 insertions(+), 39 deletions(-) create mode 100644 proto/nibiru/inflation/v1/genesis.proto create mode 100644 proto/nibiru/inflation/v1/inflation.proto create mode 100644 x/inflation/client/cli/query.go create mode 100644 x/inflation/genesis.go create mode 100644 x/inflation/keeper/grpc_query.go create mode 100644 x/inflation/keeper/grpc_query_test.go create mode 100644 x/inflation/keeper/hooks.go create mode 100644 x/inflation/keeper/hooks_test.go create mode 100644 x/inflation/keeper/inflation.go create mode 100644 x/inflation/keeper/inflation_test.go create mode 100644 x/inflation/keeper/keeper.go create mode 100644 x/inflation/keeper/params.go create mode 100644 x/inflation/module.go create mode 100644 x/inflation/types/events.go create mode 100644 x/inflation/types/export.go create mode 100644 x/inflation/types/genesis.go create mode 100644 x/inflation/types/genesis.pb.go create mode 100644 x/inflation/types/genesis_test.go create mode 100644 x/inflation/types/inflation.pb.go create mode 100644 x/inflation/types/inflation_calculation.go create mode 100644 x/inflation/types/inflation_calculation_test.go create mode 100644 x/inflation/types/interfaces.go create mode 100644 x/inflation/types/keys.go create mode 100644 x/inflation/types/params.go create mode 100644 x/inflation/types/params_test.go create mode 100644 x/inflation/types/query.pb.go create mode 100644 x/inflation/types/query.pb.gw.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 097de9bb4..562e3acab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1620](https://github.com/NibiruChain/nibiru/pull/1620) - Token factory transaction messages for Mint and Burn * [#1573](https://github.com/NibiruChain/nibiru/pull/1573) - feat(perp): Close markets and compute settlement price * [#1632](https://github.com/NibiruChain/nibiru/pull/1632) - feat(perp): Add settle position transaction -* [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message +* [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial ### State Machine Breaking diff --git a/app/app.go b/app/app.go index 4657d3e51..82040dc47 100644 --- a/app/app.go +++ b/app/app.go @@ -44,7 +44,7 @@ import ( "github.com/rakyll/statik/fs" "github.com/spf13/cast" - "github.com/NibiruChain/nibiru/wasmbinding" + wasmbinding "github.com/NibiruChain/nibiru/wasmbinding" ) const ( @@ -118,10 +118,10 @@ func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasmkeeper. // Add the bindings to the app's set of []wasmkeeper.Option. wasmOpts = append(wasmOpts, wasmbinding.NibiruWasmOptions( nibiru.GRPCQueryRouter(), - nibiru.AppCodec(), + nibiru.appCodec, nibiru.SudoKeeper, )...) - // Add the bindings to the app's set of []wasm.Option. + return wasmOpts } diff --git a/app/encoding.go b/app/encoding.go index 15fe53027..1f8e27495 100644 --- a/app/encoding.go +++ b/app/encoding.go @@ -6,6 +6,8 @@ import ( "github.com/NibiruChain/nibiru/app/codec" ) +// EncodingConfig specifies the concrete encoding types to use for a given app. +// This is provided for compatibility between protobuf and amino implementations. type EncodingConfig = codec.EncodingConfig // MakeEncodingConfig creates an EncodingConfig for an amino based test configuration. diff --git a/app/keepers.go b/app/keepers.go index 5b02fb860..99ae4a464 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -104,12 +104,16 @@ import ( epochskeeper "github.com/NibiruChain/nibiru/x/epochs/keeper" epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" "github.com/NibiruChain/nibiru/x/genmsg" + "github.com/NibiruChain/nibiru/x/inflation" + inflationkeeper "github.com/NibiruChain/nibiru/x/inflation/keeper" + inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" oracle "github.com/NibiruChain/nibiru/x/oracle" oraclekeeper "github.com/NibiruChain/nibiru/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/x/oracle/types" "github.com/NibiruChain/nibiru/x/sudo" "github.com/NibiruChain/nibiru/x/sudo/keeper" sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory" tokenfactorykeeper "github.com/NibiruChain/nibiru/x/tokenfactory/keeper" tokenfactorytypes "github.com/NibiruChain/nibiru/x/tokenfactory/types" @@ -161,6 +165,7 @@ type AppKeepers struct { // --------------- EpochsKeeper epochskeeper.Keeper OracleKeeper oraclekeeper.Keeper + InflationKeeper inflationkeeper.Keeper SudoKeeper keeper.Keeper DevGasKeeper devgaskeeper.Keeper TokenFactoryKeeper tokenfactorykeeper.Keeper @@ -199,6 +204,7 @@ func initStoreKeys() ( // nibiru x/ keys oracletypes.StoreKey, epochstypes.StoreKey, + inflationtypes.StoreKey, sudotypes.StoreKey, wasmtypes.StoreKey, devgastypes.StoreKey, @@ -345,8 +351,14 @@ func (app *NibiruApp) InitKeepers( appCodec, keys[sudotypes.StoreKey], ) + app.InflationKeeper = inflationkeeper.NewKeeper( + appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, + ) + app.EpochsKeeper.SetHooks( epochstypes.NewMultiEpochHooks( + app.InflationKeeper.Hooks(), app.OracleKeeper.Hooks(), ), ) @@ -556,6 +568,7 @@ func (app *NibiruApp) initAppModules( // Nibiru modules oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper, app.SudoKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), + inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.stakingKeeper), sudo.NewAppModule(appCodec, app.SudoKeeper), genmsg.NewAppModule(app.MsgServiceRouter()), @@ -622,6 +635,7 @@ func orderedModuleNames() []string { // Native x/ Modules epochstypes.ModuleName, oracletypes.ModuleName, + inflationtypes.ModuleName, sudotypes.ModuleName, // -------------------------------------------------------------------- @@ -735,6 +749,7 @@ func ModuleBasicManager() module.BasicManager { // native x/ oracle.AppModuleBasic{}, epochs.AppModuleBasic{}, + inflation.AppModuleBasic{}, sudo.AppModuleBasic{}, wasm.AppModuleBasic{}, devgas.AppModuleBasic{}, @@ -746,14 +761,16 @@ func ModuleBasicManager() module.BasicManager { func ModuleAccPerms() map[string][]string { return map[string][]string{ - authtypes.FeeCollectorName: nil, - distrtypes.ModuleName: nil, - stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, - stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, - govtypes.ModuleName: {authtypes.Burner}, - oracletypes.ModuleName: {}, - ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, - ibcfeetypes.ModuleName: {}, + authtypes.FeeCollectorName: nil, + distrtypes.ModuleName: nil, + inflationtypes.ModuleName: {authtypes.Minter}, + stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, + stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, + govtypes.ModuleName: {authtypes.Burner}, + oracletypes.ModuleName: {}, + ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + ibcfeetypes.ModuleName: {}, + epochstypes.ModuleName: {}, sudotypes.ModuleName: {}, common.TreasuryPoolModuleAccount: {}, @@ -778,6 +795,7 @@ func initParamsKeeper( paramsKeeper.Subspace(crisistypes.ModuleName) // Nibiru core params keepers | x/ paramsKeeper.Subspace(epochstypes.ModuleName) + paramsKeeper.Subspace(inflationtypes.ModuleName) // ibc params keepers paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibcexported.ModuleName) diff --git a/proto/nibiru/inflation/v1/genesis.proto b/proto/nibiru/inflation/v1/genesis.proto new file mode 100644 index 000000000..e72fff223 --- /dev/null +++ b/proto/nibiru/inflation/v1/genesis.proto @@ -0,0 +1,45 @@ +syntax = "proto3"; + +package nibiru.inflation.v1; + +import "gogoproto/gogo.proto"; +import "nibiru/inflation/v1/inflation.proto"; + +option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; + +// GenesisState defines the inflation module's genesis state. +message GenesisState { + // params defines all the parameters of the module. + Params params = 1 [ (gogoproto.nullable) = false ]; + // period is the amount of past periods, based on the epochs per period param + uint64 period = 2; + // skipped_epochs is the number of epochs that have passed while inflation is + // disabled + uint64 skipped_epochs = 3; +} + +// Params holds parameters for the inflation module. +message Params { + // inflation_enabled is the parameter that enables inflation and halts + // increasing the skipped_epochs + bool inflation_enabled = 1; + // polynomial_factors takes in the variables to calculate polynomial + // inflation + repeated string polynomial_factors = 2[ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; + // inflation_distribution of the minted denom + InflationDistribution inflation_distribution = 3 + [ (gogoproto.nullable) = false ]; + // epochs_per_period is the number of epochs that must pass before a new + // period is created + uint64 epochs_per_period = 4; + + // periods_per_year is the number of periods that occur in a year + uint64 periods_per_year = 5; + + // max_period is the maximum number of periods that have inflation being + // paid off. After this period, inflation will be disabled. + uint64 max_period = 6; +} diff --git a/proto/nibiru/inflation/v1/inflation.proto b/proto/nibiru/inflation/v1/inflation.proto new file mode 100644 index 000000000..cad921ede --- /dev/null +++ b/proto/nibiru/inflation/v1/inflation.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; +package nibiru.inflation.v1; + +import "gogoproto/gogo.proto"; + +option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; + +// InflationDistribution defines the distribution in which inflation is +// allocated through minting on each epoch (staking, community, strategic). It +// excludes the team vesting distribution. +message InflationDistribution { + // staking_rewards defines the proportion of the minted_denom that is + // to be allocated as staking rewards + string staking_rewards = 1 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; + // community_pool defines the proportion of the minted_denom that is to + // be allocated to the community pool + string community_pool = 2 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; + // strategic_reserves defines the proportion of the minted_denom that + // is to be allocated to the strategic reserves module address + string strategic_reserves = 3 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = false + ]; +} diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go index e486ff116..bab7018fb 100644 --- a/x/epochs/types/query.pb.go +++ b/x/epochs/types/query.pb.go @@ -208,33 +208,33 @@ func init() { func init() { proto.RegisterFile("nibiru/epochs/v1/query.proto", fileDescriptor_2d273c3d69b40555) } var fileDescriptor_2d273c3d69b40555 = []byte{ - // 413 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4f, 0x8b, 0xd3, 0x40, - 0x14, 0xcf, 0xd4, 0x5a, 0x70, 0xac, 0x20, 0x83, 0x68, 0x8c, 0x35, 0x2d, 0xf1, 0x0f, 0xb5, 0x96, - 0x0c, 0xa9, 0x27, 0x3d, 0x49, 0x8b, 0x82, 0x17, 0xc1, 0xe0, 0xc9, 0x8b, 0x4c, 0xe2, 0x34, 0x1d, - 0xb0, 0x33, 0x69, 0x66, 0x52, 0xec, 0xd5, 0xd3, 0x1e, 0x17, 0x96, 0xfd, 0x12, 0xfb, 0x49, 0x7a, - 0x2c, 0xec, 0x65, 0x4f, 0xcb, 0xd2, 0xee, 0x07, 0x59, 0x3a, 0x93, 0x2e, 0xdd, 0xfe, 0x81, 0xde, - 0x92, 0xf7, 0xfb, 0xf3, 0x7e, 0xef, 0xbd, 0x81, 0x35, 0xce, 0x22, 0x96, 0xe5, 0x98, 0xa6, 0x22, - 0x1e, 0x48, 0x3c, 0x0e, 0xf0, 0x28, 0xa7, 0xd9, 0xc4, 0x4f, 0x33, 0xa1, 0x04, 0x7a, 0x6c, 0x50, - 0xdf, 0xa0, 0xfe, 0x38, 0x70, 0x9e, 0x24, 0x22, 0x11, 0x1a, 0xc4, 0xcb, 0x2f, 0xc3, 0x73, 0x6a, - 0x89, 0x10, 0xc9, 0x5f, 0x8a, 0x49, 0xca, 0x30, 0xe1, 0x5c, 0x28, 0xa2, 0x98, 0xe0, 0xb2, 0x40, - 0x5b, 0xb1, 0x90, 0x43, 0x21, 0x71, 0x44, 0x24, 0x35, 0xf6, 0x78, 0x1c, 0x44, 0x54, 0x91, 0x00, - 0xa7, 0x24, 0x61, 0x5c, 0x93, 0x57, 0x4e, 0x5b, 0x79, 0xa4, 0x22, 0x8a, 0x1a, 0xd4, 0xb3, 0xe1, - 0xd3, 0x1f, 0x4b, 0xfd, 0x17, 0x8d, 0x7e, 0xe3, 0x7d, 0x11, 0xd2, 0x51, 0x4e, 0xa5, 0xf2, 0x7e, - 0xc2, 0x67, 0x5b, 0x88, 0x4c, 0x05, 0x97, 0x14, 0x7d, 0x84, 0x15, 0xe3, 0x66, 0x83, 0xc6, 0xbd, - 0xe6, 0xc3, 0xce, 0x0b, 0x7f, 0x73, 0x2a, 0x5f, 0xab, 0x96, 0xa2, 0x6e, 0x79, 0x7a, 0x59, 0xb7, - 0xc2, 0x42, 0xe0, 0x7d, 0x82, 0xb6, 0x76, 0xed, 0xe5, 0x59, 0x46, 0xb9, 0xd2, 0xb4, 0xa2, 0x23, - 0x72, 0x21, 0x64, 0x7f, 0x28, 0x57, 0xac, 0xcf, 0x68, 0x66, 0x83, 0x06, 0x68, 0x3e, 0x08, 0xd7, - 0x2a, 0xde, 0x67, 0xf8, 0x7c, 0x87, 0xb6, 0xc8, 0xf4, 0x0a, 0x3e, 0x8a, 0x4d, 0xfd, 0xb7, 0x6e, - 0xa5, 0xf5, 0xe5, 0xb0, 0x1a, 0xaf, 0x91, 0x3b, 0x67, 0x25, 0x78, 0x5f, 0x5b, 0xa0, 0x23, 0x00, - 0xe1, 0x6d, 0x46, 0x89, 0x9a, 0xdb, 0x13, 0xec, 0x5e, 0x8b, 0xf3, 0xee, 0x00, 0xa6, 0x89, 0xe4, - 0xbd, 0xf9, 0x7f, 0x7e, 0x7d, 0x52, 0xaa, 0xa3, 0x97, 0x78, 0xf3, 0x04, 0xe6, 0x54, 0xe6, 0x17, - 0x9d, 0x02, 0x58, 0x5d, 0x1f, 0x09, 0xb5, 0xf6, 0xb4, 0xd8, 0xb1, 0x33, 0xe7, 0xfd, 0x41, 0xdc, - 0x22, 0x50, 0x5b, 0x07, 0x7a, 0x8b, 0x5e, 0xef, 0x09, 0x74, 0x67, 0x81, 0xdd, 0xaf, 0xd3, 0xb9, - 0x0b, 0x66, 0x73, 0x17, 0x5c, 0xcd, 0x5d, 0x70, 0xbc, 0x70, 0xad, 0xd9, 0xc2, 0xb5, 0x2e, 0x16, - 0xae, 0xf5, 0xab, 0x9d, 0x30, 0x35, 0xc8, 0x23, 0x3f, 0x16, 0x43, 0xfc, 0x5d, 0x3b, 0xf5, 0x06, - 0x84, 0xf1, 0x95, 0xeb, 0xbf, 0x95, 0xaf, 0x9a, 0xa4, 0x54, 0x46, 0x15, 0xfd, 0xd2, 0x3e, 0xdc, - 0x04, 0x00, 0x00, 0xff, 0xff, 0x57, 0x11, 0x22, 0x69, 0x19, 0x03, 0x00, 0x00, + // 412 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4d, 0x8b, 0xd3, 0x40, + 0x18, 0xce, 0xd4, 0x5a, 0x70, 0xac, 0x20, 0x83, 0x68, 0x8c, 0x35, 0x2d, 0xf1, 0x83, 0x5a, 0x4b, + 0x86, 0xd4, 0x93, 0x9e, 0xa4, 0x45, 0xc1, 0x8b, 0x60, 0xf0, 0xe4, 0x45, 0x26, 0x71, 0x9a, 0x0e, + 0xd8, 0x99, 0x34, 0x33, 0x29, 0xf6, 0xea, 0xc9, 0xa3, 0xb0, 0xec, 0x9f, 0xd8, 0x5f, 0xd2, 0x63, + 0x61, 0x2f, 0x7b, 0x5a, 0x96, 0x76, 0x7f, 0xc8, 0xd2, 0x99, 0x74, 0xb7, 0xdb, 0x0f, 0xe8, 0x2d, + 0x99, 0xe7, 0xe3, 0x7d, 0x9e, 0x77, 0x06, 0xd6, 0x38, 0x8b, 0x58, 0x96, 0x63, 0x9a, 0x8a, 0x78, + 0x20, 0xf1, 0x38, 0xc0, 0xa3, 0x9c, 0x66, 0x13, 0x3f, 0xcd, 0x84, 0x12, 0xe8, 0xa1, 0x41, 0x7d, + 0x83, 0xfa, 0xe3, 0xc0, 0x79, 0x94, 0x88, 0x44, 0x68, 0x10, 0x2f, 0xbf, 0x0c, 0xcf, 0xa9, 0x25, + 0x42, 0x24, 0xbf, 0x29, 0x26, 0x29, 0xc3, 0x84, 0x73, 0xa1, 0x88, 0x62, 0x82, 0xcb, 0x02, 0x6d, + 0xc5, 0x42, 0x0e, 0x85, 0xc4, 0x11, 0x91, 0xd4, 0xd8, 0xe3, 0x71, 0x10, 0x51, 0x45, 0x02, 0x9c, + 0x92, 0x84, 0x71, 0x4d, 0x5e, 0x39, 0x6d, 0xe5, 0x91, 0x8a, 0x28, 0x6a, 0x50, 0xcf, 0x86, 0x8f, + 0xbf, 0x2d, 0xf5, 0x9f, 0x96, 0xe8, 0x17, 0xde, 0x17, 0x32, 0xa4, 0xa3, 0x9c, 0x4a, 0xe5, 0x7d, + 0x87, 0x4f, 0xb6, 0x10, 0x99, 0x0a, 0x2e, 0x29, 0x7a, 0x0f, 0x2b, 0xc6, 0xcd, 0x06, 0x8d, 0x3b, + 0xcd, 0xfb, 0x9d, 0x67, 0xfe, 0x66, 0x2b, 0xff, 0x5a, 0xd5, 0x2d, 0x4f, 0xcf, 0xeb, 0x56, 0x58, + 0x08, 0xbc, 0x0f, 0xd0, 0xd6, 0xae, 0xbd, 0x3c, 0xcb, 0x28, 0x57, 0x9a, 0x56, 0x4c, 0x44, 0x2e, + 0x84, 0xec, 0x17, 0xe5, 0x8a, 0xf5, 0x19, 0xcd, 0x6c, 0xd0, 0x00, 0xcd, 0x7b, 0xe1, 0xda, 0x89, + 0xf7, 0x11, 0x3e, 0xdd, 0xa1, 0x2d, 0x32, 0xbd, 0x80, 0x0f, 0x62, 0x73, 0xfe, 0x53, 0x8f, 0xd2, + 0xfa, 0x72, 0x58, 0x8d, 0xd7, 0xc8, 0x9d, 0x93, 0x12, 0xbc, 0xab, 0x2d, 0xd0, 0x3f, 0x00, 0xe1, + 0x4d, 0x33, 0xd4, 0xdc, 0x6e, 0xb0, 0x7b, 0x2d, 0xce, 0x9b, 0x03, 0x98, 0x26, 0x92, 0xf7, 0xea, + 0xef, 0xe9, 0xe5, 0x51, 0xa9, 0x8e, 0x9e, 0xe3, 0xcd, 0x2b, 0x30, 0x57, 0x65, 0x7e, 0xd1, 0x31, + 0x80, 0xd5, 0xf5, 0x4a, 0xa8, 0xb5, 0x67, 0xc4, 0x8e, 0x9d, 0x39, 0x6f, 0x0f, 0xe2, 0x16, 0x81, + 0xda, 0x3a, 0xd0, 0x6b, 0xf4, 0x72, 0x4f, 0xa0, 0x5b, 0x0b, 0xec, 0x7e, 0x9e, 0xce, 0x5d, 0x30, + 0x9b, 0xbb, 0xe0, 0x62, 0xee, 0x82, 0xff, 0x0b, 0xd7, 0x9a, 0x2d, 0x5c, 0xeb, 0x6c, 0xe1, 0x5a, + 0x3f, 0xda, 0x09, 0x53, 0x83, 0x3c, 0xf2, 0x63, 0x31, 0xc4, 0x5f, 0xb5, 0x53, 0x6f, 0x40, 0x18, + 0x5f, 0xb9, 0xfe, 0x59, 0xf9, 0xaa, 0x49, 0x4a, 0x65, 0x54, 0xd1, 0x2f, 0xed, 0xdd, 0x55, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xe7, 0x96, 0x70, 0xa3, 0x19, 0x03, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/inflation/client/cli/query.go b/x/inflation/client/cli/query.go new file mode 100644 index 000000000..53db6f67c --- /dev/null +++ b/x/inflation/client/cli/query.go @@ -0,0 +1,213 @@ +package cli + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// GetQueryCmd returns the cli query commands for the inflation module. +func GetQueryCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: "Querying commands for the inflation module", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand( + GetPeriod(), + GetEpochMintProvision(), + GetSkippedEpochs(), + GetCirculatingSupply(), + GetInflationRate(), + GetParams(), + ) + + return cmd +} + +// GetPeriod implements a command to return the current inflation +// period +func GetPeriod() *cobra.Command { + cmd := &cobra.Command{ + Use: "period", + Short: "Query the current inflation period", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + params := &types.QueryPeriodRequest{} + res, err := queryClient.Period(context.Background(), params) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%v\n", res.Period)) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetEpochMintProvision implements a command to return the current inflation +// epoch provisions value. +func GetEpochMintProvision() *cobra.Command { + cmd := &cobra.Command{ + Use: "epoch-mint-provision", + Short: "Query the current inflation epoch provisions value", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QueryEpochMintProvisionRequest{} + res, err := queryClient.EpochMintProvision(context.Background(), req) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%s\n", res.EpochMintProvision)) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetSkippedEpochs implements a command to return the current inflation +// period +func GetSkippedEpochs() *cobra.Command { + cmd := &cobra.Command{ + Use: "skipped-epochs", + Short: "Query the current number of skipped epochs", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QuerySkippedEpochsRequest{} + res, err := queryClient.SkippedEpochs(context.Background(), req) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%v\n", res.SkippedEpochs)) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetCirculatingSupply implements a command to return the current circulating supply +func GetCirculatingSupply() *cobra.Command { + cmd := &cobra.Command{ + Use: "circulating-supply", + Short: "Query the current supply of tokens in circulation", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QueryCirculatingSupplyRequest{} + res, err := queryClient.CirculatingSupply(context.Background(), req) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%s\n", res.CirculatingSupply)) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetInflationRate implements a command to return the inflation rate in % +func GetInflationRate() *cobra.Command { + cmd := &cobra.Command{ + Use: "inflation-rate", + Short: "Query the inflation rate of the current period", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QueryInflationRateRequest{} + res, err := queryClient.InflationRate(context.Background(), req) + if err != nil { + return err + } + + return clientCtx.PrintString(fmt.Sprintf("%s%%\n", res.InflationRate)) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetParams implements a command to return the current inflation +// parameters. +func GetParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "params", + Short: "Query the current inflation parameters", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + clientCtx, err := client.GetClientQueryContext(cmd) + if err != nil { + return err + } + + queryClient := types.NewQueryClient(clientCtx) + + req := &types.QueryParamsRequest{} + res, err := queryClient.Params(context.Background(), req) + if err != nil { + return err + } + + return clientCtx.PrintProto(&res.Params) + }, + } + + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} diff --git a/x/inflation/genesis.go b/x/inflation/genesis.go new file mode 100644 index 000000000..0424a7fdb --- /dev/null +++ b/x/inflation/genesis.go @@ -0,0 +1,40 @@ +package inflation + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/inflation/keeper" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// InitGenesis import module genesis +func InitGenesis( + ctx sdk.Context, + k keeper.Keeper, + ak types.AccountKeeper, + _ types.StakingKeeper, + data types.GenesisState, +) { + // Ensure inflation module account is set on genesis + if acc := ak.GetModuleAccount(ctx, types.ModuleName); acc == nil { + panic("the inflation module account has not been set") + } + + // Set genesis state + k.SetParams(ctx, data.Params) + + period := data.Period + k.CurrentPeriod.Set(ctx, period) + + skippedEpochs := data.SkippedEpochs + k.NumSkippedEpochs.Set(ctx, skippedEpochs) +} + +// ExportGenesis returns a GenesisState for a given context and keeper. +func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { + return &types.GenesisState{ + Params: k.GetParams(ctx), + Period: k.CurrentPeriod.Peek(ctx), + SkippedEpochs: k.NumSkippedEpochs.Peek(ctx), + } +} diff --git a/x/inflation/keeper/grpc_query.go b/x/inflation/keeper/grpc_query.go new file mode 100644 index 000000000..395c7db7e --- /dev/null +++ b/x/inflation/keeper/grpc_query.go @@ -0,0 +1,78 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +var _ types.QueryServer = Keeper{} + +// Period returns the current period of the inflation module. +func (k Keeper) Period( + c context.Context, + _ *types.QueryPeriodRequest, +) (*types.QueryPeriodResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + period := k.CurrentPeriod.Peek(ctx) + return &types.QueryPeriodResponse{Period: period}, nil +} + +// EpochMintProvision returns the EpochMintProvision of the inflation module. +func (k Keeper) EpochMintProvision( + c context.Context, + _ *types.QueryEpochMintProvisionRequest, +) (*types.QueryEpochMintProvisionResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + epochMintProvision := k.GetEpochMintProvision(ctx) + coin := sdk.NewDecCoinFromDec(denoms.NIBI, epochMintProvision) + return &types.QueryEpochMintProvisionResponse{EpochMintProvision: coin}, nil +} + +// SkippedEpochs returns the number of skipped Epochs of the inflation module. +func (k Keeper) SkippedEpochs( + c context.Context, + _ *types.QuerySkippedEpochsRequest, +) (*types.QuerySkippedEpochsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + skippedEpochs := k.NumSkippedEpochs.Peek(ctx) + return &types.QuerySkippedEpochsResponse{SkippedEpochs: skippedEpochs}, nil +} + +// InflationRate returns the inflation rate for the current period. +func (k Keeper) InflationRate( + c context.Context, + _ *types.QueryInflationRateRequest, +) (*types.QueryInflationRateResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + inflationRate := k.GetInflationRate(ctx, denoms.NIBI) + return &types.QueryInflationRateResponse{InflationRate: inflationRate}, nil +} + +// CirculatingSupply returns the total supply in circulation excluding the team +// allocation in the first year +func (k Keeper) CirculatingSupply( + c context.Context, + _ *types.QueryCirculatingSupplyRequest, +) (*types.QueryCirculatingSupplyResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + + circulatingSupply := k.GetCirculatingSupply(ctx, denoms.NIBI) + circulatingToDec := sdk.NewDecFromInt(circulatingSupply) + coin := sdk.NewDecCoinFromDec(denoms.NIBI, circulatingToDec) + + return &types.QueryCirculatingSupplyResponse{CirculatingSupply: coin}, nil +} + +// Params returns params of the mint module. +func (k Keeper) Params( + c context.Context, + _ *types.QueryParamsRequest, +) (*types.QueryParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + params := k.GetParams(ctx) + return &types.QueryParamsResponse{Params: params}, nil +} diff --git a/x/inflation/keeper/grpc_query_test.go b/x/inflation/keeper/grpc_query_test.go new file mode 100644 index 000000000..ae75a09d2 --- /dev/null +++ b/x/inflation/keeper/grpc_query_test.go @@ -0,0 +1,103 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" + + "github.com/NibiruChain/nibiru/app" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + + inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" +) + +type QueryServerSuite struct { + suite.Suite + + nibiruApp *app.NibiruApp + ctx sdk.Context +} + +func (s *QueryServerSuite) SetupSuite() { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + s.nibiruApp = nibiruApp + s.ctx = ctx +} + +func TestSuite_QueryServerSuite_RunAll(t *testing.T) { + suite.Run(t, new(QueryServerSuite)) +} + +func (s *QueryServerSuite) TestQueryPeriod() { + nibiruApp, ctx := s.nibiruApp, s.ctx + + resp, err := nibiruApp.InflationKeeper.Period( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryPeriodRequest{}, + ) + + s.NoError(err) + s.Assert().Equal(uint64(0), resp.Period) + + nibiruApp.InflationKeeper.CurrentPeriod.Next(ctx) + + resp, err = nibiruApp.InflationKeeper.Period( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryPeriodRequest{}, + ) + s.NoError(err) + s.Assert().Equal(uint64(1), resp.Period) +} + +func (s *QueryServerSuite) TestQuerySkippedEpochs() { + nibiruApp, ctx := s.nibiruApp, s.ctx + resp, err := nibiruApp.InflationKeeper.SkippedEpochs( + sdk.WrapSDKContext(ctx), &inflationtypes.QuerySkippedEpochsRequest{}, + ) + + s.Require().NoError(err) + s.Assert().Equal(uint64(0), resp.SkippedEpochs) + + nibiruApp.InflationKeeper.NumSkippedEpochs.Next(ctx) + + resp, err = nibiruApp.InflationKeeper.SkippedEpochs( + sdk.WrapSDKContext(ctx), &inflationtypes.QuerySkippedEpochsRequest{}, + ) + s.NoError(err) + s.Assert().Equal(uint64(1), resp.SkippedEpochs) +} + +func (s *QueryServerSuite) TestQueryEpochMintProvision() { + nibiruApp, ctx := s.nibiruApp, s.ctx + resp, err := nibiruApp.InflationKeeper.EpochMintProvision( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryEpochMintProvisionRequest{}, + ) + s.NoError(err) + s.NotNil(resp) +} + +func (s *QueryServerSuite) TestQueryInflationRate() { + nibiruApp, ctx := s.nibiruApp, s.ctx + resp, err := nibiruApp.InflationKeeper.InflationRate( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryInflationRateRequest{}, + ) + s.NoError(err) + s.NotNil(resp) +} + +func (s *QueryServerSuite) TestQueryCirculatingSupply() { + nibiruApp, ctx := s.nibiruApp, s.ctx + resp, err := nibiruApp.InflationKeeper.CirculatingSupply( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryCirculatingSupplyRequest{}, + ) + s.NoError(err) + s.NotNil(resp) +} + +func (s *QueryServerSuite) TestQueryParams() { + nibiruApp, ctx := s.nibiruApp, s.ctx + resp, err := nibiruApp.InflationKeeper.Params( + sdk.WrapSDKContext(ctx), &inflationtypes.QueryParamsRequest{}, + ) + s.NoError(err) + s.NotNil(resp) +} diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go new file mode 100644 index 000000000..0299a0cfa --- /dev/null +++ b/x/inflation/keeper/hooks.go @@ -0,0 +1,154 @@ +package keeper + +import ( + "fmt" + + "github.com/armon/go-metrics" + "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/common/denoms" + epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// BeforeEpochStart: noop, We don't need to do anything here +func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} + +// AfterEpochEnd mints and allocates coins at the end of each epoch end +func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { + if epochIdentifier != epochstypes.DayEpochID { + return + } + + params := k.GetParams(ctx) + + // Skip inflation if it is disabled and increment number of skipped epochs + if !params.InflationEnabled { + prevSkippedEpochs := k.NumSkippedEpochs.Next(ctx) + + k.Logger(ctx).Debug( + "skipping inflation mint and allocation", + "height", ctx.BlockHeight(), + "epoch-id", epochIdentifier, + "epoch-number", epochNumber, + "skipped-epochs", prevSkippedEpochs+1, + ) + return + } + + // mint coins, update supply + period := k.CurrentPeriod.Peek(ctx) + epochsPerPeriod := k.EpochsPerPeriod(ctx) + + epochMintProvision := types.CalculateEpochMintProvision( + params, + period, + ) + + if !epochMintProvision.IsPositive() { + k.Logger(ctx).Error( + "SKIPPING INFLATION: negative epoch mint provision", + "value", epochMintProvision.String(), + ) + return + } + + mintedCoin := sdk.Coin{ + Denom: denoms.NIBI, + Amount: epochMintProvision.TruncateInt(), + } + + staking, strategic, communityPool, err := k.MintAndAllocateInflation(ctx, mintedCoin, params) + if err != nil { + k.Logger(ctx).Error( + "SKIPPING INFLATION: failed to mint and allocate inflation", + "error", err, + ) + return + } + + // If period is passed, update the period. A period is + // passed if the current epoch number surpasses the epochsPerPeriod for the + // current period. Skipped epochs are subtracted to only account for epochs + // where inflation minted tokens. + // + // Examples: + // Given, epochNumber = 1, period = 0, epochPerPeriod = 365, skippedEpochs = 0 + // => 1 - 365 * 0 - 0 < 365 --- nothing to do here + // Given, epochNumber = 741, period = 1, epochPerPeriod = 365, skippedEpochs = 10 + // => 741 - 1 * 365 - 10 > 365 --- a period has passed! we set a new period + peek := k.NumSkippedEpochs.Peek(ctx) + if int64(epochNumber)- + int64(epochsPerPeriod*period)- + int64(peek) > int64(epochsPerPeriod) { + k.CurrentPeriod.Next(ctx) + } + + defer func() { + stakingAmt := staking.Amount + strategicAmt := strategic.Amount + cpAmt := communityPool.Amount + + if mintedCoin.Amount.IsInt64() { + telemetry.IncrCounterWithLabels( + []string{types.ModuleName, "allocate", "total"}, + float32(mintedCoin.Amount.Int64()), + []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, + ) + } + if stakingAmt.IsInt64() { + telemetry.IncrCounterWithLabels( + []string{types.ModuleName, "allocate", "staking", "total"}, + float32(stakingAmt.Int64()), + []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, + ) + } + if strategicAmt.IsInt64() { + telemetry.IncrCounterWithLabels( + []string{types.ModuleName, "allocate", "strategic", "total"}, + float32(strategicAmt.Int64()), + []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, + ) + } + if cpAmt.IsInt64() { + telemetry.IncrCounterWithLabels( + []string{types.ModuleName, "allocate", "community_pool", "total"}, + float32(cpAmt.Int64()), + []metrics.Label{telemetry.NewLabel("denom", mintedCoin.Denom)}, + ) + } + }() + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeMint, + sdk.NewAttribute(types.AttributeEpochNumber, fmt.Sprintf("%d", epochNumber)), + sdk.NewAttribute(types.AttributeKeyEpochProvisions, epochMintProvision.String()), + sdk.NewAttribute(sdk.AttributeKeyAmount, mintedCoin.Amount.String()), + ), + ) +} + +// ___________________________________________________________________________________________________ + +// Hooks wrapper struct for inflation keeper +type Hooks struct { + k Keeper +} + +var _ epochstypes.EpochHooks = Hooks{} + +// Return the wrapper struct +func (k Keeper) Hooks() Hooks { + return Hooks{k} +} + +// epochs hooks +func (h Hooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { + h.k.BeforeEpochStart(ctx, epochIdentifier, epochNumber) +} + +func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { + h.k.AfterEpochEnd(ctx, epochIdentifier, epochNumber) +} diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go new file mode 100644 index 000000000..0db86f9bc --- /dev/null +++ b/x/inflation/keeper/hooks_test.go @@ -0,0 +1,201 @@ +package keeper_test + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +func TestEpochIdentifierAfterEpochEnd(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + + feePoolOld := nibiruApp.DistrKeeper.GetFeePool(ctx) + nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, 1) + feePoolNew := nibiruApp.DistrKeeper.GetFeePool(ctx) + + require.Greater(t, feePoolNew.CommunityPool.AmountOf(denoms.NIBI).BigInt().Uint64(), + feePoolOld.CommunityPool.AmountOf(denoms.NIBI).BigInt().Uint64()) +} + +func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + currentEpochPeriod := nibiruApp.InflationKeeper.EpochsPerPeriod(ctx) + + testCases := []struct { + name string + currentPeriod uint64 + height uint64 + epochIdentifier string + skippedEpochs uint64 + InflationEnabled bool + periodChanges bool + }{ + { + "SkippedEpoch set DayEpochID disabledInflation", + 0, + currentEpochPeriod - 10, // so it's within range + epochstypes.DayEpochID, + 0, + false, + false, + }, + { + "SkippedEpoch set WeekEpochID disabledInflation ", + 0, + currentEpochPeriod - 10, // so it's within range + epochstypes.WeekEpochID, + 0, + false, + false, + }, + { + "[Period 0] disabledInflation", + 0, + currentEpochPeriod - 10, // so it's within range + epochstypes.DayEpochID, + 0, + false, + false, + }, + { + "[Period 0] period stays the same under epochs per period", + 0, + currentEpochPeriod - 10, // so it's within range + epochstypes.DayEpochID, + 0, + true, + false, + }, + { + name: "[Period 0] period changes once enough epochs have passed", + currentPeriod: 0, + height: currentEpochPeriod + 1, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: true, + }, + { + "[Period 1] period stays the same under the epoch per period", + 1, + 2*currentEpochPeriod - 1, + epochstypes.DayEpochID, + 0, + true, + false, + }, + { + "[Period 1] period changes once enough epochs have passed", + 1, + 2*currentEpochPeriod + 1, + epochstypes.DayEpochID, + 0, + true, + true, + }, + { + "[Period 0] with skipped epochs - period stays the same under epochs per period", + 0, + currentEpochPeriod - 1, + epochstypes.DayEpochID, + 10, + true, + false, + }, + { + "[Period 0] with skipped epochs - period stays the same under epochs per period", + 0, + currentEpochPeriod + 1, + epochstypes.DayEpochID, + 10, + true, + false, + }, + { + "[Period 0] with skipped epochs - period changes once enough epochs have passed", + 0, + currentEpochPeriod + 11, + epochstypes.DayEpochID, + 10, + true, + true, + }, + { + "[Period 1] with skipped epochs - period stays the same under epochs per period", + 1, + 2*currentEpochPeriod + 1, + epochstypes.DayEpochID, + 10, + true, + false, + }, + { + "[Period 1] with skipped epochs - period changes once enough epochs have passed", + 1, + 2*currentEpochPeriod + 11, + epochstypes.DayEpochID, + 10, + true, + true, + }, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { + params := nibiruApp.InflationKeeper.GetParams(ctx) + params.InflationEnabled = tc.InflationEnabled + nibiruApp.InflationKeeper.SetParams(ctx, params) + + nibiruApp.InflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) + nibiruApp.InflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) + + currentSkippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) + currentPeriod := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) + originalProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) + + // Perform Epoch Hooks + futureCtx := ctx.WithBlockTime(time.Now().Add(time.Minute)) + fmt.Println("tc.height", tc.height) + nibiruApp.EpochsKeeper.BeforeEpochStart(futureCtx, tc.epochIdentifier, tc.height) + nibiruApp.EpochsKeeper.AfterEpochEnd(futureCtx, tc.epochIdentifier, tc.height) + + skippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) + period := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) + + if tc.periodChanges { + fmt.Println("periodChanges", tc.periodChanges) + newProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) + + expectedProvision := types.CalculateEpochMintProvision( + nibiruApp.InflationKeeper.GetParams(ctx), + period, + ) + + fmt.Println("periodChanges", tc.periodChanges) + fmt.Println("newProvision", newProvision) + fmt.Println("expectedProvision", expectedProvision) + fmt.Println("originalProvision", originalProvision) + + require.Equal(t, expectedProvision, newProvision) + // mint provisions will change + require.NotEqual(t, newProvision, originalProvision) + require.Equal(t, currentSkippedEpochs, skippedEpochs) + require.Equal(t, currentPeriod+1, period) + } else { + require.Equal(t, currentPeriod, period) + if !tc.InflationEnabled { + // Check for epochIdentifier for skippedEpoch increment + if tc.epochIdentifier == epochstypes.DayEpochID { + require.Equal(t, currentSkippedEpochs+1, skippedEpochs) + } + } + } + }) + } +} diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go new file mode 100644 index 000000000..a03987427 --- /dev/null +++ b/x/inflation/keeper/inflation.go @@ -0,0 +1,144 @@ +package keeper + +import ( + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// MintAndAllocateInflation performs inflation minting and allocation +func (k Keeper) MintAndAllocateInflation( + ctx sdk.Context, + coins sdk.Coin, + params types.Params, +) ( + staking, strategic, community sdk.Coin, + err error, +) { + // skip as no coins need to be minted + if coins.Amount.IsNil() || !coins.Amount.IsPositive() { + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil + } + + // Mint coins for distribution + if err := k.MintCoins(ctx, coins); err != nil { + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + } + + // Allocate minted coins according to allocation proportions (staking, strategic, community pool) + return k.AllocatePolynomialInflation(ctx, coins, params) +} + +// MintCoins implements an alias call to the underlying supply keeper's +// MintCoins to be used in BeginBlocker. +func (k Keeper) MintCoins(ctx sdk.Context, coin sdk.Coin) error { + coins := sdk.Coins{coin} + return k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) +} + +// AllocatePolynomialInflation allocates coins from the inflation to external +// modules according to allocation proportions: +// - staking rewards -> sdk `auth` module fee collector +// - strategic reserves -> root account of x/sudo module +// - community pool -> `sdk `distr` module community pool +func (k Keeper) AllocatePolynomialInflation( + ctx sdk.Context, + mintedCoin sdk.Coin, + params types.Params, +) ( + staking, strategic, community sdk.Coin, + err error, +) { + inflationDistribution := params.InflationDistribution + inflationModuleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) + // Allocate staking rewards into fee collector account + staking = k.GetProportions(ctx, mintedCoin, inflationDistribution.StakingRewards) + + if err := k.bankKeeper.SendCoinsFromModuleToModule( + ctx, + types.ModuleName, + k.feeCollectorName, + sdk.NewCoins(staking), + ); err != nil { + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + } + + // Allocate community pool rewards into community pool + community = k.GetProportions(ctx, mintedCoin, inflationDistribution.CommunityPool) + + if err = k.distrKeeper.FundCommunityPool( + ctx, + sdk.NewCoins(community), + inflationModuleAddr, + ); err != nil { + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + } + + // Remaining balance is strategic reserve allocation to the root account of the x/sudo module + strategic = k.bankKeeper.GetBalance(ctx, inflationModuleAddr, denoms.NIBI) + strategicAccountAddr, err := k.sudoKeeper.GetRoot(ctx) + if err != nil { + k.Logger(ctx).Error("get root account error", "error", err) + return staking, strategic, community, nil + } + + if err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic)); err != nil { + k.Logger(ctx).Error("send coins to root account error", "error", err) + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil + } + + return staking, strategic, community, nil +} + +// GetAllocationProportion calculates the proportion of coins that is to be +// allocated during inflation for a given distribution. +func (k Keeper) GetProportions( + _ sdk.Context, + coin sdk.Coin, + proportion sdk.Dec, +) sdk.Coin { + return sdk.Coin{ + Denom: coin.Denom, + Amount: sdk.NewDecFromInt(coin.Amount).Mul(proportion).TruncateInt(), + } +} + +// GetCirculatingSupply returns the bank supply of the mintDenom excluding the +// team allocation in the first year +func (k Keeper) GetCirculatingSupply(ctx sdk.Context, mintDenom string) sdkmath.Int { + return k.bankKeeper.GetSupply(ctx, mintDenom).Amount +} + +// GetInflationRate returns the inflation rate for the current period. +func (k Keeper) GetInflationRate(ctx sdk.Context, mintDenom string) sdk.Dec { + epochMintProvision := k.GetEpochMintProvision(ctx) + if epochMintProvision.IsZero() { + return sdk.ZeroDec() + } + + circulatingSupply := k.GetCirculatingSupply(ctx, mintDenom) + if circulatingSupply.IsZero() { + return sdk.ZeroDec() + } + + // EpochMintProvision * 365 / circulatingSupply * 100 + circulatingSupplyToDec := sdk.NewDecFromInt(circulatingSupply) + return epochMintProvision. + MulInt64(int64(k.EpochsPerPeriod(ctx))). + MulInt64(int64(k.PeriodsPerYear(ctx))). + Quo(circulatingSupplyToDec). + Mul(sdk.NewDec(100)) +} + +// GetEpochMintProvision retrieves necessary params KV storage +// and calculate EpochMintProvision +func (k Keeper) GetEpochMintProvision(ctx sdk.Context) sdk.Dec { + peek := k.CurrentPeriod.Peek(ctx) + + return types.CalculateEpochMintProvision( + k.GetParams(ctx), + peek, + ) +} diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go new file mode 100644 index 000000000..0394dfc5e --- /dev/null +++ b/x/inflation/keeper/inflation_test.go @@ -0,0 +1,186 @@ +package keeper_test + +import ( + "fmt" + "testing" + + sdkmath "cosmossdk.io/math" + + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/app" + "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/x/inflation/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" +) + +func init() { + testapp.EnsureNibiruPrefix() +} + +func TestMintAndAllocateInflation(t *testing.T) { + testCases := []struct { + name string + coinsToMint sdk.Coin + expectedStakingAmt sdk.Coin + expectedStrategicAmt sdk.Coin + expectedCommunityAmt sdk.Coin + expectedStakingRewardsBalance sdk.Coin + expectedStrategicReservesBalance sdk.Coin + expectedCommunityPoolBalance sdk.DecCoins + rootAccount string + }{ + { + name: "pass", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", + }, + { + name: "pass - no coins minted ", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedStakingAmt: sdk.Coin{}, + expectedStrategicAmt: sdk.Coin{}, + expectedCommunityAmt: sdk.Coin{}, + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.ZeroInt()), + expectedCommunityPoolBalance: nil, + rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", + }, + { + name: "pass - no root account", + coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + rootAccount: "", + }, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + + if tc.rootAccount != "" { + t.Logf("setting root account to %s", tc.rootAccount) + nibiruApp.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ + Root: sdk.MustAccAddressFromBech32(tc.rootAccount).String(), + Contracts: []string{}, + }) + } + + staking, strategic, community, err := nibiruApp.InflationKeeper.MintAndAllocateInflation(ctx, tc.coinsToMint, types.DefaultParams()) + require.NoError(t, err) + assert.Equal(t, tc.expectedStakingAmt, staking) + assert.Equal(t, tc.expectedStrategicAmt, strategic) + assert.Equal(t, tc.expectedCommunityAmt, community) + + // Get balances + var balanceStrategicReserve sdk.Coin + if tc.rootAccount != "" { + strategicAccount, err := nibiruApp.SudoKeeper.GetRoot(ctx) + require.NoError(t, err) + balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance( + ctx, + strategicAccount, + denoms.NIBI, + ) + } else { + // if no root account is specified, then the strategic reserve remains in the x/inflation module account + balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance(ctx, nibiruApp.AccountKeeper.GetModuleAddress(types.ModuleName), denoms.NIBI) + } + + balanceStakingRewards := nibiruApp.BankKeeper.GetBalance( + ctx, + nibiruApp.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName), + denoms.NIBI, + ) + + balanceCommunityPool := nibiruApp.DistrKeeper.GetFeePoolCommunityCoins(ctx) + + require.NoError(t, err, tc.name) + assert.Equal(t, tc.expectedStakingRewardsBalance, balanceStakingRewards) + assert.Equal(t, tc.expectedStrategicReservesBalance, balanceStrategicReserve) + assert.Equal(t, tc.expectedCommunityPoolBalance, balanceCommunityPool) + }) + } +} + +func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { + testCases := []struct { + name string + supply sdkmath.Int + malleate func(nibiruApp *app.NibiruApp, ctx sdk.Context) + expInflationRate sdk.Dec + }{ + { + "no epochs per period", + sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), + func(nibiruApp *app.NibiruApp, ctx sdk.Context) { + nibiruApp.InflationKeeper.SetParams(ctx, types.Params{ + EpochsPerPeriod: 0, + InflationEnabled: true, + PolynomialFactors: types.DefaultPolynomialFactors, + InflationDistribution: types.DefaultInflationDistribution, + }) + }, + sdk.ZeroDec(), + }, + { + "high supply", + sdk.TokensFromConsensusPower(800_000_000, sdk.DefaultPowerReduction), + func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, + sdk.MustNewDecFromStr("27.095518287362700000"), + }, + { + "low supply", + sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), + func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, + sdk.MustNewDecFromStr("54.191036574725400000"), + }, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + + tc.malleate(nibiruApp, ctx) + + // Mint coins to increase supply + coin := sdk.NewCoin( + denoms.NIBI, + tc.supply, + ) + err := nibiruApp.InflationKeeper.MintCoins(ctx, coin) + require.NoError(t, err) + + circulatingSupply := nibiruApp.InflationKeeper.GetCirculatingSupply(ctx, denoms.NIBI) + require.EqualValues(t, tc.supply, circulatingSupply) + + inflationRate := nibiruApp.InflationKeeper.GetInflationRate(ctx, denoms.NIBI) + require.Equal(t, tc.expInflationRate, inflationRate) + }) + } +} + +func TestGetters(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + k := nibiruApp.InflationKeeper + require.NotPanics(t, func() { + _ = k.PolynomialFactors(ctx) + _ = k.PeriodsPerYear(ctx) + _ = k.InflationDistribution(ctx) + _ = k.InflationEnabled(ctx) + _ = k.EpochsPerPeriod(ctx) + }) +} diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go new file mode 100644 index 000000000..b9172322e --- /dev/null +++ b/x/inflation/keeper/keeper.go @@ -0,0 +1,72 @@ +package keeper + +import ( + "github.com/NibiruChain/collections" + "github.com/cometbft/cometbft/libs/log" + "github.com/cosmos/cosmos-sdk/codec" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// Keeper of the inflation store +type Keeper struct { + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + paramSpace paramstypes.Subspace + + // the address capable of executing a MsgUpdateParams message. Typically, this should be the x/gov module account. + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + distrKeeper types.DistrKeeper + stakingKeeper types.StakingKeeper + sudoKeeper types.SudoKeeper + feeCollectorName string + + CurrentPeriod collections.Sequence + NumSkippedEpochs collections.Sequence +} + +// NewKeeper creates a new mint Keeper instance +func NewKeeper( + cdc codec.BinaryCodec, + storeKey storetypes.StoreKey, + paramspace paramstypes.Subspace, + accountKeeper types.AccountKeeper, + bankKeeper types.BankKeeper, + distributionKeeper types.DistrKeeper, + stakingKeeper types.StakingKeeper, + sudoKeeper types.SudoKeeper, + feeCollectorName string, +) Keeper { + // ensure mint module account is set + if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { + panic("the inflation module account has not been set") + } + + // set KeyTable if it has not already been set + if !paramspace.HasKeyTable() { + paramspace = paramspace.WithKeyTable(types.ParamKeyTable()) + } + + return Keeper{ + storeKey: storeKey, + cdc: cdc, + paramSpace: paramspace, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + distrKeeper: distributionKeeper, + stakingKeeper: stakingKeeper, + sudoKeeper: sudoKeeper, + feeCollectorName: feeCollectorName, + CurrentPeriod: collections.NewSequence(storeKey, 0), + NumSkippedEpochs: collections.NewSequence(storeKey, 1), + } +} + +// Logger returns a module-specific logger. +func (k Keeper) Logger(ctx sdk.Context) log.Logger { + return ctx.Logger().With("module", "x/"+types.ModuleName) +} diff --git a/x/inflation/keeper/params.go b/x/inflation/keeper/params.go new file mode 100644 index 000000000..c741ff304 --- /dev/null +++ b/x/inflation/keeper/params.go @@ -0,0 +1,46 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// GetParams returns the total set of inflation parameters. +func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { + k.paramSpace.GetParamSet(ctx, ¶ms) + return +} + +// SetParams sets the inflation params in a single key +func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { + k.paramSpace.SetParamSet(ctx, ¶ms) +} + +// VotePeriod returns the number of blocks during which voting takes place. +func (k Keeper) PolynomialFactors(ctx sdk.Context) (res []sdk.Dec) { + k.paramSpace.Get(ctx, types.KeyPolynomialFactors, &res) + return +} + +// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. +func (k Keeper) InflationDistribution(ctx sdk.Context) (res types.InflationDistribution) { + k.paramSpace.Get(ctx, types.KeyInflationDistribution, &res) + return +} + +// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. +func (k Keeper) InflationEnabled(ctx sdk.Context) (res bool) { + k.paramSpace.Get(ctx, types.KeyInflationEnabled, &res) + return +} + +func (k Keeper) EpochsPerPeriod(ctx sdk.Context) (res uint64) { + k.paramSpace.Get(ctx, types.KeyEpochsPerPeriod, &res) + return +} + +func (k Keeper) PeriodsPerYear(ctx sdk.Context) (res uint64) { + k.paramSpace.Get(ctx, types.KeyPeriodsPerYear, &res) + return +} diff --git a/x/inflation/module.go b/x/inflation/module.go new file mode 100644 index 000000000..5265af192 --- /dev/null +++ b/x/inflation/module.go @@ -0,0 +1,171 @@ +package inflation + +import ( + "context" + "encoding/json" + "fmt" + + abci "github.com/cometbft/cometbft/abci/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/spf13/cobra" + + "github.com/NibiruChain/nibiru/x/inflation/client/cli" + "github.com/NibiruChain/nibiru/x/inflation/keeper" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// type check to ensure the interface is properly implemented +var ( + _ module.AppModule = AppModule{} + _ module.AppModuleBasic = AppModuleBasic{} + _ module.AppModuleSimulation = AppModule{} +) + +// app module Basics object +type AppModuleBasic struct{} + +// Name returns the inflation module's name. +func (AppModuleBasic) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec registers the inflation module's types on the given LegacyAmino codec. +func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + // types.RegisterLegacyAminoCodec(cdc) +} + +// ConsensusVersion returns the consensus state-breaking version for the module. +func (AppModuleBasic) ConsensusVersion() uint64 { + return 3 +} + +// RegisterInterfaces registers interfaces and implementations of the inflation +// module. +func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { +} + +// DefaultGenesis returns default genesis state as raw bytes for the inflation +// module. +func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { + return cdc.MustMarshalJSON(types.DefaultGenesisState()) +} + +// ValidateGenesis performs genesis state validation for the inflation module. +func (b AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { + var genesisState types.GenesisState + if err := cdc.UnmarshalJSON(bz, &genesisState); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + + return genesisState.Validate() +} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the inflation module. +func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { + if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { + panic(err) + } +} + +// GetTxCmd returns the root tx command for the inflation module. +func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } + +// GetQueryCmd returns no root query command for the inflation module. +func (AppModuleBasic) GetQueryCmd() *cobra.Command { + return cli.GetQueryCmd() +} + +// ___________________________________________________________________________ + +// AppModule implements an application module for the inflation module. +type AppModule struct { + AppModuleBasic + keeper keeper.Keeper + ak authkeeper.AccountKeeper + sk stakingkeeper.Keeper +} + +// NewAppModule creates a new AppModule Object +func NewAppModule( + k keeper.Keeper, + ak authkeeper.AccountKeeper, + sk stakingkeeper.Keeper, +) AppModule { + return AppModule{ + AppModuleBasic: AppModuleBasic{}, + keeper: k, + ak: ak, + sk: sk, + } +} + +// Name returns the inflation module's name. +func (AppModule) Name() string { + return types.ModuleName +} + +// RegisterInvariants registers the inflation module invariants. +func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} + +// RegisterServices registers a gRPC query service to respond to the +// module-specific gRPC queries. +func (am AppModule) RegisterServices(cfg module.Configurator) { + types.RegisterQueryServer(cfg.QueryServer(), am.keeper) +} + +// BeginBlock returns the begin blocker for the inflation module. +func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) { +} + +// EndBlock returns the end blocker for the inflation module. It returns no validator +// updates. +func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { + return []abci.ValidatorUpdate{} +} + +// InitGenesis performs genesis initialization for the inflation module. It returns +// no validator updates. +func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { + var genesisState types.GenesisState + + cdc.MustUnmarshalJSON(data, &genesisState) + InitGenesis(ctx, am.keeper, am.ak, am.sk, genesisState) + return []abci.ValidatorUpdate{} +} + +// ExportGenesis returns the exported genesis state as raw bytes for the inflation +// module. +func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { + gs := ExportGenesis(ctx, am.keeper) + return cdc.MustMarshalJSON(gs) +} + +// ___________________________________________________________________________ + +// AppModuleSimulation functions + +// GenerateGenesisState creates a randomized GenState of the inflation module. +func (am AppModule) GenerateGenesisState(_ *module.SimulationState) { +} + +// ProposalContents doesn't return any content functions for governance proposals. +func (am AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalMsg { + return []simtypes.WeightedProposalMsg{} +} + +// RegisterStoreDecoder registers a decoder for inflation module's types. +func (am AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { +} + +// WeightedOperations doesn't return any inflation module operation. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return []simtypes.WeightedOperation{} +} diff --git a/x/inflation/types/events.go b/x/inflation/types/events.go new file mode 100644 index 000000000..5f6374c54 --- /dev/null +++ b/x/inflation/types/events.go @@ -0,0 +1,9 @@ +package types + +// Minting module event types +const ( + EventTypeMint = ModuleName + + AttributeKeyEpochProvisions = "epoch_provisions" + AttributeEpochNumber = "epoch_number" +) diff --git a/x/inflation/types/export.go b/x/inflation/types/export.go new file mode 100644 index 000000000..fb4b6e3b6 --- /dev/null +++ b/x/inflation/types/export.go @@ -0,0 +1,12 @@ +package types + +import ( + grpc "google.golang.org/grpc" +) + +// GrpcQueryServiceDesc represents the query server's RPC service specification. +// This gives access to the service name and method names needed for stargate +// queries. +func GrpcQueryServiceDesc() grpc.ServiceDesc { + return _Query_serviceDesc +} diff --git a/x/inflation/types/genesis.go b/x/inflation/types/genesis.go new file mode 100644 index 000000000..e85896bfa --- /dev/null +++ b/x/inflation/types/genesis.go @@ -0,0 +1,37 @@ +package types + +// NewGenesisState creates a new GenesisState object +func NewGenesisState( + params Params, + period uint64, + skippedEpochs uint64, +) GenesisState { + return GenesisState{ + Params: params, + Period: period, + SkippedEpochs: skippedEpochs, + } +} + +// DefaultGenesisState creates a default GenesisState object +func DefaultGenesisState() *GenesisState { + return &GenesisState{ + Params: DefaultParams(), + Period: 0, + SkippedEpochs: 0, + } +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + if err := validateUint64(gs.SkippedEpochs); err != nil { + return err + } + + if err := validateUint64(gs.Period); err != nil { + return err + } + + return gs.Params.Validate() +} diff --git a/x/inflation/types/genesis.pb.go b/x/inflation/types/genesis.pb.go new file mode 100644 index 000000000..61e7d72ce --- /dev/null +++ b/x/inflation/types/genesis.pb.go @@ -0,0 +1,797 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: nibiru/inflation/v1/genesis.proto + +package types + +import ( + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// GenesisState defines the inflation module's genesis state. +type GenesisState struct { + // params defines all the parameters of the module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + // period is the amount of past periods, based on the epochs per period param + Period uint64 `protobuf:"varint,2,opt,name=period,proto3" json:"period,omitempty"` + // skipped_epochs is the number of epochs that have passed while inflation is + // disabled + SkippedEpochs uint64 `protobuf:"varint,3,opt,name=skipped_epochs,json=skippedEpochs,proto3" json:"skipped_epochs,omitempty"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_2d00e2bb98c08f74, []int{0} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func (m *GenesisState) GetPeriod() uint64 { + if m != nil { + return m.Period + } + return 0 +} + +func (m *GenesisState) GetSkippedEpochs() uint64 { + if m != nil { + return m.SkippedEpochs + } + return 0 +} + +// Params holds parameters for the inflation module. +type Params struct { + // inflation_enabled is the parameter that enables inflation and halts + // increasing the skipped_epochs + InflationEnabled bool `protobuf:"varint,1,opt,name=inflation_enabled,json=inflationEnabled,proto3" json:"inflation_enabled,omitempty"` + // polynomial_factors takes in the variables to calculate polynomial + // inflation + PolynomialFactors []github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,rep,name=polynomial_factors,json=polynomialFactors,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"polynomial_factors"` + // inflation_distribution of the minted denom + InflationDistribution InflationDistribution `protobuf:"bytes,3,opt,name=inflation_distribution,json=inflationDistribution,proto3" json:"inflation_distribution"` + // epochs_per_period is the number of epochs that must pass before a new + // period is created + EpochsPerPeriod uint64 `protobuf:"varint,4,opt,name=epochs_per_period,json=epochsPerPeriod,proto3" json:"epochs_per_period,omitempty"` + // periods_per_year is the number of periods that occur in a year + PeriodsPerYear uint64 `protobuf:"varint,5,opt,name=periods_per_year,json=periodsPerYear,proto3" json:"periods_per_year,omitempty"` + // max_period is the maximum number of periods that have inflation being + // paid off. After this period, inflation will be disabled. + MaxPeriod uint64 `protobuf:"varint,6,opt,name=max_period,json=maxPeriod,proto3" json:"max_period,omitempty"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_2d00e2bb98c08f74, []int{1} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetInflationEnabled() bool { + if m != nil { + return m.InflationEnabled + } + return false +} + +func (m *Params) GetInflationDistribution() InflationDistribution { + if m != nil { + return m.InflationDistribution + } + return InflationDistribution{} +} + +func (m *Params) GetEpochsPerPeriod() uint64 { + if m != nil { + return m.EpochsPerPeriod + } + return 0 +} + +func (m *Params) GetPeriodsPerYear() uint64 { + if m != nil { + return m.PeriodsPerYear + } + return 0 +} + +func (m *Params) GetMaxPeriod() uint64 { + if m != nil { + return m.MaxPeriod + } + return 0 +} + +func init() { + proto.RegisterType((*GenesisState)(nil), "nibiru.inflation.v1.GenesisState") + proto.RegisterType((*Params)(nil), "nibiru.inflation.v1.Params") +} + +func init() { proto.RegisterFile("nibiru/inflation/v1/genesis.proto", fileDescriptor_2d00e2bb98c08f74) } + +var fileDescriptor_2d00e2bb98c08f74 = []byte{ + // 438 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0x6e, 0xd4, 0x30, + 0x10, 0xc6, 0x37, 0xdb, 0x25, 0xa2, 0x2e, 0x94, 0xae, 0x81, 0x2a, 0x2a, 0x22, 0x5d, 0x8a, 0x40, + 0x51, 0x11, 0xb6, 0x5a, 0x4e, 0x5c, 0x97, 0x16, 0xd4, 0x0b, 0x8a, 0xc2, 0x09, 0x24, 0x14, 0x39, + 0x89, 0x9b, 0xb5, 0x9a, 0xc4, 0x96, 0xed, 0xad, 0x76, 0xdf, 0x80, 0x23, 0x8f, 0xd5, 0x63, 0x8f, + 0x88, 0x43, 0x85, 0x76, 0xdf, 0x80, 0x27, 0xa8, 0xd6, 0xf6, 0xfe, 0x39, 0xe4, 0x94, 0xcc, 0xcc, + 0x6f, 0xbe, 0x19, 0x7f, 0x1a, 0xf0, 0xaa, 0x61, 0x19, 0x93, 0x63, 0xcc, 0x9a, 0xcb, 0x8a, 0x68, + 0xc6, 0x1b, 0x7c, 0x7d, 0x82, 0x4b, 0xda, 0x50, 0xc5, 0x14, 0x12, 0x92, 0x6b, 0x0e, 0x9f, 0x5a, + 0x04, 0xad, 0x10, 0x74, 0x7d, 0x72, 0xf0, 0xac, 0xe4, 0x25, 0x37, 0x75, 0xbc, 0xf8, 0xb3, 0xe8, + 0xc1, 0xeb, 0x36, 0xb5, 0x75, 0x9f, 0x81, 0x8e, 0x7e, 0x79, 0xe0, 0xd1, 0x17, 0x3b, 0xe1, 0x9b, + 0x26, 0x9a, 0xc2, 0x8f, 0xc0, 0x17, 0x44, 0x92, 0x5a, 0x05, 0xde, 0xc0, 0x8b, 0x76, 0x4e, 0x5f, + 0xa0, 0x96, 0x89, 0x28, 0x36, 0xc8, 0xb0, 0x77, 0x73, 0x77, 0xd8, 0x49, 0x5c, 0x03, 0xdc, 0x07, + 0xbe, 0xa0, 0x92, 0xf1, 0x22, 0xe8, 0x0e, 0xbc, 0xa8, 0x97, 0xb8, 0x08, 0xbe, 0x01, 0xbb, 0xea, + 0x8a, 0x09, 0x41, 0x8b, 0x94, 0x0a, 0x9e, 0x8f, 0x54, 0xb0, 0x65, 0xea, 0x8f, 0x5d, 0xf6, 0xdc, + 0x24, 0x8f, 0xfe, 0x77, 0x81, 0x6f, 0x75, 0xe1, 0x3b, 0xd0, 0x5f, 0x8d, 0x4b, 0x69, 0x43, 0xb2, + 0x8a, 0x16, 0x66, 0x9f, 0x87, 0xc9, 0xde, 0xaa, 0x70, 0x6e, 0xf3, 0xf0, 0x27, 0x80, 0x82, 0x57, + 0xd3, 0x86, 0xd7, 0x8c, 0x54, 0xe9, 0x25, 0xc9, 0x35, 0x97, 0x2a, 0xe8, 0x0e, 0xb6, 0xa2, 0xed, + 0x21, 0x5a, 0x2c, 0xf8, 0xf7, 0xee, 0xf0, 0x6d, 0xc9, 0xf4, 0x68, 0x9c, 0xa1, 0x9c, 0xd7, 0x38, + 0xe7, 0xaa, 0xe6, 0xca, 0x7d, 0xde, 0xab, 0xe2, 0x0a, 0xeb, 0xa9, 0xa0, 0x0a, 0x9d, 0xd1, 0x3c, + 0xe9, 0xaf, 0x95, 0x3e, 0x5b, 0x21, 0x58, 0x82, 0xfd, 0xf5, 0x2e, 0x05, 0x53, 0x5a, 0xb2, 0x6c, + 0xbc, 0x08, 0xcc, 0x2b, 0x76, 0x4e, 0x8f, 0x5b, 0x0d, 0xba, 0x58, 0x06, 0x67, 0x1b, 0x1d, 0xce, + 0xaf, 0xe7, 0xac, 0xad, 0x08, 0x8f, 0x41, 0xdf, 0xda, 0x93, 0x0a, 0x2a, 0x53, 0xe7, 0x64, 0xcf, + 0x38, 0xf5, 0xc4, 0x16, 0x62, 0x2a, 0x63, 0x6b, 0x69, 0x04, 0xf6, 0x2c, 0x60, 0xe1, 0x29, 0x25, + 0x32, 0x78, 0x60, 0xd0, 0x5d, 0x97, 0x8f, 0xa9, 0xfc, 0x4e, 0x89, 0x84, 0x2f, 0x01, 0xa8, 0xc9, + 0x64, 0x29, 0xe7, 0x1b, 0x66, 0xbb, 0x26, 0x13, 0x2b, 0x34, 0xbc, 0xb8, 0x99, 0x85, 0xde, 0xed, + 0x2c, 0xf4, 0xfe, 0xcd, 0x42, 0xef, 0xf7, 0x3c, 0xec, 0xdc, 0xce, 0xc3, 0xce, 0x9f, 0x79, 0xd8, + 0xf9, 0x81, 0x37, 0x2c, 0xfb, 0x6a, 0x5e, 0xf8, 0x69, 0x44, 0x58, 0x83, 0xdd, 0x55, 0x4d, 0x36, + 0xee, 0xca, 0xf8, 0x97, 0xf9, 0xe6, 0xa2, 0x3e, 0xdc, 0x07, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x56, + 0x6e, 0x63, 0xc6, 0x02, 0x00, 0x00, +} + +func (m *GenesisState) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SkippedEpochs != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.SkippedEpochs)) + i-- + dAtA[i] = 0x18 + } + if m.Period != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.Period)) + i-- + dAtA[i] = 0x10 + } + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *Params) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MaxPeriod != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.MaxPeriod)) + i-- + dAtA[i] = 0x30 + } + if m.PeriodsPerYear != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.PeriodsPerYear)) + i-- + dAtA[i] = 0x28 + } + if m.EpochsPerPeriod != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.EpochsPerPeriod)) + i-- + dAtA[i] = 0x20 + } + { + size, err := m.InflationDistribution.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.PolynomialFactors) > 0 { + for iNdEx := len(m.PolynomialFactors) - 1; iNdEx >= 0; iNdEx-- { + { + size := m.PolynomialFactors[iNdEx].Size() + i -= size + if _, err := m.PolynomialFactors[iNdEx].MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.InflationEnabled { + i-- + if m.InflationEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) + if m.Period != 0 { + n += 1 + sovGenesis(uint64(m.Period)) + } + if m.SkippedEpochs != 0 { + n += 1 + sovGenesis(uint64(m.SkippedEpochs)) + } + return n +} + +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.InflationEnabled { + n += 2 + } + if len(m.PolynomialFactors) > 0 { + for _, e := range m.PolynomialFactors { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + l = m.InflationDistribution.Size() + n += 1 + l + sovGenesis(uint64(l)) + if m.EpochsPerPeriod != 0 { + n += 1 + sovGenesis(uint64(m.EpochsPerPeriod)) + } + if m.PeriodsPerYear != 0 { + n += 1 + sovGenesis(uint64(m.PeriodsPerYear)) + } + if m.MaxPeriod != 0 { + n += 1 + sovGenesis(uint64(m.MaxPeriod)) + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GenesisState) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType) + } + m.Period = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Period |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkippedEpochs", wireType) + } + m.SkippedEpochs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SkippedEpochs |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InflationEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.InflationEnabled = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PolynomialFactors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.PolynomialFactors = append(m.PolynomialFactors, v) + if err := m.PolynomialFactors[len(m.PolynomialFactors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InflationDistribution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.InflationDistribution.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochsPerPeriod", wireType) + } + m.EpochsPerPeriod = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochsPerPeriod |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PeriodsPerYear", wireType) + } + m.PeriodsPerYear = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PeriodsPerYear |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxPeriod", wireType) + } + m.MaxPeriod = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxPeriod |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/inflation/types/genesis_test.go b/x/inflation/types/genesis_test.go new file mode 100644 index 000000000..1c89d6d15 --- /dev/null +++ b/x/inflation/types/genesis_test.go @@ -0,0 +1,57 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateGenesis(t *testing.T) { + // Team Address needs to be set manually at Genesis + validParams := DefaultParams() + + newGen := NewGenesisState(validParams, 0, 0) + + testCases := []struct { + name string + genState *GenesisState + expPass bool + }{ + { + "empty genesis", + &GenesisState{}, + false, + }, + { + "invalid default genesis", + DefaultGenesisState(), + true, + }, + { + "valid genesis constructor", + &newGen, + true, + }, + { + "valid genesis", + &GenesisState{ + Params: validParams, + Period: 5, + SkippedEpochs: 0, + }, + true, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.genState.Validate() + if tc.expPass { + require.NoError(t, err, tc.name) + } else { + require.Error(t, err, tc.name) + } + }) + } +} diff --git a/x/inflation/types/inflation.pb.go b/x/inflation/types/inflation.pb.go new file mode 100644 index 000000000..632c86ebf --- /dev/null +++ b/x/inflation/types/inflation.pb.go @@ -0,0 +1,425 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: nibiru/inflation/v1/inflation.proto + +package types + +import ( + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// InflationDistribution defines the distribution in which inflation is +// allocated through minting on each epoch (staking, community, strategic). It +// excludes the team vesting distribution. +type InflationDistribution struct { + // staking_rewards defines the proportion of the minted_denom that is + // to be allocated as staking rewards + StakingRewards github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=staking_rewards,json=stakingRewards,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"staking_rewards"` + // community_pool defines the proportion of the minted_denom that is to + // be allocated to the community pool + CommunityPool github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=community_pool,json=communityPool,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"community_pool"` + // strategic_reserves defines the proportion of the minted_denom that + // is to be allocated to the strategic reserves module address + StrategicReserves github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=strategic_reserves,json=strategicReserves,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"strategic_reserves"` +} + +func (m *InflationDistribution) Reset() { *m = InflationDistribution{} } +func (m *InflationDistribution) String() string { return proto.CompactTextString(m) } +func (*InflationDistribution) ProtoMessage() {} +func (*InflationDistribution) Descriptor() ([]byte, []int) { + return fileDescriptor_37da805e9a324a97, []int{0} +} +func (m *InflationDistribution) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *InflationDistribution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_InflationDistribution.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *InflationDistribution) XXX_Merge(src proto.Message) { + xxx_messageInfo_InflationDistribution.Merge(m, src) +} +func (m *InflationDistribution) XXX_Size() int { + return m.Size() +} +func (m *InflationDistribution) XXX_DiscardUnknown() { + xxx_messageInfo_InflationDistribution.DiscardUnknown(m) +} + +var xxx_messageInfo_InflationDistribution proto.InternalMessageInfo + +func init() { + proto.RegisterType((*InflationDistribution)(nil), "nibiru.inflation.v1.InflationDistribution") +} + +func init() { + proto.RegisterFile("nibiru/inflation/v1/inflation.proto", fileDescriptor_37da805e9a324a97) +} + +var fileDescriptor_37da805e9a324a97 = []byte{ + // 284 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xce, 0xcb, 0x4c, 0xca, + 0x2c, 0x2a, 0xd5, 0xcf, 0xcc, 0x4b, 0xcb, 0x49, 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x2f, 0x33, 0x44, + 0x70, 0xf4, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, 0x85, 0x84, 0x21, 0x8a, 0xf4, 0x10, 0xe2, 0x65, 0x86, + 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0x79, 0x7d, 0x10, 0x0b, 0xa2, 0x54, 0x69, 0x19, 0x13, + 0x97, 0xa8, 0x27, 0x4c, 0x99, 0x4b, 0x66, 0x71, 0x49, 0x51, 0x66, 0x52, 0x29, 0x88, 0x2d, 0x14, + 0xce, 0xc5, 0x5f, 0x5c, 0x92, 0x98, 0x9d, 0x99, 0x97, 0x1e, 0x5f, 0x94, 0x5a, 0x9e, 0x58, 0x94, + 0x52, 0x2c, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xe9, 0xa4, 0x77, 0xe2, 0x9e, 0x3c, 0xc3, 0xad, 0x7b, + 0xf2, 0x6a, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xc9, 0xf9, 0xc5, + 0xb9, 0xf9, 0xc5, 0x50, 0x4a, 0xb7, 0x38, 0x25, 0x5b, 0xbf, 0xa4, 0xb2, 0x20, 0xb5, 0x58, 0xcf, + 0x25, 0x35, 0x39, 0x88, 0x0f, 0x6a, 0x4c, 0x10, 0xc4, 0x14, 0xa1, 0x50, 0x2e, 0xbe, 0xe4, 0xfc, + 0xdc, 0xdc, 0xd2, 0xbc, 0xcc, 0x92, 0xca, 0xf8, 0x82, 0xfc, 0xfc, 0x1c, 0x09, 0x26, 0xb2, 0xcc, + 0xe5, 0x85, 0x9b, 0x12, 0x90, 0x9f, 0x9f, 0x23, 0x14, 0xcb, 0x25, 0x54, 0x5c, 0x52, 0x94, 0x58, + 0x92, 0x9a, 0x9e, 0x99, 0x1c, 0x5f, 0x94, 0x5a, 0x9c, 0x5a, 0x54, 0x96, 0x5a, 0x2c, 0xc1, 0x4c, + 0x96, 0xd1, 0x82, 0x70, 0x93, 0x82, 0xa0, 0x06, 0x39, 0x79, 0x9e, 0x78, 0x24, 0xc7, 0x78, 0xe1, + 0x91, 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x13, 0x1e, 0xcb, 0x31, 0x5c, 0x78, 0x2c, 0xc7, 0x70, + 0xe3, 0xb1, 0x1c, 0x43, 0x94, 0x3e, 0x92, 0xa1, 0x7e, 0xe0, 0x80, 0x77, 0xce, 0x48, 0xcc, 0xcc, + 0xd3, 0x87, 0xc6, 0x54, 0x05, 0x52, 0x5c, 0x81, 0x6d, 0x48, 0x62, 0x03, 0x07, 0xbd, 0x31, 0x20, + 0x00, 0x00, 0xff, 0xff, 0x75, 0xbf, 0x6b, 0xae, 0xcc, 0x01, 0x00, 0x00, +} + +func (m *InflationDistribution) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InflationDistribution) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *InflationDistribution) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.StrategicReserves.Size() + i -= size + if _, err := m.StrategicReserves.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintInflation(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size := m.CommunityPool.Size() + i -= size + if _, err := m.CommunityPool.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintInflation(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size := m.StakingRewards.Size() + i -= size + if _, err := m.StakingRewards.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintInflation(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintInflation(dAtA []byte, offset int, v uint64) int { + offset -= sovInflation(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *InflationDistribution) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.StakingRewards.Size() + n += 1 + l + sovInflation(uint64(l)) + l = m.CommunityPool.Size() + n += 1 + l + sovInflation(uint64(l)) + l = m.StrategicReserves.Size() + n += 1 + l + sovInflation(uint64(l)) + return n +} + +func sovInflation(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozInflation(x uint64) (n int) { + return sovInflation(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *InflationDistribution) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowInflation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InflationDistribution: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InflationDistribution: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingRewards", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowInflation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthInflation + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthInflation + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StakingRewards.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CommunityPool", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowInflation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthInflation + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthInflation + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.CommunityPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StrategicReserves", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowInflation + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthInflation + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthInflation + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StrategicReserves.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipInflation(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthInflation + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipInflation(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowInflation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowInflation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowInflation + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthInflation + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupInflation + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthInflation + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthInflation = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowInflation = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupInflation = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/inflation/types/inflation_calculation.go b/x/inflation/types/inflation_calculation.go new file mode 100644 index 000000000..e1c6d2c38 --- /dev/null +++ b/x/inflation/types/inflation_calculation.go @@ -0,0 +1,39 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// CalculateEpochProvisions returns mint provision per epoch +func CalculateEpochMintProvision( + params Params, + period uint64, +) sdk.Dec { + if params.EpochsPerPeriod == 0 || !params.InflationEnabled || period >= params.MaxPeriod { + return sdk.ZeroDec() + } + + // truncating to the nearest integer + x := period + + // Calculate the value of the polynomial at x + polynomialValue := polynomial(params.PolynomialFactors, sdk.NewDec(int64(x))) + + if polynomialValue.IsNegative() { + // Just to make sure nothing weird occur + return sdk.ZeroDec() + } + + return polynomialValue.Quo(sdk.NewDec(int64(params.EpochsPerPeriod))) +} + +// Compute the value of x given the polynomial factors +func polynomial(factors []sdk.Dec, x sdk.Dec) sdk.Dec { + result := sdk.ZeroDec() + for i, factor := range factors { + result = result.Add(factor.Mul(x.Power(uint64(len(factors) - i - 1)))) + } + + // Multiply by 1 million to get the value in unibi + return result.Mul(sdk.NewDec(1_000_000)) +} diff --git a/x/inflation/types/inflation_calculation_test.go b/x/inflation/types/inflation_calculation_test.go new file mode 100644 index 000000000..a63701e87 --- /dev/null +++ b/x/inflation/types/inflation_calculation_test.go @@ -0,0 +1,70 @@ +package types + +import ( + fmt "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" +) + +// These numbers are for year n month 1 +var ExpectedYearlyInflation = []sdk.Dec{ + sdk.NewDec(195_895_391_000_000), + sdk.NewDec(156_348_637_000_000), + sdk.NewDec(124_785_459_000_000), + sdk.NewDec(99_594_157_000_000), + sdk.NewDec(79_488_398_000_000), + sdk.NewDec(63_441_527_000_000), + sdk.NewDec(50_634_148_000_000), + sdk.NewDec(40_412_283_000_000), +} + +var ExpectedTotalInflation = sdk.NewDec(810_600_000_000_000) + +func TestCalculateEpochMintProvision(t *testing.T) { + params := DefaultParams() + + epochId := uint64(0) + totalInflation := sdk.ZeroDec() + + // Only the first 8 years have inflation with default params + for year := uint64(0); year < 10; year++ { + yearlyInflation := sdk.ZeroDec() + for month := uint64(0); month < 12; month++ { + for day := uint64(0); day < 30; day++ { + epochMintProvisions := CalculateEpochMintProvision(params, epochId) + yearlyInflation = yearlyInflation.Add(epochMintProvisions) + } + epochId++ + } + // Should be within 0.0098% + if year < uint64(len(ExpectedYearlyInflation)) { + require.NoError(t, withingRange(yearlyInflation, ExpectedYearlyInflation[year])) + } else { + require.Equal(t, yearlyInflation, sdk.ZeroDec()) + } + totalInflation = totalInflation.Add(yearlyInflation) + } + require.NoError(t, withingRange(totalInflation, ExpectedTotalInflation)) +} + +func TestCalculateEpochMintProvision_ZeroEpochs(t *testing.T) { + params := DefaultParams() + params.EpochsPerPeriod = 0 + + epochMintProvisions := CalculateEpochMintProvision(params, 1) + require.Equal(t, epochMintProvisions, sdk.ZeroDec()) +} + +// withingRange returns an error if the actual value is not within the expected value +/- tolerance +// tolerance is a percentage set to 0.01% by default +func withingRange(expected, actual sdk.Dec) error { + tolerance := sdk.NewDecWithPrec(1, 4) + is_within := expected.Sub(actual).Abs().Quo(expected).LTE(tolerance) + if !is_within { + tolerancePercent := tolerance.Mul(sdk.NewDec(100)) + return fmt.Errorf("expected %s to be within %s%% of %s", actual.String(), tolerancePercent.String(), expected.String()) + } + return nil +} diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go new file mode 100644 index 000000000..17b3a362e --- /dev/null +++ b/x/inflation/types/interfaces.go @@ -0,0 +1,45 @@ +package types // noalias + +import ( + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// AccountKeeper defines the contract required for account APIs. +type AccountKeeper interface { + GetModuleAddress(name string) sdk.AccAddress + GetModuleAccount(ctx sdk.Context, moduleName string) types.ModuleAccountI + GetAccount(sdk.Context, sdk.AccAddress) types.AccountI + SetAccount(sdk.Context, types.AccountI) +} + +// BankKeeper defines the contract needed to be fulfilled for banking and supply +// dependencies. +type BankKeeper interface { + GetBalance(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Coin + GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error + SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error + MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error + BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error + HasSupply(ctx sdk.Context, denom string) bool + GetSupply(ctx sdk.Context, denom string) sdk.Coin +} + +// DistrKeeper defines the contract needed to be fulfilled for distribution keeper +type DistrKeeper interface { + FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error +} + +// StakingKeeper expected staking keeper +type StakingKeeper interface { + // BondedRatio the fraction of the staking tokens which are currently bonded + BondedRatio(ctx sdk.Context) sdk.Dec + StakingTokenSupply(ctx sdk.Context) sdkmath.Int + TotalBondedTokens(ctx sdk.Context) sdkmath.Int +} + +type SudoKeeper interface { + GetRoot(ctx sdk.Context) (sdk.AccAddress, error) +} diff --git a/x/inflation/types/keys.go b/x/inflation/types/keys.go new file mode 100644 index 000000000..62bef8202 --- /dev/null +++ b/x/inflation/types/keys.go @@ -0,0 +1,13 @@ +package types + +// constants +const ( + // module name + ModuleName = "inflation" + + // StoreKey to be used when creating the KVStore + StoreKey = ModuleName + + // RouterKey to be used for message routing + RouterKey = ModuleName +) diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go new file mode 100644 index 000000000..9d0be967a --- /dev/null +++ b/x/inflation/types/params.go @@ -0,0 +1,189 @@ +package types + +import ( + "errors" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +var ( + KeyInflationEnabled = []byte("InflationEnabled") + KeyPolynomialFactors = []byte("PolynomialFactors") + KeyInflationDistribution = []byte("InflationDistribution") + KeyEpochsPerPeriod = []byte("EpochsPerPeriod") + KeyPeriodsPerYear = []byte("PeriodsPerYear") + KeyMaxPeriod = []byte("MaxPeriod") +) + +var ( + DefaultInflation = true + DefaultPolynomialFactors = []sdk.Dec{ + sdk.MustNewDecFromStr("-0.00014903"), + sdk.MustNewDecFromStr("0.07527647"), + sdk.MustNewDecFromStr("-19.11742154"), + sdk.MustNewDecFromStr("3170.0969905"), + sdk.MustNewDecFromStr("-339271.31060432"), + sdk.MustNewDecFromStr("18063678.8582418"), + } + DefaultInflationDistribution = InflationDistribution{ + StakingRewards: sdk.NewDecWithPrec(27_8, 3), // 27.8% + CommunityPool: sdk.NewDecWithPrec(62_20, 4), // 62.20% + StrategicReserves: sdk.NewDecWithPrec(10, 2), // 10% + } + DefaultEpochsPerPeriod = uint64(30) + DefaultPeriodsPerYear = uint64(12) + DefaultMaxPeriod = uint64(8 * 12) // 8 years with 360 days per year +) + +func NewParams( + polynomialCalculation []sdk.Dec, + inflationDistribution InflationDistribution, + inflationEnabled bool, + epochsPerPeriod, + periodsPerYear, + maxPeriod uint64, +) Params { + return Params{ + PolynomialFactors: polynomialCalculation, + InflationDistribution: inflationDistribution, + InflationEnabled: inflationEnabled, + EpochsPerPeriod: epochsPerPeriod, + PeriodsPerYear: periodsPerYear, + MaxPeriod: maxPeriod, + } +} + +// default minting module parameters +func DefaultParams() Params { + return Params{ + PolynomialFactors: DefaultPolynomialFactors, + InflationDistribution: DefaultInflationDistribution, + InflationEnabled: DefaultInflation, + EpochsPerPeriod: DefaultEpochsPerPeriod, + PeriodsPerYear: DefaultPeriodsPerYear, + MaxPeriod: DefaultMaxPeriod, + } +} + +// ParamKeyTable returns the parameter key table. +func ParamKeyTable() paramstypes.KeyTable { + return paramstypes.NewKeyTable().RegisterParamSet(&Params{}) +} + +var _ paramstypes.ParamSet = (*Params)(nil) + +// ParamSetPairs returns all the of key, value type, and validation function +// for each module parameter. ParamSetPairs implements the ParamSet interface. +func (p *Params) ParamSetPairs() paramstypes.ParamSetPairs { + return paramstypes.ParamSetPairs{ + paramstypes.NewParamSetPair(KeyInflationEnabled, &p.InflationEnabled, validateBool), + paramstypes.NewParamSetPair(KeyPolynomialFactors, &p.PolynomialFactors, validatePolynomialFactors), + paramstypes.NewParamSetPair(KeyInflationDistribution, &p.InflationDistribution, validateInflationDistribution), + paramstypes.NewParamSetPair(KeyEpochsPerPeriod, &p.EpochsPerPeriod, validateUint64), + paramstypes.NewParamSetPair(KeyPeriodsPerYear, &p.PeriodsPerYear, validateUint64), + paramstypes.NewParamSetPair(KeyMaxPeriod, &p.MaxPeriod, validateUint64), + } +} + +func validatePolynomialFactors(i interface{}) error { + v, ok := i.([]sdk.Dec) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if len(v) == 0 { + return errors.New("polynomial factors cannot be empty") + } + return nil +} + +func validateInflationDistribution(i interface{}) error { + v, ok := i.(InflationDistribution) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if v.StakingRewards.IsNegative() { + return errors.New("staking distribution ratio must not be negative") + } + + if v.CommunityPool.IsNegative() { + return errors.New("community pool distribution ratio must not be negative") + } + + if v.StrategicReserves.IsNegative() { + return errors.New("pool incentives distribution ratio must not be negative") + } + + totalProportions := v.StakingRewards.Add(v.StrategicReserves).Add(v.CommunityPool) + if !totalProportions.Equal(sdk.OneDec()) { + return errors.New("total distributions ratio should be 1") + } + + return nil +} + +func validateBool(i interface{}) error { + _, ok := i.(bool) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + return nil +} + +func validateUint64(i interface{}) error { + _, ok := i.(uint64) + if !ok { + return fmt.Errorf("invalid genesis state type: %T", i) + } + return nil +} + +func validateEpochsPerPeriod(i interface{}) error { + val, ok := i.(uint64) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if val <= 0 { + return fmt.Errorf("epochs per period must be positive: %d", val) + } + + return nil +} + +func validatePeriodsPerYear(i interface{}) error { + val, ok := i.(uint64) + if !ok { + return fmt.Errorf("invalid parameter type: %T", i) + } + + if val <= 0 { + return fmt.Errorf("periods per year must be positive: %d", val) + } + + return nil +} + +func (p Params) Validate() error { + if err := validateEpochsPerPeriod(p.EpochsPerPeriod); err != nil { + return err + } + if err := validatePeriodsPerYear(p.PeriodsPerYear); err != nil { + return err + } + if err := validatePolynomialFactors(p.PolynomialFactors); err != nil { + return err + } + if err := validateInflationDistribution(p.InflationDistribution); err != nil { + return err + } + if err := validateUint64(p.MaxPeriod); err != nil { + return err + } + + return validateBool(p.InflationEnabled) +} diff --git a/x/inflation/types/params_test.go b/x/inflation/types/params_test.go new file mode 100644 index 000000000..805855c36 --- /dev/null +++ b/x/inflation/types/params_test.go @@ -0,0 +1,170 @@ +package types_test + +import ( + "testing" + + storetypes "github.com/cosmos/cosmos-sdk/store/types" + + "github.com/NibiruChain/nibiru/app/codec" + inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +func TestParamsValidate(t *testing.T) { + testCases := []struct { + name string + params inflationtypes.Params + expError bool + }{ + { + "default", + inflationtypes.DefaultParams(), + false, + }, + { + "valid", + inflationtypes.NewParams( + inflationtypes.DefaultPolynomialFactors, + inflationtypes.DefaultInflationDistribution, + true, + inflationtypes.DefaultEpochsPerPeriod, + inflationtypes.DefaultPeriodsPerYear, + inflationtypes.DefaultMaxPeriod, + ), + false, + }, + { + "valid param literal", + inflationtypes.Params{ + PolynomialFactors: inflationtypes.DefaultPolynomialFactors, + InflationDistribution: inflationtypes.DefaultInflationDistribution, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + false, + }, + { + "invalid - polynomial calculation - no coefficient", + inflationtypes.Params{ + PolynomialFactors: []sdk.Dec{}, + InflationDistribution: inflationtypes.DefaultInflationDistribution, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + true, + }, + { + "invalid - inflation distribution - negative staking rewards", + inflationtypes.Params{ + PolynomialFactors: inflationtypes.DefaultPolynomialFactors, + InflationDistribution: inflationtypes.InflationDistribution{ + StakingRewards: sdk.OneDec().Neg(), + CommunityPool: sdk.NewDecWithPrec(133333, 6), + StrategicReserves: sdk.NewDecWithPrec(333333, 6), + }, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + true, + }, + { + "invalid - inflation distribution - negative usage incentives", + inflationtypes.Params{ + PolynomialFactors: inflationtypes.DefaultPolynomialFactors, + InflationDistribution: inflationtypes.InflationDistribution{ + StakingRewards: sdk.NewDecWithPrec(533334, 6), + CommunityPool: sdk.NewDecWithPrec(133333, 6), + StrategicReserves: sdk.OneDec().Neg(), + }, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + true, + }, + { + "invalid - inflation distribution - negative community pool rewards", + inflationtypes.Params{ + PolynomialFactors: inflationtypes.DefaultPolynomialFactors, + InflationDistribution: inflationtypes.InflationDistribution{ + StakingRewards: sdk.NewDecWithPrec(533334, 6), + CommunityPool: sdk.OneDec().Neg(), + StrategicReserves: sdk.NewDecWithPrec(333333, 6), + }, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + true, + }, + { + "invalid - inflation distribution - total distribution ratio unequal 1", + inflationtypes.Params{ + PolynomialFactors: inflationtypes.DefaultPolynomialFactors, + InflationDistribution: inflationtypes.InflationDistribution{ + StakingRewards: sdk.NewDecWithPrec(533333, 6), + CommunityPool: sdk.NewDecWithPrec(133333, 6), + StrategicReserves: sdk.NewDecWithPrec(333333, 6), + }, + InflationEnabled: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + }, + true, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.params.Validate() + + if tc.expError { + require.Error(t, err, tc.name) + } else { + require.NoError(t, err, tc.name) + } + }) + } +} + +type ParamKeyTableTestSuite struct { + suite.Suite +} + +func (s *ParamKeyTableTestSuite) TestParamKeyTable() { + encCfg := codec.MakeEncodingConfig() + cdc := encCfg.Marshaler + amino := encCfg.Amino + + storeKey := storetypes.NewKVStoreKey("mockStoreKey") + transientStoreKey := storetypes.NewTransientStoreKey("mockTransientKey") + + var keyTable paramstypes.KeyTable + s.Require().NotPanics(func() { + keyTable = inflationtypes.ParamKeyTable() + }) + s.Require().NotPanics(func() { + subspace := paramstypes.NewSubspace( + cdc, + amino, + storeKey, transientStoreKey, "inflationsubspace", + ) + subspace.WithKeyTable(keyTable) + }) +} + +func (s *ParamKeyTableTestSuite) TestParamSetPairs() { + s.NotPanics(func() { + moduleParams := inflationtypes.DefaultParams() + _ = moduleParams.ParamSetPairs() + }) +} diff --git a/x/inflation/types/query.pb.go b/x/inflation/types/query.pb.go new file mode 100644 index 000000000..4b15226dc --- /dev/null +++ b/x/inflation/types/query.pb.go @@ -0,0 +1,2191 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: nibiru/inflation/v1/query.proto + +package types + +import ( + context "context" + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// QueryPeriodRequest is the request type for the Query/Period RPC method. +type QueryPeriodRequest struct { +} + +func (m *QueryPeriodRequest) Reset() { *m = QueryPeriodRequest{} } +func (m *QueryPeriodRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPeriodRequest) ProtoMessage() {} +func (*QueryPeriodRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{0} +} +func (m *QueryPeriodRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPeriodRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPeriodRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPeriodRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPeriodRequest.Merge(m, src) +} +func (m *QueryPeriodRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPeriodRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPeriodRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPeriodRequest proto.InternalMessageInfo + +// QueryPeriodResponse is the response type for the Query/Period RPC method. +type QueryPeriodResponse struct { + // period is the current minting per epoch provision value. + Period uint64 `protobuf:"varint,1,opt,name=period,proto3" json:"period,omitempty"` +} + +func (m *QueryPeriodResponse) Reset() { *m = QueryPeriodResponse{} } +func (m *QueryPeriodResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPeriodResponse) ProtoMessage() {} +func (*QueryPeriodResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{1} +} +func (m *QueryPeriodResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPeriodResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPeriodResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPeriodResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPeriodResponse.Merge(m, src) +} +func (m *QueryPeriodResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPeriodResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPeriodResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPeriodResponse proto.InternalMessageInfo + +func (m *QueryPeriodResponse) GetPeriod() uint64 { + if m != nil { + return m.Period + } + return 0 +} + +// QueryEpochMintProvisionRequest is the request type for the +// Query/EpochMintProvision RPC method. +type QueryEpochMintProvisionRequest struct { +} + +func (m *QueryEpochMintProvisionRequest) Reset() { *m = QueryEpochMintProvisionRequest{} } +func (m *QueryEpochMintProvisionRequest) String() string { return proto.CompactTextString(m) } +func (*QueryEpochMintProvisionRequest) ProtoMessage() {} +func (*QueryEpochMintProvisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{2} +} +func (m *QueryEpochMintProvisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryEpochMintProvisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryEpochMintProvisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryEpochMintProvisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochMintProvisionRequest.Merge(m, src) +} +func (m *QueryEpochMintProvisionRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryEpochMintProvisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochMintProvisionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryEpochMintProvisionRequest proto.InternalMessageInfo + +// QueryEpochMintProvisionResponse is the response type for the +// Query/EpochMintProvision RPC method. +type QueryEpochMintProvisionResponse struct { + // epoch_mint_provision is the current minting per epoch provision value. + EpochMintProvision types.DecCoin `protobuf:"bytes,1,opt,name=epoch_mint_provision,json=epochMintProvision,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"epoch_mint_provision"` +} + +func (m *QueryEpochMintProvisionResponse) Reset() { *m = QueryEpochMintProvisionResponse{} } +func (m *QueryEpochMintProvisionResponse) String() string { return proto.CompactTextString(m) } +func (*QueryEpochMintProvisionResponse) ProtoMessage() {} +func (*QueryEpochMintProvisionResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{3} +} +func (m *QueryEpochMintProvisionResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryEpochMintProvisionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryEpochMintProvisionResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryEpochMintProvisionResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochMintProvisionResponse.Merge(m, src) +} +func (m *QueryEpochMintProvisionResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryEpochMintProvisionResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochMintProvisionResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryEpochMintProvisionResponse proto.InternalMessageInfo + +func (m *QueryEpochMintProvisionResponse) GetEpochMintProvision() types.DecCoin { + if m != nil { + return m.EpochMintProvision + } + return types.DecCoin{} +} + +// QuerySkippedEpochsRequest is the request type for the Query/SkippedEpochs RPC +// method. +type QuerySkippedEpochsRequest struct { +} + +func (m *QuerySkippedEpochsRequest) Reset() { *m = QuerySkippedEpochsRequest{} } +func (m *QuerySkippedEpochsRequest) String() string { return proto.CompactTextString(m) } +func (*QuerySkippedEpochsRequest) ProtoMessage() {} +func (*QuerySkippedEpochsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{4} +} +func (m *QuerySkippedEpochsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySkippedEpochsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySkippedEpochsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySkippedEpochsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySkippedEpochsRequest.Merge(m, src) +} +func (m *QuerySkippedEpochsRequest) XXX_Size() int { + return m.Size() +} +func (m *QuerySkippedEpochsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySkippedEpochsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySkippedEpochsRequest proto.InternalMessageInfo + +// QuerySkippedEpochsResponse is the response type for the Query/SkippedEpochs +// RPC method. +type QuerySkippedEpochsResponse struct { + // skipped_epochs is the number of epochs that the inflation module has been + // disabled. + SkippedEpochs uint64 `protobuf:"varint,1,opt,name=skipped_epochs,json=skippedEpochs,proto3" json:"skipped_epochs,omitempty"` +} + +func (m *QuerySkippedEpochsResponse) Reset() { *m = QuerySkippedEpochsResponse{} } +func (m *QuerySkippedEpochsResponse) String() string { return proto.CompactTextString(m) } +func (*QuerySkippedEpochsResponse) ProtoMessage() {} +func (*QuerySkippedEpochsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{5} +} +func (m *QuerySkippedEpochsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QuerySkippedEpochsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QuerySkippedEpochsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QuerySkippedEpochsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QuerySkippedEpochsResponse.Merge(m, src) +} +func (m *QuerySkippedEpochsResponse) XXX_Size() int { + return m.Size() +} +func (m *QuerySkippedEpochsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QuerySkippedEpochsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QuerySkippedEpochsResponse proto.InternalMessageInfo + +func (m *QuerySkippedEpochsResponse) GetSkippedEpochs() uint64 { + if m != nil { + return m.SkippedEpochs + } + return 0 +} + +// QueryCirculatingSupplyRequest is the request type for the +// Query/CirculatingSupply RPC method. +type QueryCirculatingSupplyRequest struct { +} + +func (m *QueryCirculatingSupplyRequest) Reset() { *m = QueryCirculatingSupplyRequest{} } +func (m *QueryCirculatingSupplyRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCirculatingSupplyRequest) ProtoMessage() {} +func (*QueryCirculatingSupplyRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{6} +} +func (m *QueryCirculatingSupplyRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCirculatingSupplyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCirculatingSupplyRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCirculatingSupplyRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCirculatingSupplyRequest.Merge(m, src) +} +func (m *QueryCirculatingSupplyRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCirculatingSupplyRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCirculatingSupplyRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCirculatingSupplyRequest proto.InternalMessageInfo + +// QueryCirculatingSupplyResponse is the response type for the +// Query/CirculatingSupply RPC method. +type QueryCirculatingSupplyResponse struct { + // circulating_supply is the total amount of coins in circulation + CirculatingSupply types.DecCoin `protobuf:"bytes,1,opt,name=circulating_supply,json=circulatingSupply,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.DecCoins" json:"circulating_supply"` +} + +func (m *QueryCirculatingSupplyResponse) Reset() { *m = QueryCirculatingSupplyResponse{} } +func (m *QueryCirculatingSupplyResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCirculatingSupplyResponse) ProtoMessage() {} +func (*QueryCirculatingSupplyResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{7} +} +func (m *QueryCirculatingSupplyResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCirculatingSupplyResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCirculatingSupplyResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCirculatingSupplyResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCirculatingSupplyResponse.Merge(m, src) +} +func (m *QueryCirculatingSupplyResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCirculatingSupplyResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCirculatingSupplyResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCirculatingSupplyResponse proto.InternalMessageInfo + +func (m *QueryCirculatingSupplyResponse) GetCirculatingSupply() types.DecCoin { + if m != nil { + return m.CirculatingSupply + } + return types.DecCoin{} +} + +// QueryInflationRateRequest is the request type for the Query/InflationRate RPC +// method. +type QueryInflationRateRequest struct { +} + +func (m *QueryInflationRateRequest) Reset() { *m = QueryInflationRateRequest{} } +func (m *QueryInflationRateRequest) String() string { return proto.CompactTextString(m) } +func (*QueryInflationRateRequest) ProtoMessage() {} +func (*QueryInflationRateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{8} +} +func (m *QueryInflationRateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInflationRateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInflationRateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryInflationRateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInflationRateRequest.Merge(m, src) +} +func (m *QueryInflationRateRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryInflationRateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInflationRateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInflationRateRequest proto.InternalMessageInfo + +// QueryInflationRateResponse is the response type for the Query/InflationRate +// RPC method. +type QueryInflationRateResponse struct { + // inflation_rate by which the total supply increases within one period + InflationRate github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,1,opt,name=inflation_rate,json=inflationRate,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"inflation_rate"` +} + +func (m *QueryInflationRateResponse) Reset() { *m = QueryInflationRateResponse{} } +func (m *QueryInflationRateResponse) String() string { return proto.CompactTextString(m) } +func (*QueryInflationRateResponse) ProtoMessage() {} +func (*QueryInflationRateResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{9} +} +func (m *QueryInflationRateResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryInflationRateResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryInflationRateResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryInflationRateResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryInflationRateResponse.Merge(m, src) +} +func (m *QueryInflationRateResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryInflationRateResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryInflationRateResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryInflationRateResponse proto.InternalMessageInfo + +// QueryParamsRequest is the request type for the Query/Params RPC method. +type QueryParamsRequest struct { +} + +func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } +func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryParamsRequest) ProtoMessage() {} +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{10} +} +func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsRequest.Merge(m, src) +} +func (m *QueryParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo + +// QueryParamsResponse is the response type for the Query/Params RPC method. +type QueryParamsResponse struct { + // params defines the parameters of the module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` +} + +func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } +func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryParamsResponse) ProtoMessage() {} +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9cef9ea5e4d20e5e, []int{11} +} +func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsResponse.Merge(m, src) +} +func (m *QueryParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo + +func (m *QueryParamsResponse) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func init() { + proto.RegisterType((*QueryPeriodRequest)(nil), "nibiru.inflation.v1.QueryPeriodRequest") + proto.RegisterType((*QueryPeriodResponse)(nil), "nibiru.inflation.v1.QueryPeriodResponse") + proto.RegisterType((*QueryEpochMintProvisionRequest)(nil), "nibiru.inflation.v1.QueryEpochMintProvisionRequest") + proto.RegisterType((*QueryEpochMintProvisionResponse)(nil), "nibiru.inflation.v1.QueryEpochMintProvisionResponse") + proto.RegisterType((*QuerySkippedEpochsRequest)(nil), "nibiru.inflation.v1.QuerySkippedEpochsRequest") + proto.RegisterType((*QuerySkippedEpochsResponse)(nil), "nibiru.inflation.v1.QuerySkippedEpochsResponse") + proto.RegisterType((*QueryCirculatingSupplyRequest)(nil), "nibiru.inflation.v1.QueryCirculatingSupplyRequest") + proto.RegisterType((*QueryCirculatingSupplyResponse)(nil), "nibiru.inflation.v1.QueryCirculatingSupplyResponse") + proto.RegisterType((*QueryInflationRateRequest)(nil), "nibiru.inflation.v1.QueryInflationRateRequest") + proto.RegisterType((*QueryInflationRateResponse)(nil), "nibiru.inflation.v1.QueryInflationRateResponse") + proto.RegisterType((*QueryParamsRequest)(nil), "nibiru.inflation.v1.QueryParamsRequest") + proto.RegisterType((*QueryParamsResponse)(nil), "nibiru.inflation.v1.QueryParamsResponse") +} + +func init() { proto.RegisterFile("nibiru/inflation/v1/query.proto", fileDescriptor_9cef9ea5e4d20e5e) } + +var fileDescriptor_9cef9ea5e4d20e5e = []byte{ + // 686 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x95, 0x4f, 0x4f, 0x14, 0x3d, + 0x1c, 0xc7, 0xb7, 0x4f, 0x78, 0xd6, 0x58, 0x03, 0x09, 0x85, 0x18, 0x1d, 0x60, 0x16, 0x97, 0x20, + 0x10, 0x42, 0x9b, 0x65, 0xbd, 0x78, 0x65, 0xf5, 0xc0, 0x41, 0x83, 0x43, 0xbc, 0x78, 0xd9, 0xcc, + 0x0e, 0x75, 0x68, 0x60, 0xdb, 0x32, 0x9d, 0xd9, 0xc8, 0xcd, 0xe8, 0x1b, 0x30, 0xf1, 0xec, 0xc9, + 0x83, 0x89, 0x89, 0x17, 0x5e, 0x05, 0x47, 0x12, 0x2f, 0xc6, 0x03, 0x1a, 0xf0, 0x85, 0x98, 0xe9, + 0x74, 0x96, 0x1d, 0xb6, 0xb3, 0xc0, 0xc1, 0xd3, 0xce, 0xf6, 0xf7, 0xef, 0xdb, 0x6f, 0xfb, 0x99, + 0x81, 0x35, 0xce, 0x3a, 0x2c, 0x4a, 0x08, 0xe3, 0xaf, 0xf7, 0xfd, 0x98, 0x09, 0x4e, 0x7a, 0x0d, + 0x72, 0x90, 0xd0, 0xe8, 0x10, 0xcb, 0x48, 0xc4, 0x02, 0x4d, 0x65, 0x09, 0xb8, 0x9f, 0x80, 0x7b, + 0x0d, 0xc7, 0x0d, 0x84, 0xea, 0x0a, 0x45, 0x3a, 0xbe, 0xa2, 0xa4, 0xd7, 0xe8, 0xd0, 0xd8, 0x6f, + 0x90, 0x40, 0x30, 0x9e, 0x15, 0x39, 0x0f, 0x6c, 0x5d, 0x43, 0xca, 0xa9, 0x62, 0xca, 0xa4, 0x4c, + 0x87, 0x22, 0x14, 0xfa, 0x91, 0xa4, 0x4f, 0x66, 0x75, 0x36, 0x14, 0x22, 0xdc, 0xa7, 0xc4, 0x97, + 0x8c, 0xf8, 0x9c, 0x8b, 0x58, 0x57, 0x9b, 0x9a, 0xfa, 0x34, 0x44, 0x2f, 0x52, 0x69, 0x5b, 0x34, + 0x62, 0x62, 0xc7, 0xa3, 0x07, 0x09, 0x55, 0x71, 0x7d, 0x0d, 0x4e, 0x15, 0x56, 0x95, 0x14, 0x5c, + 0x51, 0x74, 0x17, 0x56, 0xa5, 0x5e, 0xb9, 0x07, 0xe6, 0xc1, 0xf2, 0x98, 0x67, 0xfe, 0xd5, 0xe7, + 0xa1, 0xab, 0xd3, 0x9f, 0x4a, 0x11, 0xec, 0x3e, 0x63, 0x3c, 0xde, 0x8a, 0x44, 0x8f, 0x29, 0x26, + 0x78, 0xde, 0xf0, 0x0b, 0x80, 0xb5, 0xd2, 0x14, 0xd3, 0xfd, 0x3d, 0x80, 0xd3, 0x34, 0x0d, 0xb7, + 0xbb, 0x8c, 0xc7, 0x6d, 0x99, 0x27, 0xe8, 0x61, 0x77, 0xd6, 0x67, 0x71, 0xe6, 0x10, 0x4e, 0x1d, + 0xc2, 0xc6, 0x21, 0xfc, 0x84, 0x06, 0x2d, 0xc1, 0xf8, 0x46, 0xf3, 0xf8, 0xb4, 0x56, 0xf9, 0xfa, + 0xab, 0xb6, 0x1a, 0xb2, 0x78, 0x37, 0xe9, 0xe0, 0x40, 0x74, 0x89, 0x71, 0x34, 0xfb, 0x59, 0x53, + 0x3b, 0x7b, 0x24, 0x3e, 0x94, 0x54, 0xe5, 0x35, 0xca, 0x43, 0x74, 0x48, 0x4d, 0x7d, 0x06, 0xde, + 0xd7, 0x42, 0xb7, 0xf7, 0x98, 0x94, 0x74, 0x47, 0xeb, 0x55, 0xf9, 0x36, 0x5a, 0xd0, 0xb1, 0x05, + 0xcd, 0x06, 0x16, 0xe1, 0x84, 0xca, 0x02, 0x6d, 0xdd, 0x58, 0x19, 0x9b, 0xc6, 0xd5, 0x60, 0x7a, + 0xbd, 0x06, 0xe7, 0x74, 0x93, 0x16, 0x8b, 0x82, 0x24, 0x3d, 0x4b, 0x1e, 0x6e, 0x27, 0x52, 0xee, + 0x1f, 0xe6, 0x53, 0x3e, 0x03, 0xe3, 0xa7, 0x25, 0xc3, 0x8c, 0x7a, 0x0b, 0x20, 0x0a, 0x2e, 0xa2, + 0x6d, 0xa5, 0xc3, 0xff, 0xce, 0xa9, 0xc9, 0xe0, 0xb2, 0x94, 0xbe, 0x51, 0x9b, 0xf9, 0x85, 0xf4, + 0xfc, 0x98, 0xe6, 0x5b, 0x50, 0xc6, 0xa8, 0x4b, 0x41, 0xa3, 0xfe, 0x25, 0x9c, 0xe8, 0x5f, 0xe3, + 0x76, 0xe4, 0xc7, 0x54, 0x0b, 0xbf, 0xbd, 0x81, 0x53, 0x69, 0x3f, 0x4f, 0x6b, 0x0f, 0xaf, 0x27, + 0xcd, 0x1b, 0x67, 0x83, 0xed, 0x2f, 0xee, 0xb2, 0x1f, 0xf9, 0xdd, 0xfe, 0x99, 0x6d, 0xe5, 0x77, + 0xd9, 0xac, 0x1a, 0x0d, 0x8f, 0x61, 0x55, 0xea, 0x15, 0x63, 0xda, 0x0c, 0xb6, 0x50, 0x89, 0xb3, + 0xa2, 0x8d, 0xb1, 0x54, 0x98, 0x67, 0x0a, 0xd6, 0x8f, 0x6e, 0xc1, 0xff, 0x75, 0xcb, 0xf4, 0x18, + 0xaa, 0x19, 0x23, 0x68, 0xc9, 0x5a, 0x3f, 0xcc, 0x96, 0xb3, 0x7c, 0x75, 0x62, 0x26, 0xb1, 0xbe, + 0xf0, 0xee, 0xfb, 0x9f, 0x8f, 0xff, 0xcd, 0xa1, 0x19, 0x62, 0x63, 0x3f, 0x63, 0x0f, 0x1d, 0x01, + 0x88, 0x86, 0xa1, 0x42, 0xcd, 0xf2, 0x29, 0xa5, 0x94, 0x3a, 0x8f, 0x6e, 0x56, 0x64, 0x64, 0x36, + 0xb4, 0xcc, 0x55, 0xb4, 0x62, 0x95, 0x69, 0x23, 0x1a, 0x7d, 0x02, 0x70, 0xbc, 0xc0, 0x10, 0xc2, + 0xe5, 0xa3, 0x6d, 0x24, 0x3a, 0xe4, 0xda, 0xf9, 0x46, 0xe5, 0xaa, 0x56, 0xb9, 0x88, 0x16, 0xac, + 0x2a, 0x8b, 0xdc, 0xa2, 0x6f, 0x00, 0x4e, 0x0e, 0xc1, 0x87, 0xd6, 0xcb, 0x67, 0x96, 0xb1, 0xec, + 0x34, 0x6f, 0x54, 0x63, 0xb4, 0x12, 0xad, 0x75, 0x05, 0x2d, 0x59, 0xb5, 0x0e, 0x73, 0xaf, 0xfd, + 0x2c, 0xa0, 0x36, 0xca, 0x4f, 0x1b, 0xb0, 0xa3, 0xfc, 0xb4, 0x32, 0x7c, 0x85, 0x9f, 0x45, 0xbc, + 0x33, 0x4e, 0x34, 0x3c, 0x23, 0x39, 0x19, 0xe4, 0x76, 0x24, 0x27, 0x05, 0x94, 0xaf, 0xe2, 0x24, + 0x43, 0x78, 0xf3, 0xf8, 0xcc, 0x05, 0x27, 0x67, 0x2e, 0xf8, 0x7d, 0xe6, 0x82, 0x0f, 0xe7, 0x6e, + 0xe5, 0xe4, 0xdc, 0xad, 0xfc, 0x38, 0x77, 0x2b, 0xaf, 0xc8, 0xc0, 0xdb, 0xe6, 0xb9, 0x6e, 0xd0, + 0xda, 0xf5, 0x19, 0xcf, 0x9b, 0xbd, 0x19, 0x68, 0xa7, 0x5f, 0x3d, 0x9d, 0xaa, 0xfe, 0x74, 0x36, + 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x40, 0x82, 0x21, 0x19, 0xe9, 0x07, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // Period retrieves current period. + Period(ctx context.Context, in *QueryPeriodRequest, opts ...grpc.CallOption) (*QueryPeriodResponse, error) + // EpochMintProvision retrieves current minting epoch provision value. + EpochMintProvision(ctx context.Context, in *QueryEpochMintProvisionRequest, opts ...grpc.CallOption) (*QueryEpochMintProvisionResponse, error) + // SkippedEpochs retrieves the total number of skipped epochs. + SkippedEpochs(ctx context.Context, in *QuerySkippedEpochsRequest, opts ...grpc.CallOption) (*QuerySkippedEpochsResponse, error) + // CirculatingSupply retrieves the total number of tokens that are in + // circulation (i.e. excluding unvested tokens). + CirculatingSupply(ctx context.Context, in *QueryCirculatingSupplyRequest, opts ...grpc.CallOption) (*QueryCirculatingSupplyResponse, error) + // InflationRate retrieves the inflation rate of the current period. + InflationRate(ctx context.Context, in *QueryInflationRateRequest, opts ...grpc.CallOption) (*QueryInflationRateResponse, error) + // Params retrieves the total set of minting parameters. + Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) Period(ctx context.Context, in *QueryPeriodRequest, opts ...grpc.CallOption) (*QueryPeriodResponse, error) { + out := new(QueryPeriodResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/Period", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) EpochMintProvision(ctx context.Context, in *QueryEpochMintProvisionRequest, opts ...grpc.CallOption) (*QueryEpochMintProvisionResponse, error) { + out := new(QueryEpochMintProvisionResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/EpochMintProvision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) SkippedEpochs(ctx context.Context, in *QuerySkippedEpochsRequest, opts ...grpc.CallOption) (*QuerySkippedEpochsResponse, error) { + out := new(QuerySkippedEpochsResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/SkippedEpochs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CirculatingSupply(ctx context.Context, in *QueryCirculatingSupplyRequest, opts ...grpc.CallOption) (*QueryCirculatingSupplyResponse, error) { + out := new(QueryCirculatingSupplyResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/CirculatingSupply", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) InflationRate(ctx context.Context, in *QueryInflationRateRequest, opts ...grpc.CallOption) (*QueryInflationRateResponse, error) { + out := new(QueryInflationRateResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/InflationRate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { + out := new(QueryParamsResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Query/Params", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // Period retrieves current period. + Period(context.Context, *QueryPeriodRequest) (*QueryPeriodResponse, error) + // EpochMintProvision retrieves current minting epoch provision value. + EpochMintProvision(context.Context, *QueryEpochMintProvisionRequest) (*QueryEpochMintProvisionResponse, error) + // SkippedEpochs retrieves the total number of skipped epochs. + SkippedEpochs(context.Context, *QuerySkippedEpochsRequest) (*QuerySkippedEpochsResponse, error) + // CirculatingSupply retrieves the total number of tokens that are in + // circulation (i.e. excluding unvested tokens). + CirculatingSupply(context.Context, *QueryCirculatingSupplyRequest) (*QueryCirculatingSupplyResponse, error) + // InflationRate retrieves the inflation rate of the current period. + InflationRate(context.Context, *QueryInflationRateRequest) (*QueryInflationRateResponse, error) + // Params retrieves the total set of minting parameters. + Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) Period(ctx context.Context, req *QueryPeriodRequest) (*QueryPeriodResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Period not implemented") +} +func (*UnimplementedQueryServer) EpochMintProvision(ctx context.Context, req *QueryEpochMintProvisionRequest) (*QueryEpochMintProvisionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EpochMintProvision not implemented") +} +func (*UnimplementedQueryServer) SkippedEpochs(ctx context.Context, req *QuerySkippedEpochsRequest) (*QuerySkippedEpochsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SkippedEpochs not implemented") +} +func (*UnimplementedQueryServer) CirculatingSupply(ctx context.Context, req *QueryCirculatingSupplyRequest) (*QueryCirculatingSupplyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CirculatingSupply not implemented") +} +func (*UnimplementedQueryServer) InflationRate(ctx context.Context, req *QueryInflationRateRequest) (*QueryInflationRateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InflationRate not implemented") +} +func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_Period_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPeriodRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Period(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/Period", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Period(ctx, req.(*QueryPeriodRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_EpochMintProvision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryEpochMintProvisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).EpochMintProvision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/EpochMintProvision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).EpochMintProvision(ctx, req.(*QueryEpochMintProvisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_SkippedEpochs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QuerySkippedEpochsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).SkippedEpochs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/SkippedEpochs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).SkippedEpochs(ctx, req.(*QuerySkippedEpochsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CirculatingSupply_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCirculatingSupplyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CirculatingSupply(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/CirculatingSupply", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CirculatingSupply(ctx, req.(*QueryCirculatingSupplyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_InflationRate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryInflationRateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).InflationRate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/InflationRate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).InflationRate(ctx, req.(*QueryInflationRateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Params(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Query/Params", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "nibiru.inflation.v1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Period", + Handler: _Query_Period_Handler, + }, + { + MethodName: "EpochMintProvision", + Handler: _Query_EpochMintProvision_Handler, + }, + { + MethodName: "SkippedEpochs", + Handler: _Query_SkippedEpochs_Handler, + }, + { + MethodName: "CirculatingSupply", + Handler: _Query_CirculatingSupply_Handler, + }, + { + MethodName: "InflationRate", + Handler: _Query_InflationRate_Handler, + }, + { + MethodName: "Params", + Handler: _Query_Params_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "nibiru/inflation/v1/query.proto", +} + +func (m *QueryPeriodRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPeriodRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPeriodRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryPeriodResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryPeriodResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPeriodResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Period != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Period)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryEpochMintProvisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryEpochMintProvisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryEpochMintProvisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryEpochMintProvisionResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryEpochMintProvisionResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryEpochMintProvisionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.EpochMintProvision.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QuerySkippedEpochsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySkippedEpochsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySkippedEpochsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QuerySkippedEpochsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QuerySkippedEpochsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QuerySkippedEpochsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.SkippedEpochs != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.SkippedEpochs)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryCirculatingSupplyRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCirculatingSupplyRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCirculatingSupplyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryCirculatingSupplyResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCirculatingSupplyResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCirculatingSupplyResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.CirculatingSupply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryInflationRateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryInflationRateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInflationRateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryInflationRateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryInflationRateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryInflationRateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size := m.InflationRate.Size() + i -= size + if _, err := m.InflationRate.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryPeriodRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryPeriodResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Period != 0 { + n += 1 + sovQuery(uint64(m.Period)) + } + return n +} + +func (m *QueryEpochMintProvisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryEpochMintProvisionResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.EpochMintProvision.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QuerySkippedEpochsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QuerySkippedEpochsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SkippedEpochs != 0 { + n += 1 + sovQuery(uint64(m.SkippedEpochs)) + } + return n +} + +func (m *QueryCirculatingSupplyRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryCirculatingSupplyResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.CirculatingSupply.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryInflationRateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryInflationRateResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.InflationRate.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryPeriodRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPeriodRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPeriodRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPeriodResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPeriodResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPeriodResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType) + } + m.Period = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Period |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryEpochMintProvisionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryEpochMintProvisionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryEpochMintProvisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryEpochMintProvisionResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryEpochMintProvisionResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryEpochMintProvisionResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochMintProvision", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EpochMintProvision.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySkippedEpochsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySkippedEpochsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySkippedEpochsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QuerySkippedEpochsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QuerySkippedEpochsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QuerySkippedEpochsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SkippedEpochs", wireType) + } + m.SkippedEpochs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SkippedEpochs |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCirculatingSupplyRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCirculatingSupplyRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCirculatingSupplyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCirculatingSupplyResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCirculatingSupplyResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCirculatingSupplyResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CirculatingSupply", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.CirculatingSupply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryInflationRateRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInflationRateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInflationRateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryInflationRateResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryInflationRateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryInflationRateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InflationRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.InflationRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/inflation/types/query.pb.gw.go b/x/inflation/types/query.pb.gw.go new file mode 100644 index 000000000..5d12e647b --- /dev/null +++ b/x/inflation/types/query.pb.gw.go @@ -0,0 +1,478 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: nibiru/inflation/v1/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_Period_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPeriodRequest + var metadata runtime.ServerMetadata + + msg, err := client.Period(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Period_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPeriodRequest + var metadata runtime.ServerMetadata + + msg, err := server.Period(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_EpochMintProvision_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochMintProvisionRequest + var metadata runtime.ServerMetadata + + msg, err := client.EpochMintProvision(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_EpochMintProvision_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochMintProvisionRequest + var metadata runtime.ServerMetadata + + msg, err := server.EpochMintProvision(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_SkippedEpochs_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySkippedEpochsRequest + var metadata runtime.ServerMetadata + + msg, err := client.SkippedEpochs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_SkippedEpochs_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QuerySkippedEpochsRequest + var metadata runtime.ServerMetadata + + msg, err := server.SkippedEpochs(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_CirculatingSupply_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCirculatingSupplyRequest + var metadata runtime.ServerMetadata + + msg, err := client.CirculatingSupply(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CirculatingSupply_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCirculatingSupplyRequest + var metadata runtime.ServerMetadata + + msg, err := server.CirculatingSupply(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_InflationRate_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInflationRateRequest + var metadata runtime.ServerMetadata + + msg, err := client.InflationRate(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_InflationRate_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryInflationRateRequest + var metadata runtime.ServerMetadata + + msg, err := server.InflationRate(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". +// UnaryRPC :call QueryServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_Period_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Period_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Period_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EpochMintProvision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_EpochMintProvision_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EpochMintProvision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SkippedEpochs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_SkippedEpochs_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SkippedEpochs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CirculatingSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CirculatingSupply_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CirculatingSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_InflationRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_InflationRate_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InflationRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_Period_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Period_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Period_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_EpochMintProvision_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_EpochMintProvision_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_EpochMintProvision_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_SkippedEpochs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_SkippedEpochs_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_SkippedEpochs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CirculatingSupply_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CirculatingSupply_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CirculatingSupply_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_InflationRate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_InflationRate_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_InflationRate_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_Period_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "period"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_EpochMintProvision_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "epoch_mint_provision"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_SkippedEpochs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "skipped_epochs"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CirculatingSupply_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "circulating_supply"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_InflationRate_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "inflation_rate"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "params"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_Period_0 = runtime.ForwardResponseMessage + + forward_Query_EpochMintProvision_0 = runtime.ForwardResponseMessage + + forward_Query_SkippedEpochs_0 = runtime.ForwardResponseMessage + + forward_Query_CirculatingSupply_0 = runtime.ForwardResponseMessage + + forward_Query_InflationRate_0 = runtime.ForwardResponseMessage + + forward_Query_Params_0 = runtime.ForwardResponseMessage +) From 0e58c180e3a61d1e5a2adf806a5b3714480dbf47 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 20 Nov 2023 20:27:02 -0500 Subject: [PATCH 26/99] chore: update changelog --- CHANGELOG.md | 126 +++++++++++++++++++++++++++------------------------ 1 file changed, 67 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 562e3acab..26a240365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,18 +40,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) + +### Features + +* [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) -### Features +### Features * [#1596](https://github.com/NibiruChain/nibiru/pull/1596) - epic(tokenfactory): State transitions, collections, genesis import and export, and app wiring -* [#1607](https://github.com/NibiruChain/nibiru/pull/1607) - Token factory transaction messages for CreateDenom, ChangeAdmin, and UpdateModuleParams +* [#1607](https://github.com/NibiruChain/nibiru/pull/1607) - Token factory transaction messages for CreateDenom, ChangeAdmin, and UpdateModuleParams * [#1620](https://github.com/NibiruChain/nibiru/pull/1620) - Token factory transaction messages for Mint and Burn * [#1573](https://github.com/NibiruChain/nibiru/pull/1573) - feat(perp): Close markets and compute settlement price * [#1632](https://github.com/NibiruChain/nibiru/pull/1632) - feat(perp): Add settle position transaction * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial -### State Machine Breaking +### State Machine Breaking * [#1609](https://github.com/NibiruChain/nibiru/pull/1609) - refactor(app)!: Remove x/stablecoin module. * [#1613](https://github.com/NibiruChain/nibiru/pull/1613) - feat(app)!: enforce min commission by changing default and genesis validation @@ -72,15 +78,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1659](https://github.com/NibiruChain/nibiru/pull/1659) - refactor(oracle): curate oracle default whitelist ### Dependencies + - Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) -- Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) -- Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) -- Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) -- Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) -- Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) -- Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) -- Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) -- Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) +* Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) +* Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) +* Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) +* Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) +* Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) +* Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) +* Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) +* Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) ### Bug Fixes @@ -110,7 +117,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1501](https://github.com/NibiruChain/nibiru/pull/1501) - feat(proto): add Python buf generation logic for py-sdk * [#1503](https://github.com/NibiruChain/nibiru/pull/1503) - feat(wasm): add Oracle Exchange Rate query for wasm * [#1543](https://github.com/NibiruChain/nibiru/pull/1543) - epic(devgas): devgas module for incentivizing smart contract -* +* + ### Improvements * [#1466](https://github.com/NibiruChain/nibiru/pull/1466) - refactor(perp): `PositionLiquidatedEvent` @@ -148,25 +156,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) -- Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) -- Bump `technote-space/get-diff-action` from 4 to 6 (#1327) -- Bump `actions/setup-go` from 3 to 4 (#1324) -- Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) -- Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.3.0 (#1354, #1507) -- Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) -- Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) -- Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) -- Bump `google.golang.org/grpc` from 1.53.0 to 1.57.0 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525)) -- Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) -- Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) -- Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) -- Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) -- Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) -- Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) -- Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) -- Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) -- Bump `actions/checkout` from 3 to 4 ([#1563](https://github.com/NibiruChain/nibiru/pull/1563)) +* Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) +* Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) +* Bump `technote-space/get-diff-action` from 4 to 6 (#1327) +* Bump `actions/setup-go` from 3 to 4 (#1324) +* Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) +* Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.3.0 (#1354, #1507) +* Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) +* Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) +* Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) +* Bump `google.golang.org/grpc` from 1.53.0 to 1.57.0 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525)) +* Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) +* Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) +* Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) +* Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) +* Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) +* Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) +* Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) +* Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) +* Bump `actions/checkout` from 3 to 4 ([#1563](https://github.com/NibiruChain/nibiru/pull/1563)) ### Breaking @@ -174,7 +182,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1359](https://github.com/NibiruChain/nibiru/pull/1359) - feat(perp): Add InsuranceFundWithdraw admin call with corresponding smart contract * [#1356](https://github.com/NibiruChain/nibiru/pull/1356) - build: Regress wasmvm (v1.1.1), tendermint (v0.34.24), and Cosmos-SDK (v0.45.14) dependencies * [#1346](https://github.com/NibiruChain/nibiru/pull/1346) - build: Upgrade wasmvm (v1.2.1), tendermint (v0.34.26), and Cosmos-SDK (v0.45.14) dependencies -* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. +* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. * [#1307](https://github.com/NibiruChain/nibiru/pull/1307) - feat(sudo): Create the x/sudo module + integration tests * [#1299](https://github.com/NibiruChain/nibiru/pull/1299) - feat(wasm): Add peg shift bindings * [#1292](https://github.com/NibiruChain/nibiru/pull/1292) - feat(wasm): Add module bindings for execute calls in x/perp: OpenPosition, ClosePosition, AddMargin, RemoveMargin. @@ -314,7 +322,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1359](https://github.com/NibiruChain/nibiru/pull/1359) - feat(perp): Add InsuranceFundWithdraw admin call with corresponding smart contract * [#1356](https://github.com/NibiruChain/nibiru/pull/1356) - build: Regress wasmvm (v1.1.1), tendermint (v0.34.24), and Cosmos-SDK (v0.45.14) dependencies * [#1346](https://github.com/NibiruChain/nibiru/pull/1346) - build: Upgrade wasmvm (v1.2.1), tendermint (v0.34.26), and Cosmos-SDK (v0.45.14) dependencies -* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. +* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. * [#1307](https://github.com/NibiruChain/nibiru/pull/1307) - feat(sudo): Create the x/sudo module + integration tests * [#1299](https://github.com/NibiruChain/nibiru/pull/1299) - feat(wasm): Add peg shift bindings * [#1292](https://github.com/NibiruChain/nibiru/pull/1292) - feat(wasm): Add module bindings for execute calls in x/perp: OpenPosition, ClosePosition, AddMargin, RemoveMargin. @@ -354,31 +362,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) -- Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) -- Bump `technote-space/get-diff-action` from 4 to 6 (#1327) -- Bump `actions/setup-go` from 3 to 4 (#1324) -- Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) -- Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.4.0 (#1354, #1507, [#1564](https://github.com/NibiruChain/nibiru/pull/1564)) -- Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) -- Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) -- Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) -- Bump `google.golang.org/grpc` from 1.53.0 to 1.58.2 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525), [#1568](https://github.com/NibiruChain/nibiru/pull/1568), [#1582](https://github.com/NibiruChain/nibiru/pull/1582), [#1598](https://github.com/NibiruChain/nibiru/pull/1598)) -- Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) -- Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) -- Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) -- Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) -- Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) -- Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) -- Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) -- Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) -- Bump `docker/build-push-action` from 4 to 5 ([#1572](https://github.com/NibiruChain/nibiru/pull/1572)) -- Bump `docker/login-action` from 2 to 3 ([#1571](https://github.com/NibiruChain/nibiru/pull/1571)) -- Bump `docker/setup-buildx-action` from 2 to 3 ([#1570](https://github.com/NibiruChain/nibiru/pull/1570)) -- Bump `docker/setup-qemu-action` from 2 to 3 ([#1569](https://github.com/NibiruChain/nibiru/pull/1569)) -- Bump `github.com/cosmos/cosmos-sdk` from v0.47.4 to v0.47.5 ([#1578](https://github.com/NibiruChain/nibiru/pull/1578)) -- Bump `codecov/codecov-action` from 3 to 4 ([#1583](https://github.com/NibiruChain/nibiru/pull/1583)) -- Bump `actions/checkout` from 3 to 4 ([#1593](https://github.com/NibiruChain/nibiru/pull/1593)) +* Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) +* Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) +* Bump `technote-space/get-diff-action` from 4 to 6 (#1327) +* Bump `actions/setup-go` from 3 to 4 (#1324) +* Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) +* Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.4.0 (#1354, #1507, [#1564](https://github.com/NibiruChain/nibiru/pull/1564)) +* Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) +* Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) +* Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) +* Bump `google.golang.org/grpc` from 1.53.0 to 1.58.2 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525), [#1568](https://github.com/NibiruChain/nibiru/pull/1568), [#1582](https://github.com/NibiruChain/nibiru/pull/1582), [#1598](https://github.com/NibiruChain/nibiru/pull/1598)) +* Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) +* Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) +* Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) +* Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) +* Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) +* Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) +* Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) +* Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) +* Bump `docker/build-push-action` from 4 to 5 ([#1572](https://github.com/NibiruChain/nibiru/pull/1572)) +* Bump `docker/login-action` from 2 to 3 ([#1571](https://github.com/NibiruChain/nibiru/pull/1571)) +* Bump `docker/setup-buildx-action` from 2 to 3 ([#1570](https://github.com/NibiruChain/nibiru/pull/1570)) +* Bump `docker/setup-qemu-action` from 2 to 3 ([#1569](https://github.com/NibiruChain/nibiru/pull/1569)) +* Bump `github.com/cosmos/cosmos-sdk` from v0.47.4 to v0.47.5 ([#1578](https://github.com/NibiruChain/nibiru/pull/1578)) +* Bump `codecov/codecov-action` from 3 to 4 ([#1583](https://github.com/NibiruChain/nibiru/pull/1583)) +* Bump `actions/checkout` from 3 to 4 ([#1593](https://github.com/NibiruChain/nibiru/pull/1593)) ## [v0.19.2](https://github.com/NibiruChain/nibiru/releases/tag/v0.19.2) - 2023-02-24 @@ -785,4 +793,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Testing * [#695](https://github.com/NibiruChain/nibiru/pull/695) Add `OpenPosition` integration tests. -* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. \ No newline at end of file +* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. From ef399b408e75144007be52a9ff43a33e03063b67 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Thu, 7 Dec 2023 10:33:41 +0100 Subject: [PATCH 27/99] feat: add inflation events detailed distribution (#1695) * feat: add inflation events detailed distribution * chore: changelog * fix: improve error handling * fix: broken unit test + make x/sudo safer by making blank genesis invalid * refactor: run gofumpt formatter --------- Co-authored-by: Unique-Divine --- CHANGELOG.md | 6 +- app/ibc_test.go | 1 + proto/nibiru/inflation/v1/event.proto | 26 ++ x/common/testutil/cases.go | 16 + x/common/testutil/const.go | 6 + x/common/testutil/genesis/genesis.go | 3 + x/common/testutil/testapp/testapp.go | 41 +++ x/inflation/keeper/inflation.go | 24 +- x/inflation/keeper/inflation_test.go | 33 +- x/inflation/types/event.pb.go | 437 +++++++++++++++++++++++ x/inflation/types/interfaces.go | 2 +- x/oracle/integration/app_test.go | 12 +- x/sudo/cli/cli_test.go | 4 +- x/sudo/genesis.go | 2 + x/sudo/keeper/keeper.go | 2 +- x/sudo/keeper/msg_server_test.go | 12 +- x/sudo/types/errors.go | 20 +- x/sudo/types/genesis.go | 5 +- x/sudo/types/state.go | 5 +- x/sudo/types/state.pb.go | 2 +- x/tokenfactory/cli/cli_test.go | 12 +- x/tokenfactory/keeper/msg_server_test.go | 3 +- x/tokenfactory/types/state_test.go | 12 +- x/tokenfactory/types/tx_msgs.go | 12 +- 24 files changed, 634 insertions(+), 64 deletions(-) create mode 100644 proto/nibiru/inflation/v1/event.proto create mode 100644 x/common/testutil/const.go create mode 100644 x/inflation/types/event.pb.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 26a240365..cc5f36c8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial +* [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) @@ -54,8 +55,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1607](https://github.com/NibiruChain/nibiru/pull/1607) - Token factory transaction messages for CreateDenom, ChangeAdmin, and UpdateModuleParams * [#1620](https://github.com/NibiruChain/nibiru/pull/1620) - Token factory transaction messages for Mint and Burn * [#1573](https://github.com/NibiruChain/nibiru/pull/1573) - feat(perp): Close markets and compute settlement price -* [#1632](https://github.com/NibiruChain/nibiru/pull/1632) - feat(perp): Add settle position transaction -* [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial ### State Machine Breaking @@ -79,7 +78,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) +* Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) + * Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) * Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) * Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) diff --git a/app/ibc_test.go b/app/ibc_test.go index e5b8147d8..e3541b18b 100644 --- a/app/ibc_test.go +++ b/app/ibc_test.go @@ -33,6 +33,7 @@ func SetupNibiruTestingApp() ( // Create genesis state encCdc := app.MakeEncodingConfig() genesisState := app.NewDefaultGenesisState(encCdc.Marshaler) + testapp.SetDefaultSudoGenesis(genesisState) return nibiruApp, genesisState } diff --git a/proto/nibiru/inflation/v1/event.proto b/proto/nibiru/inflation/v1/event.proto new file mode 100644 index 000000000..ef321ee22 --- /dev/null +++ b/proto/nibiru/inflation/v1/event.proto @@ -0,0 +1,26 @@ +syntax = "proto3"; +package nibiru.inflation.v1; + +import "gogoproto/gogo.proto"; +import "cosmos/base/v1beta1/coin.proto"; + +option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; + +// EventInflationDistribution: Emitted when NIBI tokens are minted on the +// network based on Nibiru's inflation schedule. +message EventInflationDistribution { + cosmos.base.v1beta1.Coin staking_rewards = 1 [ + (gogoproto.moretags) = "yaml:\"staking_rewards\"", + (gogoproto.nullable) = false + ]; + + cosmos.base.v1beta1.Coin strategic_reserve = 2 [ + (gogoproto.moretags) = "yaml:\"strategic_reserve\"", + (gogoproto.nullable) = false + ]; + + cosmos.base.v1beta1.Coin community_pool = 3 [ + (gogoproto.moretags) = "yaml:\"community_pool\"", + (gogoproto.nullable) = false + ]; +} diff --git a/x/common/testutil/cases.go b/x/common/testutil/cases.go index 457ce26a4..547738d00 100644 --- a/x/common/testutil/cases.go +++ b/x/common/testutil/cases.go @@ -18,3 +18,19 @@ func RunFunctionTests(t *testing.T, testCases []FunctionTestCase) { }) } } + +/* +BeforeIntegrationSuite: Skips a test if the `-short` flag is used: + +All tests: `go test ./...` +Unit tests only: `go test ./... -short` +Integration tests only: `go test ./... -run Integration` + +See: https://stackoverflow.com/a/41407042/13305627 +*/ +func BeforeIntegrationSuite(suiteT *testing.T) { + if testing.Short() { + suiteT.Skip("skipping integration test suite") + } + suiteT.Log("setting up integration test suite") +} diff --git a/x/common/testutil/const.go b/x/common/testutil/const.go new file mode 100644 index 000000000..7366624ce --- /dev/null +++ b/x/common/testutil/const.go @@ -0,0 +1,6 @@ +package testutil + +const ( + ADDR_GUARD_CREAM = "nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl" + ADDR_SUDO_ROOT = "nibi1qqx5reauy4glpskmppy88pz25qp2py5yxvpxdt" +) diff --git a/x/common/testutil/genesis/genesis.go b/x/common/testutil/genesis/genesis.go index 931d8636a..70837d526 100644 --- a/x/common/testutil/genesis/genesis.go +++ b/x/common/testutil/genesis/genesis.go @@ -9,6 +9,7 @@ import ( "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" ) /* @@ -28,5 +29,7 @@ func NewTestGenesisState(encodingConfig app.EncodingConfig) app.GenesisState { govGenState.Params.MinDeposit = sdk.NewCoins(sdk.NewInt64Coin(denoms.NIBI, 1_000_000)) // min deposit of 1 NIBI genState[gov.ModuleName] = codec.MustMarshalJSON(&govGenState) + testapp.SetDefaultSudoGenesis(genState) + return genState } diff --git a/x/common/testutil/testapp/testapp.go b/x/common/testutil/testapp/testapp.go index 63912c1a3..cece042c9 100644 --- a/x/common/testutil/testapp/testapp.go +++ b/x/common/testutil/testapp/testapp.go @@ -15,19 +15,33 @@ import ( "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/asset" "github.com/NibiruChain/nibiru/x/common/denoms" + "github.com/NibiruChain/nibiru/x/common/testutil" epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" tokenfactorytypes "github.com/NibiruChain/nibiru/x/tokenfactory/types" ) +func init() { + EnsureNibiruPrefix() +} + // NewNibiruTestAppAndContext creates an 'app.NibiruApp' instance with an // in-memory 'tmdb.MemDB' and fresh 'sdk.Context'. func NewNibiruTestAppAndContext() (*app.NibiruApp, sdk.Context) { encoding := app.MakeEncodingConfig() appGenesis := app.NewDefaultGenesisState(encoding.Marshaler) genModEpochs := epochstypes.DefaultGenesisFromTime(time.Now().UTC()) + + // Set happy genesis: epochs appGenesis[epochstypes.ModuleName] = encoding.Marshaler.MustMarshalJSON( genModEpochs, ) + + // Set happy genesis: sudo + sudoGenesis := new(sudotypes.GenesisState) + sudoGenesis.Sudoers = DefaultSudoers() + appGenesis[sudotypes.ModuleName] = encoding.Marshaler.MustMarshalJSON(sudoGenesis) + app := NewNibiruTestApp(appGenesis) ctx := NewContext(app) @@ -44,6 +58,31 @@ func NewContext(nibiru *app.NibiruApp) sdk.Context { }) } +// DefaultSudoers: State for the x/sudo module for the default test app. +func DefaultSudoers() sudotypes.Sudoers { + addr := DefaultSudoRoot().String() + return sudotypes.Sudoers{ + Root: addr, + Contracts: []string{addr}, + } +} + +func DefaultSudoRoot() sdk.AccAddress { + return sdk.MustAccAddressFromBech32(testutil.ADDR_SUDO_ROOT) +} + +// SetDefaultSudoGenesis: Sets the sudo module genesis state to a valid +// default. See "DefaultSudoers". +func SetDefaultSudoGenesis(gen app.GenesisState) { + sudoGen := new(sudotypes.GenesisState) + encoding := app.MakeEncodingConfig() + encoding.Marshaler.MustUnmarshalJSON(gen[sudotypes.ModuleName], sudoGen) + if err := sudoGen.Validate(); err != nil { + sudoGen.Sudoers = DefaultSudoers() + gen[sudotypes.ModuleName] = encoding.Marshaler.MustMarshalJSON(sudoGen) + } +} + // NewNibiruTestAppAndZeroTimeCtx: Runs NewNibiruTestAppAndZeroTimeCtx with the // block time set to time zero. func NewNibiruTestAppAndContextAtTime(startTime time.Time) (*app.NibiruApp, sdk.Context) { @@ -60,6 +99,8 @@ func NewNibiruTestApp(gen app.GenesisState) *app.NibiruApp { logger := log.NewNopLogger() encoding := app.MakeEncodingConfig() + SetDefaultSudoGenesis(gen) + app := app.NewNibiruApp( logger, db, diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go index a03987427..6377db6f8 100644 --- a/x/inflation/keeper/inflation.go +++ b/x/inflation/keeper/inflation.go @@ -1,6 +1,8 @@ package keeper import ( + "fmt" + sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -76,20 +78,28 @@ func (k Keeper) AllocatePolynomialInflation( return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err } - // Remaining balance is strategic reserve allocation to the root account of the x/sudo module + // Remaining balance is strategic reserve allocation to the root account + // of the x/sudo module strategic = k.bankKeeper.GetBalance(ctx, inflationModuleAddr, denoms.NIBI) - strategicAccountAddr, err := k.sudoKeeper.GetRoot(ctx) + strategicAccountAddr, err := k.sudoKeeper.GetRootAddr(ctx) if err != nil { - k.Logger(ctx).Error("get root account error", "error", err) - return staking, strategic, community, nil + err := fmt.Errorf("inflation error: failed to get sudo root account: %w", err) + k.Logger(ctx).Error(err.Error()) + return staking, strategic, community, err } if err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic)); err != nil { - k.Logger(ctx).Error("send coins to root account error", "error", err) - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, nil + err := fmt.Errorf("inflation error: failed to send coins to sudo root account: %w", err) + k.Logger(ctx).Error(err.Error()) + return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err } - return staking, strategic, community, nil + return staking, strategic, community, ctx.EventManager().EmitTypedEvents( + &types.EventInflationDistribution{ + StakingRewards: staking, + StrategicReserve: strategic, + CommunityPool: community, + }) } // GetAllocationProportion calculates the proportion of coins that is to be diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 0394dfc5e..9bba60cea 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -72,16 +72,19 @@ func TestMintAndAllocateInflation(t *testing.T) { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - if tc.rootAccount != "" { - t.Logf("setting root account to %s", tc.rootAccount) - nibiruApp.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ - Root: sdk.MustAccAddressFromBech32(tc.rootAccount).String(), - Contracts: []string{}, - }) - } + t.Logf("setting root account to %s", tc.rootAccount) + nibiruApp.SudoKeeper.Sudoers.Set(ctx, sudotypes.Sudoers{ + Root: tc.rootAccount, + Contracts: []string{}, + }) staking, strategic, community, err := nibiruApp.InflationKeeper.MintAndAllocateInflation(ctx, tc.coinsToMint, types.DefaultParams()) - require.NoError(t, err) + if tc.rootAccount != "" { + require.NoError(t, err) + } else { + require.Error(t, err) + return + } assert.Equal(t, tc.expectedStakingAmt, staking) assert.Equal(t, tc.expectedStrategicAmt, strategic) assert.Equal(t, tc.expectedCommunityAmt, community) @@ -89,7 +92,7 @@ func TestMintAndAllocateInflation(t *testing.T) { // Get balances var balanceStrategicReserve sdk.Coin if tc.rootAccount != "" { - strategicAccount, err := nibiruApp.SudoKeeper.GetRoot(ctx) + strategicAccount, err := nibiruApp.SudoKeeper.GetRootAddr(ctx) require.NoError(t, err) balanceStrategicReserve = nibiruApp.BankKeeper.GetBalance( ctx, @@ -110,9 +113,15 @@ func TestMintAndAllocateInflation(t *testing.T) { balanceCommunityPool := nibiruApp.DistrKeeper.GetFeePoolCommunityCoins(ctx) require.NoError(t, err, tc.name) - assert.Equal(t, tc.expectedStakingRewardsBalance, balanceStakingRewards) - assert.Equal(t, tc.expectedStrategicReservesBalance, balanceStrategicReserve) - assert.Equal(t, tc.expectedCommunityPoolBalance, balanceCommunityPool) + assert.Equal(t, + tc.expectedStakingRewardsBalance.String(), + balanceStakingRewards.String()) + assert.Equal(t, + tc.expectedStrategicReservesBalance.String(), + balanceStrategicReserve.String()) + assert.Equal(t, + tc.expectedCommunityPoolBalance.String(), + balanceCommunityPool.String()) }) } } diff --git a/x/inflation/types/event.pb.go b/x/inflation/types/event.pb.go new file mode 100644 index 000000000..c5fd42816 --- /dev/null +++ b/x/inflation/types/event.pb.go @@ -0,0 +1,437 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: nibiru/inflation/v1/event.proto + +package types + +import ( + fmt "fmt" + types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// EventInflationDistribution: Emitted when NIBI tokens are minted on the +// network based on Nibiru's inflation schedule. +type EventInflationDistribution struct { + StakingRewards types.Coin `protobuf:"bytes,1,opt,name=staking_rewards,json=stakingRewards,proto3" json:"staking_rewards" yaml:"staking_rewards"` + StrategicReserve types.Coin `protobuf:"bytes,2,opt,name=strategic_reserve,json=strategicReserve,proto3" json:"strategic_reserve" yaml:"strategic_reserve"` + CommunityPool types.Coin `protobuf:"bytes,3,opt,name=community_pool,json=communityPool,proto3" json:"community_pool" yaml:"community_pool"` +} + +func (m *EventInflationDistribution) Reset() { *m = EventInflationDistribution{} } +func (m *EventInflationDistribution) String() string { return proto.CompactTextString(m) } +func (*EventInflationDistribution) ProtoMessage() {} +func (*EventInflationDistribution) Descriptor() ([]byte, []int) { + return fileDescriptor_18fa0385facaf5d9, []int{0} +} +func (m *EventInflationDistribution) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventInflationDistribution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventInflationDistribution.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventInflationDistribution) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventInflationDistribution.Merge(m, src) +} +func (m *EventInflationDistribution) XXX_Size() int { + return m.Size() +} +func (m *EventInflationDistribution) XXX_DiscardUnknown() { + xxx_messageInfo_EventInflationDistribution.DiscardUnknown(m) +} + +var xxx_messageInfo_EventInflationDistribution proto.InternalMessageInfo + +func (m *EventInflationDistribution) GetStakingRewards() types.Coin { + if m != nil { + return m.StakingRewards + } + return types.Coin{} +} + +func (m *EventInflationDistribution) GetStrategicReserve() types.Coin { + if m != nil { + return m.StrategicReserve + } + return types.Coin{} +} + +func (m *EventInflationDistribution) GetCommunityPool() types.Coin { + if m != nil { + return m.CommunityPool + } + return types.Coin{} +} + +func init() { + proto.RegisterType((*EventInflationDistribution)(nil), "nibiru.inflation.v1.EventInflationDistribution") +} + +func init() { proto.RegisterFile("nibiru/inflation/v1/event.proto", fileDescriptor_18fa0385facaf5d9) } + +var fileDescriptor_18fa0385facaf5d9 = []byte{ + // 332 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xbd, 0x4e, 0xf3, 0x30, + 0x14, 0x86, 0x93, 0x7e, 0xd2, 0x37, 0x04, 0x51, 0x20, 0xfc, 0x28, 0x54, 0xc2, 0xad, 0x32, 0x31, + 0xd9, 0x0a, 0x6c, 0x8c, 0x2d, 0x0c, 0x5d, 0x10, 0xca, 0xc8, 0x12, 0xd9, 0xc1, 0xa4, 0x16, 0x89, + 0x4f, 0x65, 0x3b, 0x81, 0xde, 0x05, 0x97, 0x55, 0x89, 0xa5, 0x23, 0x53, 0x85, 0xda, 0x3b, 0xe0, + 0x0a, 0x50, 0xea, 0xb4, 0x82, 0x2e, 0xdd, 0x8e, 0xde, 0x73, 0xce, 0xf3, 0x0c, 0xaf, 0xd7, 0x95, + 0x82, 0x09, 0x55, 0x12, 0x21, 0x9f, 0x73, 0x6a, 0x04, 0x48, 0x52, 0x45, 0x84, 0x57, 0x5c, 0x1a, + 0x3c, 0x56, 0x60, 0xc0, 0x3f, 0xb6, 0x07, 0x78, 0x73, 0x80, 0xab, 0xa8, 0x73, 0x92, 0x41, 0x06, + 0xab, 0x3d, 0xa9, 0x27, 0x7b, 0xda, 0x41, 0x29, 0xe8, 0x02, 0x34, 0x61, 0x54, 0x73, 0x52, 0x45, + 0x8c, 0x1b, 0x1a, 0x91, 0x14, 0x84, 0xb4, 0xfb, 0xf0, 0xa3, 0xe5, 0x75, 0xee, 0x6a, 0xf4, 0x70, + 0xcd, 0xba, 0x15, 0xda, 0x28, 0xc1, 0xca, 0x7a, 0xf6, 0x99, 0x77, 0xa0, 0x0d, 0x7d, 0x11, 0x32, + 0x4b, 0x14, 0x7f, 0xa5, 0xea, 0x49, 0x07, 0x6e, 0xcf, 0xbd, 0xdc, 0xbb, 0x3a, 0xc7, 0x16, 0x8c, + 0x6b, 0x30, 0x6e, 0xc0, 0x78, 0x00, 0x42, 0xf6, 0xd1, 0x74, 0xde, 0x75, 0xbe, 0xe7, 0xdd, 0xb3, + 0x09, 0x2d, 0xf2, 0x9b, 0x70, 0xeb, 0x3f, 0x8c, 0xdb, 0x4d, 0x12, 0xdb, 0xc0, 0x1f, 0x79, 0x47, + 0xda, 0x28, 0x6a, 0x78, 0x26, 0xd2, 0x44, 0x71, 0xcd, 0x55, 0xc5, 0x83, 0xd6, 0x2e, 0x4b, 0xaf, + 0xb1, 0x04, 0x6b, 0xcb, 0x16, 0x21, 0x8c, 0x0f, 0x37, 0x59, 0x6c, 0x23, 0x3f, 0xf1, 0xda, 0x29, + 0x14, 0x45, 0x29, 0x85, 0x99, 0x24, 0x63, 0x80, 0x3c, 0xf8, 0xb7, 0x4b, 0x73, 0xd1, 0x68, 0x4e, + 0xad, 0xe6, 0xef, 0x7b, 0x18, 0xef, 0x6f, 0x82, 0x07, 0x80, 0xbc, 0x3f, 0x9c, 0x2e, 0x90, 0x3b, + 0x5b, 0x20, 0xf7, 0x6b, 0x81, 0xdc, 0xf7, 0x25, 0x72, 0x66, 0x4b, 0xe4, 0x7c, 0x2e, 0x91, 0xf3, + 0x48, 0x32, 0x61, 0x46, 0x25, 0xc3, 0x29, 0x14, 0xe4, 0x7e, 0xd5, 0xde, 0x60, 0x44, 0x85, 0x24, + 0x4d, 0xd5, 0x6f, 0xbf, 0xca, 0x36, 0x93, 0x31, 0xd7, 0xec, 0xff, 0xaa, 0x9f, 0xeb, 0x9f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x2c, 0x97, 0xd4, 0x83, 0x0d, 0x02, 0x00, 0x00, +} + +func (m *EventInflationDistribution) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventInflationDistribution) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventInflationDistribution) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.CommunityPool.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvent(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.StrategicReserve.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvent(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.StakingRewards.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvent(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func encodeVarintEvent(dAtA []byte, offset int, v uint64) int { + offset -= sovEvent(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *EventInflationDistribution) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.StakingRewards.Size() + n += 1 + l + sovEvent(uint64(l)) + l = m.StrategicReserve.Size() + n += 1 + l + sovEvent(uint64(l)) + l = m.CommunityPool.Size() + n += 1 + l + sovEvent(uint64(l)) + return n +} + +func sovEvent(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozEvent(x uint64) (n int) { + return sovEvent(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *EventInflationDistribution) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventInflationDistribution: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventInflationDistribution: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StakingRewards", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvent + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvent + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StakingRewards.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StrategicReserve", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvent + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvent + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StrategicReserve.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CommunityPool", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvent + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvent + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvent + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.CommunityPool.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvent(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvent + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEvent(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvent + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthEvent + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEvent + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthEvent + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthEvent = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEvent = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEvent = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index 17b3a362e..4a9f0bb01 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -41,5 +41,5 @@ type StakingKeeper interface { } type SudoKeeper interface { - GetRoot(ctx sdk.Context) (sdk.AccAddress, error) + GetRootAddr(ctx sdk.Context) (sdk.AccAddress, error) } diff --git a/x/oracle/integration/app_test.go b/x/oracle/integration/app_test.go index 7a9300c88..80757a506 100644 --- a/x/oracle/integration/app_test.go +++ b/x/oracle/integration/app_test.go @@ -11,8 +11,10 @@ import ( "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/asset" + "github.com/NibiruChain/nibiru/x/common/testutil" testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" "github.com/NibiruChain/nibiru/x/common/testutil/genesis" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" "github.com/NibiruChain/nibiru/x/oracle/types" ) @@ -23,10 +25,16 @@ type IntegrationTestSuite struct { network *testutilcli.Network } +func (s *IntegrationTestSuite) SetupSuite() { + testutil.BeforeIntegrationSuite(s.T()) +} + func (s *IntegrationTestSuite) SetupTest() { - app.SetPrefixes(app.AccountAddressPrefix) + testapp.EnsureNibiruPrefix() homeDir := s.T().TempDir() - s.cfg = testutilcli.BuildNetworkConfig(genesis.NewTestGenesisState(app.MakeEncodingConfig())) + + genesisState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) + s.cfg = testutilcli.BuildNetworkConfig(genesisState) s.cfg.NumValidators = 4 s.cfg.GenesisState[types.ModuleName] = s.cfg.Codec.MustMarshalJSON(func() codec.ProtoMarshaler { gs := types.DefaultGenesisState() diff --git a/x/sudo/cli/cli_test.go b/x/sudo/cli/cli_test.go index 4b365575c..c6c45a3bc 100644 --- a/x/sudo/cli/cli_test.go +++ b/x/sudo/cli/cli_test.go @@ -25,6 +25,7 @@ import ( "github.com/NibiruChain/nibiru/x/common/testutil" testutilcli "github.com/NibiruChain/nibiru/x/common/testutil/cli" "github.com/NibiruChain/nibiru/x/common/testutil/genesis" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" "github.com/NibiruChain/nibiru/x/sudo/cli" ) @@ -101,7 +102,8 @@ func TestSuite_IntegrationSuite_RunAll(t *testing.T) { // ——————————————————————————————————————————————————————————————————— func (s *IntegrationSuite) SetupSuite() { - app.SetPrefixes(app.AccountAddressPrefix) + testutil.BeforeIntegrationSuite(s.T()) + testapp.EnsureNibiruPrefix() genState := genesis.NewTestGenesisState(app.MakeEncodingConfig()) genState, rootPrivKey, rootAddr := genesis.AddSudoGenesis(genState) diff --git a/x/sudo/genesis.go b/x/sudo/genesis.go index d43690d5b..9feb94e8d 100644 --- a/x/sudo/genesis.go +++ b/x/sudo/genesis.go @@ -28,6 +28,8 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { } } +// DefaultGenesis: A blank genesis state. The DefaultGenesis is invalid because +// it does not specify a "Sudoers.Root". func DefaultGenesis() *types.GenesisState { return &types.GenesisState{ Sudoers: types.Sudoers{ diff --git a/x/sudo/keeper/keeper.go b/x/sudo/keeper/keeper.go index 3b7a6a10b..7f2505d43 100644 --- a/x/sudo/keeper/keeper.go +++ b/x/sudo/keeper/keeper.go @@ -27,7 +27,7 @@ func NewKeeper( } // Returns the root address of the sudo module. -func (k Keeper) GetRoot(ctx sdk.Context) (sdk.AccAddress, error) { +func (k Keeper) GetRootAddr(ctx sdk.Context) (sdk.AccAddress, error) { sudoers, err := k.Sudoers.Get(ctx) if err != nil { return nil, err diff --git a/x/sudo/keeper/msg_server_test.go b/x/sudo/keeper/msg_server_test.go index c3ed126cf..5c2d24d31 100644 --- a/x/sudo/keeper/msg_server_test.go +++ b/x/sudo/keeper/msg_server_test.go @@ -8,7 +8,6 @@ import ( "github.com/NibiruChain/nibiru/x/sudo/types" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -25,14 +24,7 @@ func init() { } func setup() (*app.NibiruApp, sdk.Context) { - genState := app.NewDefaultGenesisState(app.MakeEncodingConfig().Marshaler) - nibiru := testapp.NewNibiruTestApp(genState) - ctx := nibiru.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "nibiru-sudonet-1", - Time: time.Now().UTC(), - }) - return nibiru, ctx + return testapp.NewNibiruTestAppAndContextAtTime(time.Now().UTC()) } func TestGenesis(t *testing.T) { @@ -45,7 +37,7 @@ func TestGenesis(t *testing.T) { { name: "default genesis (empty)", genState: sudo.DefaultGenesis(), - empty: true, + panic: true, }, { name: "happy genesis with contracts", diff --git a/x/sudo/types/errors.go b/x/sudo/types/errors.go index 54dfa8798..16fd1dc12 100644 --- a/x/sudo/types/errors.go +++ b/x/sudo/types/errors.go @@ -1,5 +1,21 @@ package types -import sdkerrors "cosmossdk.io/errors" +import ( + "fmt" -var ErrUnauthorized = sdkerrors.Register(ModuleName, 2, "unauthorized: missing sudo permissions") + sdkerrors "cosmossdk.io/errors" +) + +var ( + ErrUnauthorized = sdkerrors.Register(ModuleName, 2, "unauthorized: missing sudo permissions") + errGenesis = sdkerrors.Register(ModuleName, 3, "sudo genesis error") + errSudoers = sdkerrors.Register(ModuleName, 4, "sudoers error") +) + +func ErrGenesis(errMsg string) error { + return fmt.Errorf("%s: %s", errGenesis, errMsg) +} + +func ErrSudoers(errMsg string) error { + return fmt.Errorf("%s: %s", errSudoers, errMsg) +} diff --git a/x/sudo/types/genesis.go b/x/sudo/types/genesis.go index fffb4d2e2..02c0736c9 100644 --- a/x/sudo/types/genesis.go +++ b/x/sudo/types/genesis.go @@ -2,16 +2,15 @@ package types import ( "encoding/json" - "fmt" "github.com/cosmos/cosmos-sdk/codec" ) func (gen *GenesisState) Validate() error { if gen.Sudoers.Contracts == nil { - return fmt.Errorf("nil contract state must be []string") + return ErrGenesis("nil contract state must be []string") } else if err := gen.Sudoers.Validate(); err != nil { - return err + return ErrGenesis(err.Error()) } return nil } diff --git a/x/sudo/types/state.go b/x/sudo/types/state.go index 426fd2103..94128577e 100644 --- a/x/sudo/types/state.go +++ b/x/sudo/types/state.go @@ -7,9 +7,12 @@ import ( ) func (sudo Sudoers) Validate() error { + if _, err := sdk.AccAddressFromBech32(sudo.Root); err != nil { + return ErrSudoers("root addr: " + err.Error()) + } for _, contract := range sudo.Contracts { if _, err := sdk.AccAddressFromBech32(contract); err != nil { - return err + return ErrSudoers("contract addr: " + err.Error()) } } return nil diff --git a/x/sudo/types/state.pb.go b/x/sudo/types/state.pb.go index 99b71715a..033a1c4b9 100644 --- a/x/sudo/types/state.pb.go +++ b/x/sudo/types/state.pb.go @@ -63,7 +63,7 @@ func (m *Sudoers) XXX_DiscardUnknown() { var xxx_messageInfo_Sudoers proto.InternalMessageInfo -func (m *Sudoers) GetRoot() string { +func (m *Sudoers) GetRootAddr() string { if m != nil { return m.Root } diff --git a/x/tokenfactory/cli/cli_test.go b/x/tokenfactory/cli/cli_test.go index c7b90b03b..f1f1e37e1 100644 --- a/x/tokenfactory/cli/cli_test.go +++ b/x/tokenfactory/cli/cli_test.go @@ -39,17 +39,7 @@ func (s *IntegrationTestSuite) TestTokenFactory() { } func (s *IntegrationTestSuite) SetupSuite() { - // Make test skip if -short is not used: - // All tests: `go test ./...` - // Unit tests only: `go test ./... -short` - // Integration tests only: `go test ./... -run Integration` - // See: https://stackoverflow.com/a/41407042/13305627 - if testing.Short() { - s.T().Skip("skipping integration test suite") - } - - s.T().Log("setting up integration test suite") - + testutil.BeforeIntegrationSuite(s.T()) testapp.EnsureNibiruPrefix() encodingConfig := app.MakeEncodingConfig() genState := genesis.NewTestGenesisState(encodingConfig) diff --git a/x/tokenfactory/keeper/msg_server_test.go b/x/tokenfactory/keeper/msg_server_test.go index 8a7235ed5..abda9991b 100644 --- a/x/tokenfactory/keeper/msg_server_test.go +++ b/x/tokenfactory/keeper/msg_server_test.go @@ -594,7 +594,8 @@ func (s *TestSuite) TestSetDenomMetadata() { { TestMsg: (*types.MsgSetDenomMetadata)(nil), WantErr: "nil msg", - }}, + }, + }, }, { diff --git a/x/tokenfactory/types/state_test.go b/x/tokenfactory/types/state_test.go index 9277dc2e1..d532d47d5 100644 --- a/x/tokenfactory/types/state_test.go +++ b/x/tokenfactory/types/state_test.go @@ -81,7 +81,8 @@ func TestGenesisState(t *testing.T) { wantErr string }{ {name: "default", wantErr: "", genState: *types.DefaultGenesis()}, - {name: "sad: params", wantErr: types.ErrInvalidModuleParams.Error(), + { + name: "sad: params", wantErr: types.ErrInvalidModuleParams.Error(), genState: types.GenesisState{ Params: types.ModuleParams{ DenomCreationGasConsume: 0, @@ -89,7 +90,8 @@ func TestGenesisState(t *testing.T) { FactoryDenoms: happyGenDenoms, }, }, - {name: "sad: duplicate", + { + name: "sad: duplicate", wantErr: "duplicate denom", genState: types.GenesisState{ Params: types.DefaultModuleParams(), @@ -98,7 +100,8 @@ func TestGenesisState(t *testing.T) { }, }, }, - {name: "sad: invalid admin", + { + name: "sad: invalid admin", wantErr: types.ErrInvalidAdmin.Error(), genState: types.GenesisState{ Params: types.DefaultModuleParams(), @@ -114,7 +117,8 @@ func TestGenesisState(t *testing.T) { }, }, - {name: "sad: invalid genesis denom", + { + name: "sad: invalid genesis denom", wantErr: types.ErrInvalidGenesis.Error(), genState: types.GenesisState{ Params: types.DefaultModuleParams(), diff --git a/x/tokenfactory/types/tx_msgs.go b/x/tokenfactory/types/tx_msgs.go index 7a9ebd861..fb87e9fa8 100644 --- a/x/tokenfactory/types/tx_msgs.go +++ b/x/tokenfactory/types/tx_msgs.go @@ -9,8 +9,10 @@ import ( // ---------------------------------------------------------------- // MsgCreateDenom -var _ sdk.Msg = &MsgCreateDenom{} -var _ legacytx.LegacyMsg = &MsgCreateDenom{} +var ( + _ sdk.Msg = &MsgCreateDenom{} + _ legacytx.LegacyMsg = &MsgCreateDenom{} +) // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgCreateDenom) ValidateBasic() error { @@ -53,8 +55,10 @@ func (m MsgCreateDenom) GetSignBytes() []byte { // ---------------------------------------------------------------- // MsgChangeAdmin -var _ sdk.Msg = &MsgChangeAdmin{} -var _ legacytx.LegacyMsg = &MsgChangeAdmin{} +var ( + _ sdk.Msg = &MsgChangeAdmin{} + _ legacytx.LegacyMsg = &MsgChangeAdmin{} +) // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgChangeAdmin) ValidateBasic() error { From a1f0844e113c94bf4fb3ade84747198329932a0b Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Sun, 3 Dec 2023 20:25:58 +0100 Subject: [PATCH 28/99] fix(inflation): fix default inflation allocation params (#1688) * fix: fix default inflation allocation * chore: changelog * fix: fix tests --------- Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> --- CHANGELOG.md | 4 ++++ x/inflation/keeper/hooks_test.go | 7 ------- x/inflation/keeper/inflation_test.go | 24 ++++++++++++------------ x/inflation/types/params.go | 6 +++--- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc5f36c8a..3eb1573b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial * [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution +### Bug Fixes + +* [#1688](https://github.com/NibiruChain/nibiru/pull/1688) - fix(inflation): make default inflation allocation follow tokenomics + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index 0db86f9bc..a64f0a048 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -161,7 +161,6 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { // Perform Epoch Hooks futureCtx := ctx.WithBlockTime(time.Now().Add(time.Minute)) - fmt.Println("tc.height", tc.height) nibiruApp.EpochsKeeper.BeforeEpochStart(futureCtx, tc.epochIdentifier, tc.height) nibiruApp.EpochsKeeper.AfterEpochEnd(futureCtx, tc.epochIdentifier, tc.height) @@ -169,7 +168,6 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { period := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) if tc.periodChanges { - fmt.Println("periodChanges", tc.periodChanges) newProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) expectedProvision := types.CalculateEpochMintProvision( @@ -177,11 +175,6 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { period, ) - fmt.Println("periodChanges", tc.periodChanges) - fmt.Println("newProvision", newProvision) - fmt.Println("expectedProvision", expectedProvision) - fmt.Println("originalProvision", originalProvision) - require.Equal(t, expectedProvision, newProvision) // mint provisions will change require.NotEqual(t, newProvision, originalProvision) diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 9bba60cea..5b157d641 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -37,12 +37,12 @@ func TestMintAndAllocateInflation(t *testing.T) { { name: "pass", coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(351_591)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(351_591))), rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", }, { @@ -59,12 +59,12 @@ func TestMintAndAllocateInflation(t *testing.T) { { name: "pass - no root account", coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(622_000)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(278_000)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(100_000)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(622_000))), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(351_591)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(351_591))), rootAccount: "", }, } diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go index 9d0be967a..89d684b1b 100644 --- a/x/inflation/types/params.go +++ b/x/inflation/types/params.go @@ -28,9 +28,9 @@ var ( sdk.MustNewDecFromStr("18063678.8582418"), } DefaultInflationDistribution = InflationDistribution{ - StakingRewards: sdk.NewDecWithPrec(27_8, 3), // 27.8% - CommunityPool: sdk.NewDecWithPrec(62_20, 4), // 62.20% - StrategicReserves: sdk.NewDecWithPrec(10, 2), // 10% + CommunityPool: sdk.NewDecWithPrec(35_159141, 8), // 35.159141% + StakingRewards: sdk.NewDecWithPrec(27_757217, 8), // 27.757217% + StrategicReserves: sdk.NewDecWithPrec(37_083642, 8), // 37.083642% } DefaultEpochsPerPeriod = uint64(30) DefaultPeriodsPerYear = uint64(12) From cd4b6d18749e1f962d1c2218634335b211888d43 Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Fri, 1 Dec 2023 09:02:29 +0100 Subject: [PATCH 29/99] feat: add upgrade handler for inflation module (#1684) * upgrade handler * make lint * update changelog * fix changelog * use orderedModuleNames() function for upgrade --------- Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> --- CHANGELOG.md | 4 +++ app/app.go | 2 ++ app/keepers.go | 7 +++--- app/upgrades.go | 42 ++++++++++++++++++++++++++++++++ app/upgrades/types.go | 14 +++++++++++ app/upgrades/v1_1_0/constants.go | 21 ++++++++++++++++ 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 app/upgrades.go create mode 100644 app/upgrades/types.go create mode 100644 app/upgrades/v1_1_0/constants.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eb1573b7..43265be3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1688](https://github.com/NibiruChain/nibiru/pull/1688) - fix(inflation): make default inflation allocation follow tokenomics +### State Machine Breaking + +* [#1682](https://github.com/NibiruChain/nibiru/pull/1682) - feat: add upgrade handler for v1.1.0 + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features diff --git a/app/app.go b/app/app.go index 82040dc47..15850f700 100644 --- a/app/app.go +++ b/app/app.go @@ -169,6 +169,8 @@ func NewNibiruApp( app.initModuleManager(encodingConfig, skipGenesisInvariants) + app.setupUpgrades() + // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. diff --git a/app/keepers.go b/app/keepers.go index 99ae4a464..82aadce12 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -600,6 +600,9 @@ func orderedModuleNames() []string { // -------------------------------------------------------------------- // Cosmos-SDK modules // + // NOTE: (BeginBlocker requirement): upgrade module must occur first + upgradetypes.ModuleName, + // NOTE (InitGenesis requirement): Capability module must occur // first so that it can initialize any capabilities, allowing other // modules that want to create or claim capabilities afterwards in @@ -628,7 +631,6 @@ func orderedModuleNames() []string { authz.ModuleName, feegrant.ModuleName, paramstypes.ModuleName, - upgradetypes.ModuleName, vestingtypes.ModuleName, // -------------------------------------------------------------------- @@ -679,7 +681,6 @@ func (app *NibiruApp) initModuleManager( app.initAppModules(encodingConfig, skipGenesisInvariants)..., ) - // Init module orders for hooks and genesis orderedModules := orderedModuleNames() app.mm.SetOrderBeginBlockers(orderedModules...) app.mm.SetOrderEndBlockers(orderedModules...) @@ -715,7 +716,7 @@ func (app *NibiruApp) initModuleManager( } } -// ModuleBasicManager: The app's collection of module.AppModuleBasic +// ModuleBasicManager The app's collection of module.AppModuleBasic // implementations. These set up non-dependant module elements, such as codec // registration and genesis verification. func ModuleBasicManager() module.BasicManager { diff --git a/app/upgrades.go b/app/upgrades.go new file mode 100644 index 000000000..4a863d0aa --- /dev/null +++ b/app/upgrades.go @@ -0,0 +1,42 @@ +package app + +import ( + "fmt" + + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" + "github.com/NibiruChain/nibiru/app/upgrades/v1_1_0" +) + +var Upgrades = []upgrades.Upgrade{ + v1_1_0.Upgrade, +} + +func (app *NibiruApp) setupUpgrades() { + app.setUpgradeHandlers() + app.setUpgradeStoreLoaders() +} + +func (app *NibiruApp) setUpgradeHandlers() { + for _, u := range Upgrades { + app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler()) + } +} + +func (app *NibiruApp) setUpgradeStoreLoaders() { + upgradeInfo, err := app.upgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(fmt.Sprintf("failed to read upgrade info from disk: %s", err.Error())) + } + + if app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + return + } + + for _, u := range Upgrades { + if upgradeInfo.Name == u.UpgradeName { + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &u.StoreUpgrades)) + } + } +} diff --git a/app/upgrades/types.go b/app/upgrades/types.go new file mode 100644 index 000000000..caa328bb8 --- /dev/null +++ b/app/upgrades/types.go @@ -0,0 +1,14 @@ +package upgrades + +import ( + store "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +type Upgrade struct { + UpgradeName string + + CreateUpgradeHandler func() types.UpgradeHandler + + StoreUpgrades store.StoreUpgrades +} diff --git a/app/upgrades/v1_1_0/constants.go b/app/upgrades/v1_1_0/constants.go new file mode 100644 index 000000000..9a384e5b5 --- /dev/null +++ b/app/upgrades/v1_1_0/constants.go @@ -0,0 +1,21 @@ +package v1_1_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" + inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" +) + +const UpgradeName = "v1.1.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func() upgradetypes.UpgradeHandler { + return nil + }, + StoreUpgrades: types.StoreUpgrades{ + Added: []string{inflationtypes.ModuleName}, + }, +} From 776a4af5a9653971f1d4eebbca6d40375ce840a4 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 13 Dec 2023 17:02:09 -0500 Subject: [PATCH 30/99] fix: upgrade handler for v1.1.0 (#1706) * fix: upgrade handler for v1.1.0 * chore: update changelog --- CHANGELOG.md | 12 ++++++++++-- app/upgrades.go | 2 +- app/upgrades/types.go | 3 ++- app/upgrades/v1_1_0/constants.go | 8 ++++++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43265be3e..a3c0ccdc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,16 +40,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) +## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2023-12-14 + +* [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0)] +* [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.1.0)] ### Features * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial -* [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution +* [#1682](https://github.com/NibiruChain/nibiru/pull/1682) - feat!: add upgrade handler for v1.1.0 ### Bug Fixes * [#1688](https://github.com/NibiruChain/nibiru/pull/1688) - fix(inflation): make default inflation allocation follow tokenomics +* [#1706](https://github.com/NibiruChain/nibiru/pull/706) - fix: `v1.1.0` upgrade handler + +### Improvements + +* [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution ### State Machine Breaking diff --git a/app/upgrades.go b/app/upgrades.go index 4a863d0aa..8487b5f22 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -20,7 +20,7 @@ func (app *NibiruApp) setupUpgrades() { func (app *NibiruApp) setUpgradeHandlers() { for _, u := range Upgrades { - app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler()) + app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.mm, app.configurator)) } } diff --git a/app/upgrades/types.go b/app/upgrades/types.go index caa328bb8..a2cdde4b5 100644 --- a/app/upgrades/types.go +++ b/app/upgrades/types.go @@ -2,13 +2,14 @@ package upgrades import ( store "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) type Upgrade struct { UpgradeName string - CreateUpgradeHandler func() types.UpgradeHandler + CreateUpgradeHandler func(*module.Manager, module.Configurator) types.UpgradeHandler StoreUpgrades store.StoreUpgrades } diff --git a/app/upgrades/v1_1_0/constants.go b/app/upgrades/v1_1_0/constants.go index 9a384e5b5..257ef77c5 100644 --- a/app/upgrades/v1_1_0/constants.go +++ b/app/upgrades/v1_1_0/constants.go @@ -2,6 +2,8 @@ package v1_1_0 import ( "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/NibiruChain/nibiru/app/upgrades" @@ -12,8 +14,10 @@ const UpgradeName = "v1.1.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func() upgradetypes.UpgradeHandler { - return nil + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } }, StoreUpgrades: types.StoreUpgrades{ Added: []string{inflationtypes.ModuleName}, From 3f696de9e0edac9a4d97006fbde0deac9818d757 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:16:48 -0500 Subject: [PATCH 31/99] refactor(inflation): make inflation disabled by default (#1712) * refactor(inflation): make inflation disabled by default * chore: update changelog --- CHANGELOG.md | 7 ++----- x/inflation/keeper/hooks_test.go | 4 ++++ x/inflation/keeper/inflation_test.go | 12 ++++++++++-- x/inflation/types/inflation_calculation_test.go | 1 + x/inflation/types/params.go | 2 +- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3c0ccdc6..20e356824 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2023-12-14 +## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2023-12-15 * [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0)] * [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.1.0)] @@ -58,10 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Improvements * [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution - -### State Machine Breaking - -* [#1682](https://github.com/NibiruChain/nibiru/pull/1682) - feat: add upgrade handler for v1.1.0 +* [#1712](https://github.com/NibiruChain/nibiru/pull/1712) - refactor(inflation): turn inflation off by default ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index a64f0a048..0ce0391fa 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -16,6 +16,10 @@ import ( func TestEpochIdentifierAfterEpochEnd(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + params := nibiruApp.InflationKeeper.GetParams(ctx) + params.InflationEnabled = true + nibiruApp.InflationKeeper.SetParams(ctx, params) + feePoolOld := nibiruApp.DistrKeeper.GetFeePool(ctx) nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, 1) feePoolNew := nibiruApp.DistrKeeper.GetFeePool(ctx) diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 5b157d641..dbca22f15 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -149,13 +149,21 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { { "high supply", sdk.TokensFromConsensusPower(800_000_000, sdk.DefaultPowerReduction), - func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, + func(nibiruApp *app.NibiruApp, ctx sdk.Context) { + params := nibiruApp.InflationKeeper.GetParams(ctx) + params.InflationEnabled = true + nibiruApp.InflationKeeper.SetParams(ctx, params) + }, sdk.MustNewDecFromStr("27.095518287362700000"), }, { "low supply", sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), - func(nibiruApp *app.NibiruApp, ctx sdk.Context) {}, + func(nibiruApp *app.NibiruApp, ctx sdk.Context) { + params := nibiruApp.InflationKeeper.GetParams(ctx) + params.InflationEnabled = true + nibiruApp.InflationKeeper.SetParams(ctx, params) + }, sdk.MustNewDecFromStr("54.191036574725400000"), }, } diff --git a/x/inflation/types/inflation_calculation_test.go b/x/inflation/types/inflation_calculation_test.go index a63701e87..8d76e6935 100644 --- a/x/inflation/types/inflation_calculation_test.go +++ b/x/inflation/types/inflation_calculation_test.go @@ -24,6 +24,7 @@ var ExpectedTotalInflation = sdk.NewDec(810_600_000_000_000) func TestCalculateEpochMintProvision(t *testing.T) { params := DefaultParams() + params.InflationEnabled = true epochId := uint64(0) totalInflation := sdk.ZeroDec() diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go index 89d684b1b..500d672b4 100644 --- a/x/inflation/types/params.go +++ b/x/inflation/types/params.go @@ -18,7 +18,7 @@ var ( ) var ( - DefaultInflation = true + DefaultInflation = false DefaultPolynomialFactors = []sdk.Dec{ sdk.MustNewDecFromStr("-0.00014903"), sdk.MustNewDecFromStr("0.07527647"), From bd5c69eae6332df6b55f8e5ce03985164f1e2547 Mon Sep 17 00:00:00 2001 From: Helder Moreira Date: Sat, 27 Jan 2024 03:13:43 +0000 Subject: [PATCH 32/99] chore: bump librocksdb to v8.9.1 (#1778) Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> --- CHANGELOG.md | 120 +++++++++++++------------- contrib/make/build.mk | 6 +- contrib/scripts/release_pre_darwin.sh | 10 +-- contrib/scripts/release_pre_linux.sh | 30 +++++-- go.mod | 10 ++- go.sum | 4 +- 6 files changed, 100 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 097de9bb4..a57d2bb2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,16 +42,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) -### Features +### Features * [#1596](https://github.com/NibiruChain/nibiru/pull/1596) - epic(tokenfactory): State transitions, collections, genesis import and export, and app wiring -* [#1607](https://github.com/NibiruChain/nibiru/pull/1607) - Token factory transaction messages for CreateDenom, ChangeAdmin, and UpdateModuleParams +* [#1607](https://github.com/NibiruChain/nibiru/pull/1607) - Token factory transaction messages for CreateDenom, ChangeAdmin, and UpdateModuleParams * [#1620](https://github.com/NibiruChain/nibiru/pull/1620) - Token factory transaction messages for Mint and Burn * [#1573](https://github.com/NibiruChain/nibiru/pull/1573) - feat(perp): Close markets and compute settlement price * [#1632](https://github.com/NibiruChain/nibiru/pull/1632) - feat(perp): Add settle position transaction * [#1658](https://github.com/NibiruChain/nibiru/pull/1658) - feat(oracle): add `EditOracleParams` message -### State Machine Breaking +### State Machine Breaking * [#1609](https://github.com/NibiruChain/nibiru/pull/1609) - refactor(app)!: Remove x/stablecoin module. * [#1613](https://github.com/NibiruChain/nibiru/pull/1613) - feat(app)!: enforce min commission by changing default and genesis validation @@ -72,15 +72,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1659](https://github.com/NibiruChain/nibiru/pull/1659) - refactor(oracle): curate oracle default whitelist ### Dependencies + - Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) -- Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) -- Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) -- Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) -- Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) -- Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) -- Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) -- Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) -- Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) +* Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) +* Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) +* Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) +* Bump `google.golang.org/grpc` from 1.58.2 to 1.59.0 ([#1633](https://github.com/NibiruChain/nibiru/pull/1633), [#1643](https://github.com/NibiruChain/nibiru/pull/1643)) +* Bump `golang.org/x/net` from 0.12.0 to 0.17.0 ([#1634](https://github.com/NibiruChain/nibiru/pull/1634)) +* Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) +* Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) +* Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) ### Bug Fixes @@ -110,7 +111,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1501](https://github.com/NibiruChain/nibiru/pull/1501) - feat(proto): add Python buf generation logic for py-sdk * [#1503](https://github.com/NibiruChain/nibiru/pull/1503) - feat(wasm): add Oracle Exchange Rate query for wasm * [#1543](https://github.com/NibiruChain/nibiru/pull/1543) - epic(devgas): devgas module for incentivizing smart contract -* +* + ### Improvements * [#1466](https://github.com/NibiruChain/nibiru/pull/1466) - refactor(perp): `PositionLiquidatedEvent` @@ -148,25 +150,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) -- Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) -- Bump `technote-space/get-diff-action` from 4 to 6 (#1327) -- Bump `actions/setup-go` from 3 to 4 (#1324) -- Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) -- Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.3.0 (#1354, #1507) -- Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) -- Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) -- Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) -- Bump `google.golang.org/grpc` from 1.53.0 to 1.57.0 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525)) -- Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) -- Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) -- Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) -- Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) -- Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) -- Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) -- Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) -- Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) -- Bump `actions/checkout` from 3 to 4 ([#1563](https://github.com/NibiruChain/nibiru/pull/1563)) +* Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) +* Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) +* Bump `technote-space/get-diff-action` from 4 to 6 (#1327) +* Bump `actions/setup-go` from 3 to 4 (#1324) +* Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) +* Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.3.0 (#1354, #1507) +* Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) +* Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) +* Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) +* Bump `google.golang.org/grpc` from 1.53.0 to 1.57.0 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525)) +* Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) +* Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) +* Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) +* Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) +* Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) +* Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) +* Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) +* Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) +* Bump `actions/checkout` from 3 to 4 ([#1563](https://github.com/NibiruChain/nibiru/pull/1563)) ### Breaking @@ -174,7 +176,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1359](https://github.com/NibiruChain/nibiru/pull/1359) - feat(perp): Add InsuranceFundWithdraw admin call with corresponding smart contract * [#1356](https://github.com/NibiruChain/nibiru/pull/1356) - build: Regress wasmvm (v1.1.1), tendermint (v0.34.24), and Cosmos-SDK (v0.45.14) dependencies * [#1346](https://github.com/NibiruChain/nibiru/pull/1346) - build: Upgrade wasmvm (v1.2.1), tendermint (v0.34.26), and Cosmos-SDK (v0.45.14) dependencies -* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. +* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. * [#1307](https://github.com/NibiruChain/nibiru/pull/1307) - feat(sudo): Create the x/sudo module + integration tests * [#1299](https://github.com/NibiruChain/nibiru/pull/1299) - feat(wasm): Add peg shift bindings * [#1292](https://github.com/NibiruChain/nibiru/pull/1292) - feat(wasm): Add module bindings for execute calls in x/perp: OpenPosition, ClosePosition, AddMargin, RemoveMargin. @@ -314,7 +316,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1359](https://github.com/NibiruChain/nibiru/pull/1359) - feat(perp): Add InsuranceFundWithdraw admin call with corresponding smart contract * [#1356](https://github.com/NibiruChain/nibiru/pull/1356) - build: Regress wasmvm (v1.1.1), tendermint (v0.34.24), and Cosmos-SDK (v0.45.14) dependencies * [#1346](https://github.com/NibiruChain/nibiru/pull/1346) - build: Upgrade wasmvm (v1.2.1), tendermint (v0.34.26), and Cosmos-SDK (v0.45.14) dependencies -* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. +* [#1317](https://github.com/NibiruChain/nibiru/pull/1317) - feat(sudo): Implement and test CLI commands for tx and queries. * [#1307](https://github.com/NibiruChain/nibiru/pull/1307) - feat(sudo): Create the x/sudo module + integration tests * [#1299](https://github.com/NibiruChain/nibiru/pull/1299) - feat(wasm): Add peg shift bindings * [#1292](https://github.com/NibiruChain/nibiru/pull/1292) - feat(wasm): Add module bindings for execute calls in x/perp: OpenPosition, ClosePosition, AddMargin, RemoveMargin. @@ -354,31 +356,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) -- Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) -- Bump `technote-space/get-diff-action` from 4 to 6 (#1327) -- Bump `actions/setup-go` from 3 to 4 (#1324) -- Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) -- Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.4.0 (#1354, #1507, [#1564](https://github.com/NibiruChain/nibiru/pull/1564)) -- Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) -- Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) -- Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) -- Bump `google.golang.org/grpc` from 1.53.0 to 1.58.2 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525), [#1568](https://github.com/NibiruChain/nibiru/pull/1568), [#1582](https://github.com/NibiruChain/nibiru/pull/1582), [#1598](https://github.com/NibiruChain/nibiru/pull/1598)) -- Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) -- Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) -- Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) -- Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) -- Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) -- Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) -- Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) -- Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) -- Bump `docker/build-push-action` from 4 to 5 ([#1572](https://github.com/NibiruChain/nibiru/pull/1572)) -- Bump `docker/login-action` from 2 to 3 ([#1571](https://github.com/NibiruChain/nibiru/pull/1571)) -- Bump `docker/setup-buildx-action` from 2 to 3 ([#1570](https://github.com/NibiruChain/nibiru/pull/1570)) -- Bump `docker/setup-qemu-action` from 2 to 3 ([#1569](https://github.com/NibiruChain/nibiru/pull/1569)) -- Bump `github.com/cosmos/cosmos-sdk` from v0.47.4 to v0.47.5 ([#1578](https://github.com/NibiruChain/nibiru/pull/1578)) -- Bump `codecov/codecov-action` from 3 to 4 ([#1583](https://github.com/NibiruChain/nibiru/pull/1583)) -- Bump `actions/checkout` from 3 to 4 ([#1593](https://github.com/NibiruChain/nibiru/pull/1593)) +* Bump `robinraju/release-downloader` from 1.6 to 1.8 (#1326) +* Bump `pozetroninc/github-action-get-latest-release` from 0.6.0 to 0.7.0 (#1325) +* Bump `technote-space/get-diff-action` from 4 to 6 (#1327) +* Bump `actions/setup-go` from 3 to 4 (#1324) +* Bump `github.com/docker/distribution` from 2.8.1+incompatible to 2.8.2+incompatible (#1339) +* Bump `github.com/CosmWasm/wasmvm` from 1.2.1 to 1.4.0 (#1354, #1507, [#1564](https://github.com/NibiruChain/nibiru/pull/1564)) +* Bump `github.com/spf13/cast` from 1.5.0 to 1.5.1 (#1358) +* Bump `github.com/stretchr/testify` from 1.8.2 to 1.8.4 (#1384, #1435) +* Bump `cosmossdk.io/math` from 1.0.0-beta.6 to 1.1.2 (#1394, [#1547](https://github.com/NibiruChain/nibiru/pull/1547)) +* Bump `google.golang.org/grpc` from 1.53.0 to 1.58.2 (#1395, #1437, #1443, #1497, [#1525](https://github.com/NibiruChain/nibiru/pull/1525), [#1568](https://github.com/NibiruChain/nibiru/pull/1568), [#1582](https://github.com/NibiruChain/nibiru/pull/1582), [#1598](https://github.com/NibiruChain/nibiru/pull/1598)) +* Bump `github.com/gin-gonic/gin` from 1.8.1 to 1.9.1 (#1409) +* Bump `github.com/spf13/viper` from 1.15.0 to 1.16.0 (#1436) +* Bump `github.com/prometheus/client_golang` from 1.15.1 to 1.16.0 (#1431) +* Bump `github.com/cosmos/ibc-go/v7` from 7.1.0 to 7.3.0 (#1445, [#1562](https://github.com/NibiruChain/nibiru/pull/1562)) +* Bump `bufbuild/buf-setup-action` from 1.21.0 to 1.26.1 (#1449, #1469, #1505, #1510, [#1537](https://github.com/NibiruChain/nibiru/pull/1537), [#1540](https://github.com/NibiruChain/nibiru/pull/1540), [#1544](https://github.com/NibiruChain/nibiru/pull/1544)) +* Bump `google.golang.org/protobuf` from 1.30.0 to 1.31.0 (#1450) +* Bump `cosmossdk.io/errors` from 1.0.0-beta.7 to 1.0.0 (#1499) +* Bump `github.com/holiman/uint256` from 1.2.2 to 1.2.3 (#1504) +* Bump `docker/build-push-action` from 4 to 5 ([#1572](https://github.com/NibiruChain/nibiru/pull/1572)) +* Bump `docker/login-action` from 2 to 3 ([#1571](https://github.com/NibiruChain/nibiru/pull/1571)) +* Bump `docker/setup-buildx-action` from 2 to 3 ([#1570](https://github.com/NibiruChain/nibiru/pull/1570)) +* Bump `docker/setup-qemu-action` from 2 to 3 ([#1569](https://github.com/NibiruChain/nibiru/pull/1569)) +* Bump `github.com/cosmos/cosmos-sdk` from v0.47.4 to v0.47.5 ([#1578](https://github.com/NibiruChain/nibiru/pull/1578)) +* Bump `codecov/codecov-action` from 3 to 4 ([#1583](https://github.com/NibiruChain/nibiru/pull/1583)) +* Bump `actions/checkout` from 3 to 4 ([#1593](https://github.com/NibiruChain/nibiru/pull/1593)) ## [v0.19.2](https://github.com/NibiruChain/nibiru/releases/tag/v0.19.2) - 2023-02-24 @@ -785,4 +787,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Testing * [#695](https://github.com/NibiruChain/nibiru/pull/695) Add `OpenPosition` integration tests. -* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. \ No newline at end of file +* [#692](https://github.com/NibiruChain/nibiru/pull/692) Add test coverage for Perp MsgServer methods. diff --git a/contrib/make/build.mk b/contrib/make/build.mk index 5ab3a2d8c..f49c7659d 100644 --- a/contrib/make/build.mk +++ b/contrib/make/build.mk @@ -24,8 +24,10 @@ else endif SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's/ /\@/g') -TM_VERSION := $(shell go list -m github.com/cometbft/cometbft | sed 's:.* ::') # grab everything after the space in "github.com/tendermint/tendermint v0.34.7" -ROCKSDB_VERSION := 8.1.1 +# TM_VERSION: Tendermint Core version (CometBFT) +# grab everything after the space in "github.com/tendermint/tendermint v0.34.7" +TM_VERSION := $(shell go list -m github.com/cometbft/cometbft | sed 's:.* ::') +ROCKSDB_VERSION := 8.9.1 WASMVM_VERSION := $(shell go list -m github.com/CosmWasm/wasmvm | awk '{sub(/^v/, "", $$2); print $$2}') DOCKER := $(shell which docker) BUILDDIR ?= $(CURDIR)/build diff --git a/contrib/scripts/release_pre_darwin.sh b/contrib/scripts/release_pre_darwin.sh index f25254c97..928dda698 100755 --- a/contrib/scripts/release_pre_darwin.sh +++ b/contrib/scripts/release_pre_darwin.sh @@ -11,8 +11,8 @@ set -e WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | awk '{sub(/^v/, "", $2); print $2}') -wget https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvmstatic_darwin.a -O /osxcross/target/SDK/MacOSX12.0.sdk/usr/lib/libwasmvmstatic_darwin.a -wget https://github.com/NibiruChain/gorocksdb/releases/download/v8.1.1/include.8.1.1.tar.gz -O /root/include.8.1.1.tar.gz -tar -xf /root/include.8.1.1.tar.gz -C /osxcross/target/SDK/MacOSX12.0.sdk/usr/include/ -wget https://github.com/NibiruChain/gorocksdb/releases/download/v8.1.1/librocksdb_8.1.1_darwin_all.tar.gz -O /root/librocksdb_8.1.1_darwin_all.tar.gz -tar -xf /root/librocksdb_8.1.1_darwin_all.tar.gz -C /osxcross/target/SDK/MacOSX12.0.sdk/usr/lib/ +ROCKSDB_VERSION=8.9.1 + +flock -x /tmp/wasmvm-lock -c "wget -c https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvmstatic_darwin.a -O /tmp/libwasmvmstatic_darwin.a && [ ! -f /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/lib/libwasmvmstatic_darwin.a ] && cp /tmp/libwasmvmstatic_darwin.a /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/lib/libwasmvmstatic_darwin.a; echo 'libwasmvm installed'" +flock -x /tmp/rocksdb-darwin-headers-lock -c "wget -c https://github.com/NibiruChain/gorocksdb/releases/download/v${ROCKSDB_VERSION}/include.${ROCKSDB_VERSION}.tar.gz -O /tmp/include.${ROCKSDB_VERSION}.tar.gz && [ ! -d /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/include/rocksdb ] && tar -xvf /tmp/include.${ROCKSDB_VERSION}.tar.gz -C /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/include/; echo 'rocksdb headers installed'" +flock -x /tmp/rocksdb-lib-lock -c "wget -c https://github.com/NibiruChain/gorocksdb/releases/download/v${ROCKSDB_VERSION}/librocksdb_${ROCKSDB_VERSION}_darwin_all.tar.gz -O /tmp/librocksdb_${ROCKSDB_VERSION}_darwin_all.tar.gz && [ ! -f /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/lib/librocksdb.a ] && tar -xvf /tmp/librocksdb_${ROCKSDB_VERSION}_darwin_all.tar.gz -C /usr/local/osxcross/SDK/MacOSX12.0.sdk/usr/lib/; echo 'librocksdb installed'" diff --git a/contrib/scripts/release_pre_linux.sh b/contrib/scripts/release_pre_linux.sh index d3c145881..16602a174 100755 --- a/contrib/scripts/release_pre_linux.sh +++ b/contrib/scripts/release_pre_linux.sh @@ -11,11 +11,25 @@ set -e WASMVM_VERSION=$(go list -m github.com/CosmWasm/wasmvm | awk '{sub(/^v/, "", $2); print $2}') -wget https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvm_muslc.x86_64.a -O /usr/lib/x86_64-linux-gnu/libwasmvm_muslc.a -wget https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvm_muslc.aarch64.a -O /usr/lib/aarch64-linux-gnu/libwasmvm_muslc.a -wget https://github.com/NibiruChain/gorocksdb/releases/download/v8.1.1/include.8.1.1.tar.gz -O /root/include.8.1.1.tar.gz -tar -xvf /root/include.8.1.1.tar.gz -C /usr/include/ -wget https://github.com/NibiruChain/gorocksdb/releases/download/v8.1.1/librocksdb_8.1.1_linux_amd64.tar.gz -O /root/librocksdb_8.1.1_linux_amd64.tar.gz -tar -xvf /root/librocksdb_8.1.1_linux_amd64.tar.gz -C /usr/lib/x86_64-linux-gnu/ -wget https://github.com/NibiruChain/gorocksdb/releases/download/v8.1.1/librocksdb_8.1.1_linux_arm64.tar.gz -O /root/librocksdb_8.1.1_linux_arm64.tar.gz -tar -xvf /root/librocksdb_8.1.1_linux_arm64.tar.gz -C /usr/lib/aarch64-linux-gnu/ +ROCKSDB_VERSION=8.9.1 + +flock -x /tmp/apt-lock -c "[ \"$(ls -A /var/lib/apt/lists)\" ] || apt-get update" +flock -x /tmp/rocksdb-linux-headers-lock -c "wget -c https://github.com/NibiruChain/gorocksdb/releases/download/v${ROCKSDB_VERSION}/include.${ROCKSDB_VERSION}.tar.gz -O /tmp/include.${ROCKSDB_VERSION}.tar.gz && [ ! -d /usr/include/rocksdb ] && tar -xvf /tmp/include.${ROCKSDB_VERSION}.tar.gz -C /usr/include/; echo 'rocksdb headers installed'" + +if [ "$TARGET" == "linux_amd64_v1" ]; then + apt-get -o DPkg::Lock::Timeout=60 install --no-install-recommends -y libzstd-dev:amd64 libsnappy-dev:amd64 liblz4-dev:amd64 libbz2-dev:amd64 zlib1g-dev:amd64 + + wget -c https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvm_muslc.x86_64.a -O /tmp/libwasmvm_muslc.x86_64.a + cp /tmp/libwasmvm_muslc.x86_64.a /usr/lib/x86_64-linux-gnu/libwasmvm_muslc.a + + wget -c https://github.com/NibiruChain/gorocksdb/releases/download/v${ROCKSDB_VERSION}/librocksdb_${ROCKSDB_VERSION}_linux_amd64.tar.gz -O /tmp/librocksdb_${ROCKSDB_VERSION}_linux_amd64.tar.gz + tar -xvf /tmp/librocksdb_${ROCKSDB_VERSION}_linux_amd64.tar.gz -C /usr/lib/x86_64-linux-gnu/ +else + apt-get -o DPkg::Lock::Timeout=60 install --no-install-recommends -y libzstd-dev:arm64 libsnappy-dev:arm64 liblz4-dev:arm64 libbz2-dev:arm64 zlib1g-dev:arm64 + + wget -c https://github.com/CosmWasm/wasmvm/releases/download/v${WASMVM_VERSION}/libwasmvm_muslc.aarch64.a -O /tmp/libwasmvm_muslc.aarch64.a + cp /tmp/libwasmvm_muslc.aarch64.a /usr/lib/aarch64-linux-gnu/libwasmvm_muslc.a + + wget -c https://github.com/NibiruChain/gorocksdb/releases/download/v${ROCKSDB_VERSION}/librocksdb_${ROCKSDB_VERSION}_linux_arm64.tar.gz -O /tmp/librocksdb_${ROCKSDB_VERSION}_linux_arm64.tar.gz + tar -xvf /tmp/librocksdb_${ROCKSDB_VERSION}_linux_arm64.tar.gz -C /usr/lib/aarch64-linux-gnu/ +fi diff --git a/go.mod b/go.mod index f90d1595b..239567fbc 100644 --- a/go.mod +++ b/go.mod @@ -8,10 +8,10 @@ require ( github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 - github.com/NibiruChain/collections v0.3.0 + github.com/NibiruChain/collections v0.4.0 github.com/armon/go-metrics v0.4.1 - github.com/cometbft/cometbft v0.37.2 - github.com/cometbft/cometbft-db v0.8.0 + github.com/cometbft/cometbft v0.37.4 + github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.3 github.com/cosmos/cosmos-sdk v0.47.5 github.com/cosmos/go-bip39 v1.0.0 @@ -51,7 +51,7 @@ require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -191,3 +191,5 @@ replace github.com/cosmos/iavl => github.com/cosmos/iavl v0.20.0 // pin version! 126854af5e6d has issues with the store so that queries fail replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 + +replace github.com/linxGnu/grocksdb => github.com/linxGnu/grocksdb v1.8.11 diff --git a/go.sum b/go.sum index c1bb79276..2f3fcfafe 100644 --- a/go.sum +++ b/go.sum @@ -852,8 +852,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= +github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= +github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= From f200eb51f64482cd25ac214a21d2a3c4cc84ccba Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 06:41:06 -0600 Subject: [PATCH 33/99] chore: update changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a57d2bb2c..06527d8ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - 2024-02-09 + +### Dependencies + +* [#1778](https://github.com/NibiruChain/nibiru/pull/1778) - chore: bump librocksdb to v8.9.1 + ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) ### Features @@ -73,7 +79,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies -- Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) +* Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) + * Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) * Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) * Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) From d91deb56fe3153044781cee13f1af9f91d0bb08b Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:04:23 -0600 Subject: [PATCH 34/99] ci: fix go mod --- go.mod | 20 ++++++++------- go.sum | 79 +++++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 70 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 239567fbc..8ec6d1cf5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/NibiruChain/nibiru -go 1.19 +go 1.21 + +toolchain go1.21.6 require ( cosmossdk.io/errors v1.0.0 @@ -9,7 +11,6 @@ require ( github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.4.0 - github.com/armon/go-metrics v0.4.1 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.3 @@ -52,6 +53,7 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -127,7 +129,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.0 // indirect + github.com/linxGnu/grocksdb v1.8.6 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -161,16 +163,16 @@ require ( github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.17.0 // indirect + golang.org/x/net v0.18.0 // indirect golang.org/x/oauth2 v0.11.0 // indirect golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.126.0 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 2f3fcfafe..1fdfa30f3 100644 --- a/go.sum +++ b/go.sum @@ -219,10 +219,11 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3 github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/CosmWasm/wasmd v0.44.0 h1:2sbcoCAvfjCs1O0SWt53xULKjkV06dbSFthEViIC6Zg= github.com/CosmWasm/wasmd v0.44.0/go.mod h1:tDyYN050qUcdd7LOxGeo2e185sEShyO3nJGl2Cf59+k= github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= @@ -234,9 +235,11 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A= github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/NibiruChain/collections v0.3.0 h1:DB2RPzzgcHk35lRXuJ1cPOezweAZ6/c/Guq3bAo4W6w= -github.com/NibiruChain/collections v0.3.0/go.mod h1:tKTlBL+Cs1oJnS4tT9MIaFWr7BWsUXrc7KPzP1LxRBo= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/NibiruChain/collections v0.4.0 h1:KNJj+CJyqOT/Q33kcVzT2uLYIiwhiFAeZMhGLPge5Og= +github.com/NibiruChain/collections v0.4.0/go.mod h1:tKTlBL+Cs1oJnS4tT9MIaFWr7BWsUXrc7KPzP1LxRBo= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -247,6 +250,7 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -303,6 +307,7 @@ github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= +github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -319,8 +324,10 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -337,6 +344,7 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -373,10 +381,10 @@ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.37.2 h1:XB0yyHGT0lwmJlFmM4+rsRnczPlHoAKFX6K8Zgc2/Jc= -github.com/cometbft/cometbft v0.37.2/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= -github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= +github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= +github.com/cometbft/cometbft-db v0.9.1 h1:MIhVX5ja5bXNHF8EYrThkG9F7r9kSfv8BX4LWaxWJ4M= +github.com/cometbft/cometbft-db v0.9.1/go.mod h1:iliyWaoV0mRwBJoizElCwwRA9Tf7jZJOURcRZF9m60U= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -384,6 +392,7 @@ github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSM github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -459,7 +468,9 @@ github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m3 github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -493,14 +504,17 @@ github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -516,6 +530,7 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -537,10 +552,13 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -552,6 +570,7 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -639,6 +658,7 @@ github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -787,6 +807,7 @@ github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1C github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -803,6 +824,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -825,6 +847,7 @@ github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQs github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -845,6 +868,7 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -918,6 +942,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= @@ -939,6 +964,7 @@ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -949,16 +975,20 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -969,6 +999,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -988,6 +1019,7 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1074,6 +1106,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1142,6 +1175,7 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -1149,6 +1183,7 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1176,8 +1211,8 @@ github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1201,6 +1236,7 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1225,8 +1261,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1271,6 +1307,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1337,8 +1374,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1490,14 +1527,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1509,8 +1546,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1581,6 +1618,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1872,6 +1910,7 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 3b5f77272bedfb0c805b39a080ee6ec6fceaddc4 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:07:33 -0600 Subject: [PATCH 35/99] ci: remove go toolchain directive --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 8ec6d1cf5..92a875731 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/NibiruChain/nibiru go 1.21 -toolchain go1.21.6 - require ( cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.1.2 From d29c9ab516c3fde7301acfd6d402ddbd60e9c799 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:15:20 +0100 Subject: [PATCH 36/99] feat: make inflation params a collection and add commands to update them (#1776) * feat: make inflation params a collection and add commands to update them * fix: more tests * chore: changelog * Update x/inflation/keeper/grpc_query.go Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> * Update x/inflation/keeper/grpc_query.go Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> * Update x/inflation/keeper/sudo.go Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> * fix: fix tests and improve function * fix: add test for queryserver --------- Co-authored-by: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> --- CHANGELOG.md | 1 + proto/nibiru/inflation/v1/tx.proto | 64 ++ x/inflation/genesis.go | 2 +- x/inflation/keeper/grpc_query.go | 31 +- x/inflation/keeper/grpc_query_test.go | 12 +- x/inflation/keeper/hooks_test.go | 4 +- x/inflation/keeper/inflation_test.go | 6 +- x/inflation/keeper/keeper.go | 7 +- x/inflation/keeper/msg_server.go | 46 + x/inflation/keeper/msg_server_test.go | 72 ++ x/inflation/keeper/params.go | 35 +- x/inflation/keeper/sudo.go | 90 ++ x/inflation/keeper/sudo_test.go | 133 +++ x/inflation/module.go | 13 +- x/inflation/types/codec.go | 44 + x/inflation/types/interfaces.go | 1 + x/inflation/types/msgs.go | 75 ++ x/inflation/types/params.go | 21 - x/inflation/types/params_test.go | 39 - x/inflation/types/tx.pb.go | 1201 +++++++++++++++++++++++++ x/inflation/types/tx.pb.gw.go | 254 ++++++ 21 files changed, 2040 insertions(+), 111 deletions(-) create mode 100644 proto/nibiru/inflation/v1/tx.proto create mode 100644 x/inflation/keeper/msg_server.go create mode 100644 x/inflation/keeper/msg_server_test.go create mode 100644 x/inflation/keeper/sudo.go create mode 100644 x/inflation/keeper/sudo_test.go create mode 100644 x/inflation/types/codec.go create mode 100644 x/inflation/types/msgs.go create mode 100644 x/inflation/types/tx.pb.go create mode 100644 x/inflation/types/tx.pb.gw.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 20e356824..8b6e5060b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial * [#1682](https://github.com/NibiruChain/nibiru/pull/1682) - feat!: add upgrade handler for v1.1.0 +* [#1776](https://github.com/NibiruChain/nibiru/pull/1776) - feat(inflation): make inflation params a collection and add commands to update them ### Bug Fixes diff --git a/proto/nibiru/inflation/v1/tx.proto b/proto/nibiru/inflation/v1/tx.proto new file mode 100644 index 000000000..a63b5299d --- /dev/null +++ b/proto/nibiru/inflation/v1/tx.proto @@ -0,0 +1,64 @@ +syntax = "proto3"; +package nibiru.inflation.v1; + +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "nibiru/inflation/v1/inflation.proto"; + +option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; + + +service Msg { + // ToggleInflation defines a method to enable or disable inflation. + rpc ToggleInflation(MsgToggleInflation) returns (MsgToggleInflationResponse) { + option (google.api.http).post = "/nibiru/inflation/v1/toggle"; + }; + + // EditInflationParams defines a method to edit the inflation params. + rpc EditInflationParams(MsgEditInflationParams) + returns (MsgEditInflationParamsResponse) { + option (google.api.http).post = "/nibiru/inflation/edit-inflation-params"; + }; +} + +// MsgToggleInflation defines a message to enable or disable inflation. +message MsgToggleInflation { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string sender = 1; + bool enable = 2 [ (gogoproto.moretags) = "yaml:\"enable\"" ]; +} + +message MsgEditInflationParams { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string sender = 1; + bool inflation_enabled = 2; + repeated string polynomial_factors = 3[ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", + (gogoproto.nullable) = true + ]; + InflationDistribution inflation_distribution = 4 + [ (gogoproto.nullable) = true ]; + + string epochs_per_period = 5 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.nullable) = true + ]; + string periods_per_year = 6 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.nullable) = true + ]; + string max_period = 7 [ + (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + (gogoproto.nullable) = true + ]; +} + +message MsgToggleInflationResponse { +} + +message MsgEditInflationParamsResponse { +} diff --git a/x/inflation/genesis.go b/x/inflation/genesis.go index 0424a7fdb..e73abea94 100644 --- a/x/inflation/genesis.go +++ b/x/inflation/genesis.go @@ -21,7 +21,7 @@ func InitGenesis( } // Set genesis state - k.SetParams(ctx, data.Params) + k.UpdateParams(ctx, data.Params) period := data.Period k.CurrentPeriod.Set(ctx, period) diff --git a/x/inflation/keeper/grpc_query.go b/x/inflation/keeper/grpc_query.go index 395c7db7e..fa5d13e0c 100644 --- a/x/inflation/keeper/grpc_query.go +++ b/x/inflation/keeper/grpc_query.go @@ -9,7 +9,26 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -var _ types.QueryServer = Keeper{} +// querier implements the module's gRPC "QueryServer" interface +type querier struct { + Keeper +} + +// NewQuerier returns an implementation of the oracle QueryServer interface +// for the provided Keeper. +func NewQuerier(keeper Keeper) types.QueryServer { + return &querier{Keeper: keeper} +} + +var _ types.QueryServer = querier{} + +// Params is a gRPC query for the module parameters +func (q querier) Params(c context.Context, _ *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(c) + params := q.GetParams(ctx) + + return &types.QueryParamsResponse{Params: params}, nil +} // Period returns the current period of the inflation module. func (k Keeper) Period( @@ -66,13 +85,3 @@ func (k Keeper) CirculatingSupply( return &types.QueryCirculatingSupplyResponse{CirculatingSupply: coin}, nil } - -// Params returns params of the mint module. -func (k Keeper) Params( - c context.Context, - _ *types.QueryParamsRequest, -) (*types.QueryParamsResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - params := k.GetParams(ctx) - return &types.QueryParamsResponse{Params: params}, nil -} diff --git a/x/inflation/keeper/grpc_query_test.go b/x/inflation/keeper/grpc_query_test.go index ae75a09d2..6c8e666b7 100644 --- a/x/inflation/keeper/grpc_query_test.go +++ b/x/inflation/keeper/grpc_query_test.go @@ -6,6 +6,8 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" + "github.com/NibiruChain/nibiru/x/inflation/keeper" + "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" @@ -95,9 +97,13 @@ func (s *QueryServerSuite) TestQueryCirculatingSupply() { func (s *QueryServerSuite) TestQueryParams() { nibiruApp, ctx := s.nibiruApp, s.ctx - resp, err := nibiruApp.InflationKeeper.Params( - sdk.WrapSDKContext(ctx), &inflationtypes.QueryParamsRequest{}, - ) + resp, err := nibiruApp.InflationKeeper.Params.Get(ctx) s.NoError(err) s.NotNil(resp) + + queryServer := keeper.NewQuerier(nibiruApp.InflationKeeper) + + resp2, err := queryServer.Params(sdk.WrapSDKContext(ctx), &inflationtypes.QueryParamsRequest{}) + s.NoError(err) + s.NotNil(resp2) } diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index 0ce0391fa..10b89d95e 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -18,7 +18,7 @@ func TestEpochIdentifierAfterEpochEnd(t *testing.T) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.SetParams(ctx, params) + nibiruApp.InflationKeeper.UpdateParams(ctx, params) feePoolOld := nibiruApp.DistrKeeper.GetFeePool(ctx) nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, 1) @@ -154,7 +154,7 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = tc.InflationEnabled - nibiruApp.InflationKeeper.SetParams(ctx, params) + nibiruApp.InflationKeeper.UpdateParams(ctx, params) nibiruApp.InflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) nibiruApp.InflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index dbca22f15..0f3d0efb4 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -137,7 +137,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { "no epochs per period", sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), func(nibiruApp *app.NibiruApp, ctx sdk.Context) { - nibiruApp.InflationKeeper.SetParams(ctx, types.Params{ + nibiruApp.InflationKeeper.UpdateParams(ctx, types.Params{ EpochsPerPeriod: 0, InflationEnabled: true, PolynomialFactors: types.DefaultPolynomialFactors, @@ -152,7 +152,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.SetParams(ctx, params) + nibiruApp.InflationKeeper.UpdateParams(ctx, params) }, sdk.MustNewDecFromStr("27.095518287362700000"), }, @@ -162,7 +162,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.SetParams(ctx, params) + nibiruApp.InflationKeeper.UpdateParams(ctx, params) }, sdk.MustNewDecFromStr("54.191036574725400000"), }, diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index b9172322e..29dbe5c14 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -27,6 +27,7 @@ type Keeper struct { CurrentPeriod collections.Sequence NumSkippedEpochs collections.Sequence + Params collections.Item[types.Params] } // NewKeeper creates a new mint Keeper instance @@ -46,11 +47,6 @@ func NewKeeper( panic("the inflation module account has not been set") } - // set KeyTable if it has not already been set - if !paramspace.HasKeyTable() { - paramspace = paramspace.WithKeyTable(types.ParamKeyTable()) - } - return Keeper{ storeKey: storeKey, cdc: cdc, @@ -63,6 +59,7 @@ func NewKeeper( feeCollectorName: feeCollectorName, CurrentPeriod: collections.NewSequence(storeKey, 0), NumSkippedEpochs: collections.NewSequence(storeKey, 1), + Params: collections.NewItem(storeKey, 2, collections.ProtoValueEncoder[types.Params](cdc)), } } diff --git a/x/inflation/keeper/msg_server.go b/x/inflation/keeper/msg_server.go new file mode 100644 index 000000000..7b1b20624 --- /dev/null +++ b/x/inflation/keeper/msg_server.go @@ -0,0 +1,46 @@ +package keeper + +import ( + "context" + + sdk "github.com/cosmos/cosmos-sdk/types" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +type msgServer struct { + Keeper +} + +// NewMsgServerImpl returns an implementation of the inflation MsgServer interface +// for the provided Keeper. +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +// EditOracleParams: gRPC tx msg for editing the inflation module params. +// [SUDO] Only callable by sudoers. +func (ms msgServer) EditInflationParams( + goCtx context.Context, msg *types.MsgEditInflationParams, +) (resp *types.MsgEditInflationParamsResponse, err error) { + ctx := sdk.UnwrapSDKContext(goCtx) + // Stateless field validation is already performed in msg.ValidateBasic() + // before the current scope is reached. + sender, _ := sdk.AccAddressFromBech32(msg.Sender) + err = ms.Sudo().EditInflationParams(ctx, *msg, sender) + + resp = &types.MsgEditInflationParamsResponse{} + return resp, err +} + +func (ms msgServer) ToggleInflation( + goCtx context.Context, msg *types.MsgToggleInflation, +) (resp *types.MsgToggleInflationResponse, err error) { + ctx := sdk.UnwrapSDKContext(goCtx) + // Stateless field validation is already performed in msg.ValidateBasic() + // before the current scope is reached. + sender, _ := sdk.AccAddressFromBech32(msg.Sender) + err = ms.Sudo().ToggleInflation(ctx, msg.Enable, sender) + resp = &types.MsgToggleInflationResponse{} + return resp, err +} diff --git a/x/inflation/keeper/msg_server_test.go b/x/inflation/keeper/msg_server_test.go new file mode 100644 index 000000000..2f1e1483f --- /dev/null +++ b/x/inflation/keeper/msg_server_test.go @@ -0,0 +1,72 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/x/common/testutil" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/x/inflation/keeper" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +func TestMsgToggleInflation(t *testing.T) { + app, ctx := testapp.NewNibiruTestAppAndContext() + msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) + + params := app.InflationKeeper.GetParams(ctx) + require.False(t, params.InflationEnabled) + + msg := types.MsgToggleInflation{ + Sender: testutil.AccAddress().String(), + Enable: false, + } + _, err := msgServer.ToggleInflation(ctx, &msg) + require.ErrorContains(t, err, "insufficient permissions on smart contract") + + params = app.InflationKeeper.GetParams(ctx) + require.False(t, params.InflationEnabled) + + msg = types.MsgToggleInflation{ + Sender: testapp.DefaultSudoRoot().String(), + Enable: true, + } + + _, err = msgServer.ToggleInflation(ctx, &msg) + require.NoError(t, err) + + params = app.InflationKeeper.GetParams(ctx) + require.True(t, params.InflationEnabled) +} + +func TestMsgEditInflationParams(t *testing.T) { + app, ctx := testapp.NewNibiruTestAppAndContext() + msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) + + params := app.InflationKeeper.GetParams(ctx) + require.NotEqualValues(t, params.EpochsPerPeriod, 42) + + newEpochPerPeriod := sdk.NewInt(42) + msg := types.MsgEditInflationParams{ + Sender: testutil.AccAddress().String(), + EpochsPerPeriod: &newEpochPerPeriod, + } + _, err := msgServer.EditInflationParams(ctx, &msg) + require.ErrorContains(t, err, "insufficient permissions on smart contract") + + params = app.InflationKeeper.GetParams(ctx) + require.NotEqualValues(t, params.EpochsPerPeriod, 42) + + msg = types.MsgEditInflationParams{ + Sender: testapp.DefaultSudoRoot().String(), + EpochsPerPeriod: &newEpochPerPeriod, + } + + _, err = msgServer.EditInflationParams(ctx, &msg) + require.NoError(t, err) + + params = app.InflationKeeper.GetParams(ctx) + require.EqualValues(t, params.EpochsPerPeriod, 42) +} diff --git a/x/inflation/keeper/params.go b/x/inflation/keeper/params.go index c741ff304..cda15033f 100644 --- a/x/inflation/keeper/params.go +++ b/x/inflation/keeper/params.go @@ -6,41 +6,36 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -// GetParams returns the total set of inflation parameters. -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramSpace.GetParamSet(ctx, ¶ms) - return +func (k Keeper) UpdateParams(ctx sdk.Context, params types.Params) { + k.Params.Set(ctx, params) } -// SetParams sets the inflation params in a single key -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramSpace.SetParamSet(ctx, ¶ms) +func (k Keeper) GetParams(ctx sdk.Context) types.Params { + params, _ := k.Params.Get(ctx) + return params } -// VotePeriod returns the number of blocks during which voting takes place. func (k Keeper) PolynomialFactors(ctx sdk.Context) (res []sdk.Dec) { - k.paramSpace.Get(ctx, types.KeyPolynomialFactors, &res) - return + params, _ := k.Params.Get(ctx) + return params.PolynomialFactors } -// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. func (k Keeper) InflationDistribution(ctx sdk.Context) (res types.InflationDistribution) { - k.paramSpace.Get(ctx, types.KeyInflationDistribution, &res) - return + params, _ := k.Params.Get(ctx) + return params.InflationDistribution } -// VoteThreshold returns the minimum percentage of votes that must be received for a ballot to pass. func (k Keeper) InflationEnabled(ctx sdk.Context) (res bool) { - k.paramSpace.Get(ctx, types.KeyInflationEnabled, &res) - return + params, _ := k.Params.Get(ctx) + return params.InflationEnabled } func (k Keeper) EpochsPerPeriod(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeyEpochsPerPeriod, &res) - return + params, _ := k.Params.Get(ctx) + return params.EpochsPerPeriod } func (k Keeper) PeriodsPerYear(ctx sdk.Context) (res uint64) { - k.paramSpace.Get(ctx, types.KeyPeriodsPerYear, &res) - return + params, _ := k.Params.Get(ctx) + return params.PeriodsPerYear } diff --git a/x/inflation/keeper/sudo.go b/x/inflation/keeper/sudo.go new file mode 100644 index 000000000..2877b3be0 --- /dev/null +++ b/x/inflation/keeper/sudo.go @@ -0,0 +1,90 @@ +package keeper + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + + inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// Sudo extends the Keeper with sudo functions. See sudo.go. +// +// These Sudo functions should: +// 1. Not be called in other methods in the module. +// 2. Only be callable by the x/sudo root or sudo contracts. +// +// The intention behind "Keeper.Sudo()" is to make it more obvious to the +// developer that an unsafe function is being used when it's called. +func (k Keeper) Sudo() sudoExtension { return sudoExtension{k} } + +type sudoExtension struct{ Keeper } + +// ------------------------------------------------------------------ +// Admin.EditInflationParams + +func (k sudoExtension) EditInflationParams( + ctx sdk.Context, newParams inflationtypes.MsgEditInflationParams, + sender sdk.AccAddress, +) (err error) { + if err = k.sudoKeeper.CheckPermissions(sender, ctx); err != nil { + return + } + + params, err := k.Params.Get(ctx) + if err != nil { + return fmt.Errorf("%w: failed to read inflation params", err) + } + + paramsAfter, err := MergeInflationParams(newParams, params) + if err != nil { + return + } + k.UpdateParams(ctx, paramsAfter) + return paramsAfter.Validate() +} + +func (k sudoExtension) ToggleInflation( + ctx sdk.Context, enabled bool, sender sdk.AccAddress, +) (err error) { + if err = k.sudoKeeper.CheckPermissions(sender, ctx); err != nil { + return + } + + params, err := k.Params.Get(ctx) + if err != nil { + return + } + + params.InflationEnabled = enabled + k.UpdateParams(ctx, params) + return +} + +// MergeInflationParams: Takes the given Inflation params and merges them into the +// existing partial params, keeping any existing values that are not set in the +// partial. +func MergeInflationParams( + partial inflationtypes.MsgEditInflationParams, + inflationParams inflationtypes.Params, +) (inflationtypes.Params, error) { + if partial.PolynomialFactors != nil { + inflationParams.PolynomialFactors = partial.PolynomialFactors + } + + if partial.InflationDistribution != nil { + inflationParams.InflationDistribution = *partial.InflationDistribution + } + + if partial.EpochsPerPeriod != nil { + inflationParams.EpochsPerPeriod = partial.EpochsPerPeriod.Uint64() + } + if partial.PeriodsPerYear != nil { + inflationParams.PeriodsPerYear = partial.PeriodsPerYear.Uint64() + } + if partial.MaxPeriod != nil { + inflationParams.MaxPeriod = partial.MaxPeriod.Uint64() + } + + return inflationParams, inflationParams.Validate() +} diff --git a/x/inflation/keeper/sudo_test.go b/x/inflation/keeper/sudo_test.go new file mode 100644 index 000000000..c527c2a7e --- /dev/null +++ b/x/inflation/keeper/sudo_test.go @@ -0,0 +1,133 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/suite" + + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + inflationKeeper "github.com/NibiruChain/nibiru/x/inflation/keeper" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +func TestSuiteInflationSudo(t *testing.T) { + suite.Run(t, new(SuiteInflationSudo)) +} + +type SuiteInflationSudo struct { + suite.Suite +} + +func (s *SuiteInflationSudo) TestMergeInflationParams() { + currentParams := types.DefaultParams() + + newEpochsPerPeriod := sdk.NewInt(4) + paramsChanges := types.MsgEditInflationParams{ + EpochsPerPeriod: &newEpochsPerPeriod, + } + + paramsAfter, err := inflationKeeper.MergeInflationParams(paramsChanges, currentParams) + s.Require().NoError(err) + s.Require().EqualValues(4, paramsAfter.EpochsPerPeriod) + + // Test that the other params are unchanged. + s.Require().EqualValues(currentParams.InflationEnabled, paramsAfter.InflationEnabled) + s.Require().EqualValues(currentParams.PeriodsPerYear, paramsAfter.PeriodsPerYear) + s.Require().EqualValues(currentParams.MaxPeriod, paramsAfter.MaxPeriod) + s.Require().EqualValues(currentParams.PolynomialFactors, paramsAfter.PolynomialFactors) + s.Require().EqualValues(currentParams.InflationDistribution, paramsAfter.InflationDistribution) + + // Test a change to all parameters + newInflationDistribution := types.InflationDistribution{ + CommunityPool: sdk.MustNewDecFromStr("0.8"), + StakingRewards: sdk.MustNewDecFromStr("0.1"), + StrategicReserves: sdk.MustNewDecFromStr("0.1"), + } + + paramsChanges = types.MsgEditInflationParams{ + EpochsPerPeriod: &newEpochsPerPeriod, + PeriodsPerYear: &newEpochsPerPeriod, + MaxPeriod: &newEpochsPerPeriod, + PolynomialFactors: []sdk.Dec{ + sdk.MustNewDecFromStr("0.1"), + sdk.MustNewDecFromStr("0.2"), + }, + InflationDistribution: &newInflationDistribution, + } + + paramsAfter, err = inflationKeeper.MergeInflationParams(paramsChanges, currentParams) + s.Require().NoError(err) + s.Require().EqualValues(4, paramsAfter.EpochsPerPeriod) + s.Require().EqualValues(4, paramsAfter.PeriodsPerYear) + s.Require().EqualValues(4, paramsAfter.MaxPeriod) + s.Require().EqualValues([]sdk.Dec{ + sdk.MustNewDecFromStr("0.1"), + sdk.MustNewDecFromStr("0.2"), + }, paramsAfter.PolynomialFactors) + s.Require().EqualValues(newInflationDistribution, paramsAfter.InflationDistribution) +} + +func (s *SuiteInflationSudo) TestEditInflationParams() { + nibiru, ctx := testapp.NewNibiruTestAppAndContext() + + // Change to all non-defaults to test EditInflationParams as a setter . + epochsPerPeriod := sdk.NewInt(1_234) + periodsPerYear := sdk.NewInt(1_234) + maxPeriod := sdk.NewInt(1_234) + polynomialFactors := []sdk.Dec{ + sdk.MustNewDecFromStr("0.1"), + sdk.MustNewDecFromStr("0.2"), + } + inflationDistribution := types.InflationDistribution{ + CommunityPool: sdk.MustNewDecFromStr("0.8"), + StakingRewards: sdk.MustNewDecFromStr("0.1"), + StrategicReserves: sdk.MustNewDecFromStr("0.1"), + } + msgEditParams := types.MsgEditInflationParams{ + EpochsPerPeriod: &epochsPerPeriod, + PeriodsPerYear: &periodsPerYear, + MaxPeriod: &maxPeriod, + PolynomialFactors: polynomialFactors, + InflationDistribution: &inflationDistribution, + } + + s.T().Log("Params before MUST NOT be equal to default") + defaultParams := types.DefaultParams() + currParams, err := nibiru.InflationKeeper.Params.Get(ctx) + s.Require().NoError(err) + s.Require().Equal(currParams, defaultParams, + "Current params should be eqaul to defaults") + partialParams := msgEditParams + + s.T().Log("EditInflationParams should succeed") + okSender := testapp.DefaultSudoRoot() + err = nibiru.InflationKeeper.Sudo().EditInflationParams(ctx, partialParams, okSender) + s.Require().NoError(err) + + s.T().Log("Params after MUST be equal to partial params") + paramsAfter, err := nibiru.InflationKeeper.Params.Get(ctx) + s.Require().NoError(err) + s.Require().EqualValues(1234, paramsAfter.EpochsPerPeriod) + s.Require().EqualValues(1234, paramsAfter.PeriodsPerYear) + s.Require().EqualValues(1234, paramsAfter.MaxPeriod) + s.Require().EqualValues(polynomialFactors, paramsAfter.PolynomialFactors) + s.Require().EqualValues(inflationDistribution, paramsAfter.InflationDistribution) +} + +func (s *SuiteInflationSudo) TestToggleInflation() { + nibiru, ctx := testapp.NewNibiruTestAppAndContext() + + err := nibiru.InflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) + s.Require().NoError(err) + + params, err := nibiru.InflationKeeper.Params.Get(ctx) + s.Require().NoError(err) + s.Require().True(params.InflationEnabled) + + err = nibiru.InflationKeeper.Sudo().ToggleInflation(ctx, false, testapp.DefaultSudoRoot()) + s.Require().NoError(err) + params, err = nibiru.InflationKeeper.Params.Get(ctx) + s.Require().NoError(err) + s.Require().False(params.InflationEnabled) +} diff --git a/x/inflation/module.go b/x/inflation/module.go index 5265af192..3fccc5404 100644 --- a/x/inflation/module.go +++ b/x/inflation/module.go @@ -47,9 +47,9 @@ func (AppModuleBasic) ConsensusVersion() uint64 { return 3 } -// RegisterInterfaces registers interfaces and implementations of the inflation -// module. -func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { +// RegisterInterfaces registers the module's interface types +func (b AppModuleBasic) RegisterInterfaces(registry codectypes.InterfaceRegistry) { + types.RegisterInterfaces(registry) } // DefaultGenesis returns default genesis state as raw bytes for the inflation @@ -115,10 +115,11 @@ func (AppModule) Name() string { // RegisterInvariants registers the inflation module invariants. func (am AppModule) RegisterInvariants(_ sdk.InvariantRegistry) {} -// RegisterServices registers a gRPC query service to respond to the -// module-specific gRPC queries. +// RegisterServices registers module services. func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterQueryServer(cfg.QueryServer(), am.keeper) + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + querier := keeper.NewQuerier(am.keeper) + types.RegisterQueryServer(cfg.QueryServer(), querier) } // BeginBlock returns the begin blocker for the inflation module. diff --git a/x/inflation/types/codec.go b/x/inflation/types/codec.go new file mode 100644 index 000000000..b939b24a9 --- /dev/null +++ b/x/inflation/types/codec.go @@ -0,0 +1,44 @@ +package types + +import ( + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +// RegisterLegacyAminoCodec registers the necessary x/inflation interfaces and concrete types +// on the provided LegacyAmino codec. These types are used for Amino JSON serialization. +func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { + cdc.RegisterConcrete(&MsgEditInflationParams{}, "inflation/MsgEditInflationParams", nil) + cdc.RegisterConcrete(&MsgToggleInflation{}, "inflation/MsgToggleInflation", nil) +} + +// RegisterInterfaces registers the x/inflation interfaces types with the interface registry +func RegisterInterfaces(registry codectypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgEditInflationParams{}, + &MsgToggleInflation{}, + ) + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) +} + +var ( + amino = codec.NewLegacyAmino() + + // ModuleCdc references the global x/inflation module codec. Note, the codec should + // ONLY be used in certain instances of tests and for JSON encoding as Amino is + // still used for that purpose. + // + // The actual codec used for serialization should be provided to x/staking and + // defined at the application level. + ModuleCdc = codec.NewAminoCodec(amino) +) + +func init() { + RegisterLegacyAminoCodec(amino) + cryptocodec.RegisterCrypto(amino) + amino.Seal() +} diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index 4a9f0bb01..2233ac4e0 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -42,4 +42,5 @@ type StakingKeeper interface { type SudoKeeper interface { GetRootAddr(ctx sdk.Context) (sdk.AccAddress, error) + CheckPermissions(contract sdk.AccAddress, ctx sdk.Context) error } diff --git a/x/inflation/types/msgs.go b/x/inflation/types/msgs.go new file mode 100644 index 000000000..fa9c8da82 --- /dev/null +++ b/x/inflation/types/msgs.go @@ -0,0 +1,75 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// ensure Msg interface compliance at compile time +var ( + _ sdk.Msg = &MsgEditInflationParams{} + _ sdk.Msg = &MsgToggleInflation{} +) + +// oracle message types +const ( + TypeMsgEditInflationParams = "edit_inflation_params" + TypeMsgToggleInflation = "toggle_inflation" +) + +// Route implements sdk.Msg +func (msg MsgEditInflationParams) Route() string { return RouterKey } + +// Type implements sdk.Msg +func (msg MsgEditInflationParams) Type() string { return TypeMsgEditInflationParams } + +// GetSignBytes implements sdk.Msg +func (msg MsgEditInflationParams) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +// GetSigners implements sdk.Msg +func (msg MsgEditInflationParams) GetSigners() []sdk.AccAddress { + feeder, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + + return []sdk.AccAddress{feeder} +} + +func (m MsgEditInflationParams) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { + return err + } + return nil +} + +// ------------------------------------------------- +// MsgToggleInflation +// Route implements sdk.Msg +func (msg MsgToggleInflation) Route() string { return RouterKey } + +// Type implements sdk.Msg +func (msg MsgToggleInflation) Type() string { return TypeMsgToggleInflation } + +// GetSignBytes implements sdk.Msg +func (msg MsgToggleInflation) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +// GetSigners implements sdk.Msg +func (msg MsgToggleInflation) GetSigners() []sdk.AccAddress { + feeder, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + + return []sdk.AccAddress{feeder} +} + +func (m MsgToggleInflation) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { + return err + } + return nil +} diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go index 500d672b4..63b879546 100644 --- a/x/inflation/types/params.go +++ b/x/inflation/types/params.go @@ -5,7 +5,6 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" ) var ( @@ -67,26 +66,6 @@ func DefaultParams() Params { } } -// ParamKeyTable returns the parameter key table. -func ParamKeyTable() paramstypes.KeyTable { - return paramstypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -var _ paramstypes.ParamSet = (*Params)(nil) - -// ParamSetPairs returns all the of key, value type, and validation function -// for each module parameter. ParamSetPairs implements the ParamSet interface. -func (p *Params) ParamSetPairs() paramstypes.ParamSetPairs { - return paramstypes.ParamSetPairs{ - paramstypes.NewParamSetPair(KeyInflationEnabled, &p.InflationEnabled, validateBool), - paramstypes.NewParamSetPair(KeyPolynomialFactors, &p.PolynomialFactors, validatePolynomialFactors), - paramstypes.NewParamSetPair(KeyInflationDistribution, &p.InflationDistribution, validateInflationDistribution), - paramstypes.NewParamSetPair(KeyEpochsPerPeriod, &p.EpochsPerPeriod, validateUint64), - paramstypes.NewParamSetPair(KeyPeriodsPerYear, &p.PeriodsPerYear, validateUint64), - paramstypes.NewParamSetPair(KeyMaxPeriod, &p.MaxPeriod, validateUint64), - } -} - func validatePolynomialFactors(i interface{}) error { v, ok := i.([]sdk.Dec) if !ok { diff --git a/x/inflation/types/params_test.go b/x/inflation/types/params_test.go index 805855c36..e51ecf1bd 100644 --- a/x/inflation/types/params_test.go +++ b/x/inflation/types/params_test.go @@ -3,16 +3,10 @@ package types_test import ( "testing" - storetypes "github.com/cosmos/cosmos-sdk/store/types" - - "github.com/NibiruChain/nibiru/app/codec" inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" ) func TestParamsValidate(t *testing.T) { @@ -135,36 +129,3 @@ func TestParamsValidate(t *testing.T) { }) } } - -type ParamKeyTableTestSuite struct { - suite.Suite -} - -func (s *ParamKeyTableTestSuite) TestParamKeyTable() { - encCfg := codec.MakeEncodingConfig() - cdc := encCfg.Marshaler - amino := encCfg.Amino - - storeKey := storetypes.NewKVStoreKey("mockStoreKey") - transientStoreKey := storetypes.NewTransientStoreKey("mockTransientKey") - - var keyTable paramstypes.KeyTable - s.Require().NotPanics(func() { - keyTable = inflationtypes.ParamKeyTable() - }) - s.Require().NotPanics(func() { - subspace := paramstypes.NewSubspace( - cdc, - amino, - storeKey, transientStoreKey, "inflationsubspace", - ) - subspace.WithKeyTable(keyTable) - }) -} - -func (s *ParamKeyTableTestSuite) TestParamSetPairs() { - s.NotPanics(func() { - moduleParams := inflationtypes.DefaultParams() - _ = moduleParams.ParamSetPairs() - }) -} diff --git a/x/inflation/types/tx.pb.go b/x/inflation/types/tx.pb.go new file mode 100644 index 000000000..806fe9c66 --- /dev/null +++ b/x/inflation/types/tx.pb.go @@ -0,0 +1,1201 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: nibiru/inflation/v1/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// MsgToggleInflation defines a message to enable or disable inflation. +type MsgToggleInflation struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + Enable bool `protobuf:"varint,2,opt,name=enable,proto3" json:"enable,omitempty" yaml:"enable"` +} + +func (m *MsgToggleInflation) Reset() { *m = MsgToggleInflation{} } +func (m *MsgToggleInflation) String() string { return proto.CompactTextString(m) } +func (*MsgToggleInflation) ProtoMessage() {} +func (*MsgToggleInflation) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{0} +} +func (m *MsgToggleInflation) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgToggleInflation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgToggleInflation.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgToggleInflation) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgToggleInflation.Merge(m, src) +} +func (m *MsgToggleInflation) XXX_Size() int { + return m.Size() +} +func (m *MsgToggleInflation) XXX_DiscardUnknown() { + xxx_messageInfo_MsgToggleInflation.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgToggleInflation proto.InternalMessageInfo + +type MsgEditInflationParams struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + InflationEnabled bool `protobuf:"varint,2,opt,name=inflation_enabled,json=inflationEnabled,proto3" json:"inflation_enabled,omitempty"` + PolynomialFactors []github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,rep,name=polynomial_factors,json=polynomialFactors,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"polynomial_factors,omitempty"` + InflationDistribution *InflationDistribution `protobuf:"bytes,4,opt,name=inflation_distribution,json=inflationDistribution,proto3" json:"inflation_distribution,omitempty"` + EpochsPerPeriod *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,5,opt,name=epochs_per_period,json=epochsPerPeriod,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"epochs_per_period,omitempty"` + PeriodsPerYear *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,6,opt,name=periods_per_year,json=periodsPerYear,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"periods_per_year,omitempty"` + MaxPeriod *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=max_period,json=maxPeriod,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"max_period,omitempty"` +} + +func (m *MsgEditInflationParams) Reset() { *m = MsgEditInflationParams{} } +func (m *MsgEditInflationParams) String() string { return proto.CompactTextString(m) } +func (*MsgEditInflationParams) ProtoMessage() {} +func (*MsgEditInflationParams) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{1} +} +func (m *MsgEditInflationParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEditInflationParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEditInflationParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEditInflationParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEditInflationParams.Merge(m, src) +} +func (m *MsgEditInflationParams) XXX_Size() int { + return m.Size() +} +func (m *MsgEditInflationParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEditInflationParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEditInflationParams proto.InternalMessageInfo + +type MsgToggleInflationResponse struct { +} + +func (m *MsgToggleInflationResponse) Reset() { *m = MsgToggleInflationResponse{} } +func (m *MsgToggleInflationResponse) String() string { return proto.CompactTextString(m) } +func (*MsgToggleInflationResponse) ProtoMessage() {} +func (*MsgToggleInflationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{2} +} +func (m *MsgToggleInflationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgToggleInflationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgToggleInflationResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgToggleInflationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgToggleInflationResponse.Merge(m, src) +} +func (m *MsgToggleInflationResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgToggleInflationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgToggleInflationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgToggleInflationResponse proto.InternalMessageInfo + +type MsgEditInflationParamsResponse struct { +} + +func (m *MsgEditInflationParamsResponse) Reset() { *m = MsgEditInflationParamsResponse{} } +func (m *MsgEditInflationParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgEditInflationParamsResponse) ProtoMessage() {} +func (*MsgEditInflationParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{3} +} +func (m *MsgEditInflationParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgEditInflationParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgEditInflationParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgEditInflationParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgEditInflationParamsResponse.Merge(m, src) +} +func (m *MsgEditInflationParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgEditInflationParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgEditInflationParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgEditInflationParamsResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgToggleInflation)(nil), "nibiru.inflation.v1.MsgToggleInflation") + proto.RegisterType((*MsgEditInflationParams)(nil), "nibiru.inflation.v1.MsgEditInflationParams") + proto.RegisterType((*MsgToggleInflationResponse)(nil), "nibiru.inflation.v1.MsgToggleInflationResponse") + proto.RegisterType((*MsgEditInflationParamsResponse)(nil), "nibiru.inflation.v1.MsgEditInflationParamsResponse") +} + +func init() { proto.RegisterFile("nibiru/inflation/v1/tx.proto", fileDescriptor_9f6843f876608d76) } + +var fileDescriptor_9f6843f876608d76 = []byte{ + // 579 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x41, 0x6f, 0x12, 0x4f, + 0x18, 0xc6, 0xd9, 0xc2, 0x9f, 0x7f, 0x19, 0xa3, 0x2d, 0x53, 0x25, 0x1b, 0xc4, 0x85, 0x6c, 0x13, + 0x4b, 0x6d, 0xd8, 0x49, 0xdb, 0x5b, 0x8f, 0xd8, 0x9a, 0x70, 0xc0, 0x90, 0x8d, 0x07, 0x6d, 0x62, + 0xc8, 0xc0, 0x4e, 0x97, 0x89, 0xbb, 0x3b, 0x9b, 0x99, 0xa1, 0x81, 0xab, 0x27, 0x8f, 0x4d, 0xfc, + 0x02, 0x3d, 0xfa, 0x01, 0xfc, 0x06, 0x5e, 0x7a, 0x6c, 0xe2, 0xc5, 0x78, 0x20, 0x06, 0x3c, 0x78, + 0xf6, 0x13, 0x18, 0x76, 0x60, 0x21, 0xb2, 0x4d, 0x6c, 0x0f, 0x04, 0x66, 0x9f, 0x67, 0x7e, 0xef, + 0x33, 0xbc, 0xef, 0x2c, 0x28, 0x05, 0xb4, 0x43, 0x79, 0x1f, 0xd1, 0xe0, 0xcc, 0xc3, 0x92, 0xb2, + 0x00, 0x9d, 0xef, 0x23, 0x39, 0xb0, 0x42, 0xce, 0x24, 0x83, 0x5b, 0x4a, 0xb5, 0x62, 0xd5, 0x3a, + 0xdf, 0x2f, 0x3e, 0x74, 0x99, 0xcb, 0x22, 0x1d, 0x4d, 0x7f, 0x29, 0x6b, 0xb1, 0xe4, 0x32, 0xe6, + 0x7a, 0x04, 0xe1, 0x90, 0x22, 0x1c, 0x04, 0x4c, 0x46, 0x7e, 0x31, 0x53, 0xb7, 0x93, 0xca, 0x2c, + 0xa8, 0x91, 0xc9, 0xc4, 0x00, 0x36, 0x85, 0xfb, 0x8a, 0xb9, 0xae, 0x47, 0x1a, 0x73, 0x0d, 0x16, + 0x40, 0x56, 0x90, 0xc0, 0x21, 0x5c, 0xd7, 0x2a, 0x5a, 0x35, 0x67, 0xcf, 0x56, 0x70, 0x17, 0x64, + 0x49, 0x80, 0x3b, 0x1e, 0xd1, 0xd7, 0x2a, 0x5a, 0x75, 0xbd, 0x9e, 0xff, 0x3d, 0x2a, 0xdf, 0x1f, + 0x62, 0xdf, 0x3b, 0x32, 0xd5, 0x73, 0xd3, 0x9e, 0x19, 0x8e, 0xd6, 0x3f, 0x5c, 0x96, 0x53, 0xbf, + 0x2e, 0xcb, 0x29, 0xf3, 0x73, 0x06, 0x14, 0x9a, 0xc2, 0x3d, 0x71, 0xa8, 0x8c, 0x2b, 0xb4, 0x30, + 0xc7, 0xbe, 0xb8, 0xb1, 0xce, 0x1e, 0xc8, 0xc7, 0x41, 0xdb, 0x0a, 0xe8, 0xa8, 0x92, 0xf6, 0x66, + 0x2c, 0x9c, 0xa8, 0xe7, 0xf0, 0x2d, 0x80, 0x21, 0xf3, 0x86, 0x01, 0xf3, 0x29, 0xf6, 0xda, 0x67, + 0xb8, 0x2b, 0x19, 0x17, 0x7a, 0xba, 0x92, 0xae, 0xe6, 0xea, 0xd6, 0xd5, 0xa8, 0xac, 0x7d, 0x1f, + 0x95, 0x9f, 0xba, 0x54, 0xf6, 0xfa, 0x1d, 0xab, 0xcb, 0x7c, 0xd4, 0x65, 0xc2, 0x67, 0x62, 0xf6, + 0x55, 0x13, 0xce, 0x3b, 0x24, 0x87, 0x21, 0x11, 0xd6, 0x31, 0xe9, 0xda, 0xf9, 0x05, 0xe9, 0x85, + 0x02, 0x41, 0x17, 0x14, 0x16, 0x59, 0x1c, 0x2a, 0x24, 0xa7, 0x9d, 0xfe, 0x74, 0xa1, 0x67, 0x2a, + 0x5a, 0xf5, 0xde, 0xc1, 0x33, 0x2b, 0xa1, 0x61, 0x56, 0x7c, 0xd2, 0xe3, 0xa5, 0x1d, 0xf5, 0xcc, + 0x34, 0x8e, 0xfd, 0x88, 0x26, 0x89, 0xf0, 0x14, 0xe4, 0x49, 0xc8, 0xba, 0x3d, 0xd1, 0x0e, 0x09, + 0x9f, 0x7e, 0x28, 0x73, 0xf4, 0xff, 0xa6, 0xff, 0xcb, 0xad, 0x8e, 0xd1, 0x08, 0xa4, 0xbd, 0xa1, + 0x40, 0x2d, 0xc2, 0x5b, 0x11, 0x06, 0xbe, 0x06, 0x9b, 0x0a, 0xa8, 0xe0, 0x43, 0x82, 0xb9, 0x9e, + 0xbd, 0x13, 0xfa, 0xc1, 0x8c, 0xd3, 0x22, 0xfc, 0x0d, 0xc1, 0x1c, 0x36, 0x01, 0xf0, 0xf1, 0x60, + 0x1e, 0xf7, 0xff, 0x3b, 0x31, 0x73, 0x3e, 0x1e, 0xa8, 0xa0, 0x4b, 0x63, 0x53, 0x02, 0xc5, 0xd5, + 0xc9, 0xb4, 0x89, 0x08, 0x59, 0x20, 0x88, 0x59, 0x01, 0x46, 0xf2, 0x4c, 0xcd, 0x1d, 0x07, 0x5f, + 0xd6, 0x40, 0xba, 0x29, 0x5c, 0x78, 0xa1, 0x81, 0x8d, 0xbf, 0xe7, 0x7b, 0x27, 0xb1, 0x67, 0xab, + 0xe5, 0x8a, 0xe8, 0x1f, 0x8d, 0x71, 0xae, 0xed, 0xf7, 0x5f, 0x7f, 0x7e, 0x5c, 0x7b, 0x62, 0x3e, + 0x46, 0x89, 0x97, 0x3c, 0xda, 0x05, 0x3f, 0x69, 0x60, 0x2b, 0xe9, 0x3a, 0xec, 0xdd, 0x54, 0x2d, + 0xc1, 0x5c, 0x3c, 0xbc, 0x85, 0x39, 0x8e, 0x87, 0xa2, 0x78, 0xbb, 0xe6, 0xce, 0x6a, 0x3c, 0xe2, + 0x50, 0x59, 0x8b, 0x97, 0xb5, 0x30, 0xda, 0x58, 0x6f, 0x5c, 0x8d, 0x0d, 0xed, 0x7a, 0x6c, 0x68, + 0x3f, 0xc6, 0x86, 0x76, 0x31, 0x31, 0x52, 0xd7, 0x13, 0x23, 0xf5, 0x6d, 0x62, 0xa4, 0x4e, 0xd1, + 0x52, 0x73, 0x5f, 0x46, 0xb0, 0xe7, 0x3d, 0x4c, 0x83, 0x39, 0x78, 0xb0, 0x84, 0x8e, 0x3a, 0xdd, + 0xc9, 0x46, 0x6f, 0x9c, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x1b, 0xc3, 0x86, 0xff, + 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // ToggleInflation defines a method to enable or disable inflation. + ToggleInflation(ctx context.Context, in *MsgToggleInflation, opts ...grpc.CallOption) (*MsgToggleInflationResponse, error) + // EditInflationParams defines a method to edit the inflation params. + EditInflationParams(ctx context.Context, in *MsgEditInflationParams, opts ...grpc.CallOption) (*MsgEditInflationParamsResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) ToggleInflation(ctx context.Context, in *MsgToggleInflation, opts ...grpc.CallOption) (*MsgToggleInflationResponse, error) { + out := new(MsgToggleInflationResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Msg/ToggleInflation", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) EditInflationParams(ctx context.Context, in *MsgEditInflationParams, opts ...grpc.CallOption) (*MsgEditInflationParamsResponse, error) { + out := new(MsgEditInflationParamsResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Msg/EditInflationParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // ToggleInflation defines a method to enable or disable inflation. + ToggleInflation(context.Context, *MsgToggleInflation) (*MsgToggleInflationResponse, error) + // EditInflationParams defines a method to edit the inflation params. + EditInflationParams(context.Context, *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) ToggleInflation(ctx context.Context, req *MsgToggleInflation) (*MsgToggleInflationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ToggleInflation not implemented") +} +func (*UnimplementedMsgServer) EditInflationParams(ctx context.Context, req *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EditInflationParams not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_ToggleInflation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgToggleInflation) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).ToggleInflation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Msg/ToggleInflation", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).ToggleInflation(ctx, req.(*MsgToggleInflation)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_EditInflationParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgEditInflationParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).EditInflationParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Msg/EditInflationParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).EditInflationParams(ctx, req.(*MsgEditInflationParams)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "nibiru.inflation.v1.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ToggleInflation", + Handler: _Msg_ToggleInflation_Handler, + }, + { + MethodName: "EditInflationParams", + Handler: _Msg_EditInflationParams_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "nibiru/inflation/v1/tx.proto", +} + +func (m *MsgToggleInflation) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgToggleInflation) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgToggleInflation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Enable { + i-- + if m.Enable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEditInflationParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEditInflationParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEditInflationParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MaxPeriod != nil { + { + size := m.MaxPeriod.Size() + i -= size + if _, err := m.MaxPeriod.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.PeriodsPerYear != nil { + { + size := m.PeriodsPerYear.Size() + i -= size + if _, err := m.PeriodsPerYear.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if m.EpochsPerPeriod != nil { + { + size := m.EpochsPerPeriod.Size() + i -= size + if _, err := m.EpochsPerPeriod.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.InflationDistribution != nil { + { + size, err := m.InflationDistribution.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if len(m.PolynomialFactors) > 0 { + for iNdEx := len(m.PolynomialFactors) - 1; iNdEx >= 0; iNdEx-- { + { + size := m.PolynomialFactors[iNdEx].Size() + i -= size + if _, err := m.PolynomialFactors[iNdEx].MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.InflationEnabled { + i-- + if m.InflationEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgToggleInflationResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgToggleInflationResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgToggleInflationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgEditInflationParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEditInflationParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEditInflationParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgToggleInflation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Enable { + n += 2 + } + return n +} + +func (m *MsgEditInflationParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.InflationEnabled { + n += 2 + } + if len(m.PolynomialFactors) > 0 { + for _, e := range m.PolynomialFactors { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + if m.InflationDistribution != nil { + l = m.InflationDistribution.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.EpochsPerPeriod != nil { + l = m.EpochsPerPeriod.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.PeriodsPerYear != nil { + l = m.PeriodsPerYear.Size() + n += 1 + l + sovTx(uint64(l)) + } + if m.MaxPeriod != nil { + l = m.MaxPeriod.Size() + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgToggleInflationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEditInflationParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgToggleInflation) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgToggleInflation: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgToggleInflation: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enable = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditInflationParams) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEditInflationParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditInflationParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InflationEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.InflationEnabled = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PolynomialFactors", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.PolynomialFactors = append(m.PolynomialFactors, v) + if err := m.PolynomialFactors[len(m.PolynomialFactors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InflationDistribution", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.InflationDistribution == nil { + m.InflationDistribution = &InflationDistribution{} + } + if err := m.InflationDistribution.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochsPerPeriod", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Int + m.EpochsPerPeriod = &v + if err := m.EpochsPerPeriod.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PeriodsPerYear", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Int + m.PeriodsPerYear = &v + if err := m.PeriodsPerYear.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxPeriod", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Int + m.MaxPeriod = &v + if err := m.MaxPeriod.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgToggleInflationResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgToggleInflationResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgToggleInflationResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditInflationParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEditInflationParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditInflationParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/inflation/types/tx.pb.gw.go b/x/inflation/types/tx.pb.gw.go new file mode 100644 index 000000000..0d122966c --- /dev/null +++ b/x/inflation/types/tx.pb.gw.go @@ -0,0 +1,254 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: nibiru/inflation/v1/tx.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +var ( + filter_Msg_ToggleInflation_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Msg_ToggleInflation_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgToggleInflation + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ToggleInflation_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ToggleInflation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Msg_ToggleInflation_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgToggleInflation + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_ToggleInflation_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ToggleInflation(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Msg_EditInflationParams_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Msg_EditInflationParams_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgEditInflationParams + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_EditInflationParams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EditInflationParams(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Msg_EditInflationParams_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgEditInflationParams + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_EditInflationParams_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EditInflationParams(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". +// UnaryRPC :call MsgServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMsgHandlerFromEndpoint instead. +func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MsgServer) error { + + mux.Handle("POST", pattern_Msg_ToggleInflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Msg_ToggleInflation_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_ToggleInflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Msg_EditInflationParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Msg_EditInflationParams_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_EditInflationParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterMsgHandlerFromEndpoint is same as RegisterMsgHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterMsgHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterMsgHandler(ctx, mux, conn) +} + +// RegisterMsgHandler registers the http handlers for service Msg to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterMsgHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterMsgHandlerClient(ctx, mux, NewMsgClient(conn)) +} + +// RegisterMsgHandlerClient registers the http handlers for service Msg +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MsgClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MsgClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "MsgClient" to call the correct interceptors. +func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MsgClient) error { + + mux.Handle("POST", pattern_Msg_ToggleInflation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Msg_ToggleInflation_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_ToggleInflation_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Msg_EditInflationParams_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Msg_EditInflationParams_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_EditInflationParams_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Msg_ToggleInflation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "toggle"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Msg_EditInflationParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "inflation", "edit-inflation-params"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Msg_ToggleInflation_0 = runtime.ForwardResponseMessage + + forward_Msg_EditInflationParams_0 = runtime.ForwardResponseMessage +) From 348232df447bcef2f331102dcae84fa3a3a1deab Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:39:37 -0600 Subject: [PATCH 37/99] ci: bump grocksdb to 1.8.12 --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 92a875731..61320a298 100644 --- a/go.mod +++ b/go.mod @@ -127,7 +127,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.6 // indirect + github.com/linxGnu/grocksdb v1.8.12 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -191,5 +191,3 @@ replace github.com/cosmos/iavl => github.com/cosmos/iavl v0.20.0 // pin version! 126854af5e6d has issues with the store so that queries fail replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 - -replace github.com/linxGnu/grocksdb => github.com/linxGnu/grocksdb v1.8.11 diff --git a/go.sum b/go.sum index 1fdfa30f3..10a6b12d0 100644 --- a/go.sum +++ b/go.sum @@ -876,8 +876,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.11 h1:BGol9e5gB1BrsTvOxloC88pe70TCqgrfLNwkyWW0kD8= -github.com/linxGnu/grocksdb v1.8.11/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= +github.com/linxGnu/grocksdb v1.8.12 h1:1/pCztQUOa3BX/1gR3jSZDoaKFpeHFvQ1XrqZpSvZVo= +github.com/linxGnu/grocksdb v1.8.12/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= From 45cc19e25457084fe33a84bbb3cbb2baa807168f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 18 Dec 2023 18:18:11 -0500 Subject: [PATCH 38/99] fix: remove verify-dist-temp --- contrib/make/release.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contrib/make/release.mk b/contrib/make/release.mk index 626a4d5cb..5a290210f 100644 --- a/contrib/make/release.mk +++ b/contrib/make/release.mk @@ -5,6 +5,10 @@ PACKAGE_NAME := github.com/NibiruChain/nibiru GOLANG_CROSS_VERSION ?= v1.19.4 +# The `make release` command is running a Docker container with the image +# `gorelease/goreleaser-cross:${GOLANG_CROSS_VERSION}`. This command: +# `-v "$(CURDIR)":/go/src/$(PACKAGE_NAME)`: mounts the current directory +# `release --clean`: executes the release inside the directory release: docker run \ --rm \ From c739cd00afc6cb0b7de3ea6a027d3816683cd675 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:42:34 -0600 Subject: [PATCH 39/99] ci: use new goreleaser image --- contrib/make/release.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/make/release.mk b/contrib/make/release.mk index 5a290210f..4f1290b8a 100644 --- a/contrib/make/release.mk +++ b/contrib/make/release.mk @@ -3,7 +3,7 @@ ############################################################################### PACKAGE_NAME := github.com/NibiruChain/nibiru -GOLANG_CROSS_VERSION ?= v1.19.4 +GOLANG_CROSS_VERSION ?= v1.21.5 # The `make release` command is running a Docker container with the image # `gorelease/goreleaser-cross:${GOLANG_CROSS_VERSION}`. This command: @@ -18,15 +18,15 @@ release: -e CGO_ENABLED=1 \ -e GITHUB_TOKEN=${GITHUB_TOKEN} \ goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ - release --rm-dist + release --clean release-snapshot: docker run \ --rm \ --platform linux/amd64 \ + -v /tmp:/tmp \ -v "$(CURDIR)":/go/src/$(PACKAGE_NAME) \ -w /go/src/$(PACKAGE_NAME) \ -e CGO_ENABLED=1 \ - -e GITHUB_TOKEN=${GITHUB_TOKEN} \ goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \ - release --rm-dist --snapshot + release --clean --snapshot \ No newline at end of file From 38b26f938d598ffce605b4ba5151a3eef3464d79 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 07:57:16 -0600 Subject: [PATCH 40/99] ci: update make build commands --- contrib/make/build.mk | 87 ++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/contrib/make/build.mk b/contrib/make/build.mk index f49c7659d..57409755c 100644 --- a/contrib/make/build.mk +++ b/contrib/make/build.mk @@ -3,26 +3,29 @@ ### Build Flags ### ############################################################################### +# BRANCH: Current git branch +# COMMIT: Current commit hash BRANCH := $(shell git rev-parse --abbrev-ref HEAD) COMMIT := $(shell git log -1 --format='%H') # don't override user values ifeq (,$(VERSION)) - VERSION := $(shell git describe --exact-match 2>/dev/null) - # if VERSION is empty, then populate it with branch's name and raw commit hash - ifeq (,$(VERSION)) - VERSION := $(BRANCH)-$(COMMIT) - endif + VERSION := $(shell git describe --exact-match 2>/dev/null) + # if VERSION is empty, then populate it with branch's name and raw commit hash + ifeq (,$(VERSION)) + VERSION := $(BRANCH)-$(COMMIT) + endif endif - OS_NAME := $(shell uname -s | tr A-Z a-z) ifeq ($(shell uname -m),x86_64) ARCH_NAME := amd64 else ARCH_NAME := arm64 endif +SUDO := $(shell if [ "$(shell id -u)" != "0" ]; then echo "sudo"; fi) +# SDK_PACK: Cosmos-SDK version SDK_PACK := $(shell go list -m github.com/cosmos/cosmos-sdk | sed 's/ /\@/g') # TM_VERSION: Tendermint Core version (CometBFT) # grab everything after the space in "github.com/tendermint/tendermint v0.34.7" @@ -36,7 +39,12 @@ TEMPDIR ?= $(CURDIR)/temp export GO111MODULE = on # process build tags -build_tags = netgo osusergo rocksdb grocksdb_no_link static_wasm muslc ledger +build_tags = netgo osusergo ledger static rocksdb +ifeq ($(OS_NAME),darwin) + build_tags += static_wasm grocksdb_no_link +else + build_tags += muslc +endif build_tags += $(BUILD_TAGS) build_tags := $(strip $(build_tags)) @@ -61,11 +69,11 @@ ldflags := $(strip $(ldflags)) BUILD_FLAGS := -tags "$(build_tags)" -ldflags '$(ldflags)' CGO_CFLAGS := -I$(TEMPDIR)/include -CGO_LDFLAGS := -L$(TEMPDIR)/lib -lrocksdb -lstdc++ -lm -ldl +CGO_LDFLAGS := -L$(TEMPDIR)/lib ifeq ($(OS_NAME),darwin) - CGO_LDFLAGS += -lz -lbz2 + CGO_LDFLAGS += -lrocksdb -lstdc++ -lz -lbz2 else - CGO_LDFLAGS += -static -lwasmvm_muslc + CGO_LDFLAGS += -static -lm -lbz2 endif ############################################################################### @@ -79,30 +87,51 @@ $(TEMPDIR)/: rocksdblib: $(TEMPDIR)/ @mkdir -p $(TEMPDIR)/include @mkdir -p $(TEMPDIR)/lib - ifeq (",$(wildcard $(TEMPDIR)/include/rocksdb)") - wget https://github.com/NibiruChain/gorocksdb/releases/download/v$(ROCKSDB_VERSION)/include.$(ROCKSDB_VERSION).tar.gz -O - | tar -xz -C $(TEMPDIR)/include/ - endif - ifeq (",$(wildcard $(TEMPDIR)/lib/librocksdb.a)") - wget https://github.com/NibiruChain/gorocksdb/releases/download/v$(ROCKSDB_VERSION)/librocksdb_$(ROCKSDB_VERSION)_$(OS_NAME)_$(ARCH_NAME).tar.gz -O - | tar -xz -C $(TEMPDIR)/lib/ - endif + @if [ ! -d $(TEMPDIR)/include/rocksdb ] ; \ + then \ + wget https://github.com/NibiruChain/gorocksdb/releases/download/v$(ROCKSDB_VERSION)/include.$(ROCKSDB_VERSION).tar.gz -O - | tar -xz -C $(TEMPDIR)/include/; \ + fi + @if [ ! -f $(TEMPDIR)/lib/librocksdb.a ] ; \ + then \ + wget https://github.com/NibiruChain/gorocksdb/releases/download/v$(ROCKSDB_VERSION)/librocksdb_$(ROCKSDB_VERSION)_$(OS_NAME)_$(ARCH_NAME).tar.gz -O - | tar -xz -C $(TEMPDIR)/lib/; \ + fi wasmvmlib: $(TEMPDIR)/ @mkdir -p $(TEMPDIR)/lib - ifeq (",$(wildcard $(TEMPDIR)/lib/libwasmvm*.a)") - ifeq ($(OS_NAME),darwin) - wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvmstatic_darwin.a -O $(TEMPDIR)/lib/libwasmvmstatic_darwin.a - else - ifeq ($(ARCH_NAME),amd64) - wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvm_muslc.x86_64.a -O $(TEMPDIR)/lib/libwasmvm_muslc.a - else - wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvm_muslc.aarch64.a -O $(TEMPDIR)/lib/libwasmvm_muslc.a - endif - endif - endif + @if [ ! -f $(TEMPDIR)/lib/libwasmvm*.a ] ; \ + then \ + if [ "$(OS_NAME)" = "darwin" ] ; \ + then \ + wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvmstatic_darwin.a -O $(TEMPDIR)/lib/libwasmvmstatic_darwin.a; \ + else \ + if [ "$(ARCH_NAME)" = "amd64" ] ; \ + then \ + wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvm_muslc.x86_64.a -O $(TEMPDIR)/lib/libwasmvm_muslc.a; \ + else \ + wget https://github.com/CosmWasm/wasmvm/releases/download/v$(WASMVM_VERSION)/libwasmvm_muslc.aarch64.a -O $(TEMPDIR)/lib/libwasmvm_muslc.a; \ + fi; \ + fi; \ + fi + +packages: + @if [ "$(OS_NAME)" = "linux" ] ; \ + then \ + if [ -f /etc/debian_version ] ; \ + then \ + $(SUDO) apt-get update; \ + dpkg -s liblz4-dev > /dev/null 2>&1 || $(SUDO) apt-get install --no-install-recommends -y liblz4-dev; \ + dpkg -s libsnappy-dev > /dev/null 2>&1 || $(SUDO) apt-get install --no-install-recommends -y libsnappy-dev; \ + dpkg -s zlib1g-dev > /dev/null 2>&1 || $(SUDO) apt-get install --no-install-recommends -y zlib1g-dev; \ + dpkg -s libbz2-dev > /dev/null 2>&1 || $(SUDO) apt-get install --no-install-recommends -y libbz2-dev; \ + dpkg -s libzstd-dev > /dev/null 2>&1 || $(SUDO) apt-get install --no-install-recommends -y libzstd-dev; \ + else \ + echo "Please make sure you have installed the following libraries: lz4, snappy, z, bz2, zstd"; \ + fi; \ + fi # command for make build and make install build: BUILDARGS=-o $(BUILDDIR)/ -build install: go.sum $(BUILDDIR)/ rocksdblib wasmvmlib +build install: go.sum $(BUILDDIR)/ rocksdblib wasmvmlib packages CGO_ENABLED=1 CGO_CFLAGS="$(CGO_CFLAGS)" CGO_LDFLAGS="$(CGO_LDFLAGS)" go $@ -mod=readonly $(BUILD_FLAGS) $(BUILDARGS) ./... # ensure build directory exists @@ -113,4 +142,4 @@ go.sum: go.mod @echo "--> Ensure dependencies have not been modified" @go mod verify -.PHONY: build install +.PHONY: build install \ No newline at end of file From 49eb6654bb5cd1924b78b57ae74a07af7c7934ba Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Fri, 2 Feb 2024 06:29:56 +0100 Subject: [PATCH 41/99] fix(inflation): fix first epoch's inflation distribution (#1786) * fix: fix inflation start bug * fix: fix off by 2 on inflation start * fix: make test more random * chore: changelog * fix: use sdkmath.Int instead of sdk.Int * comments + var names --------- Co-authored-by: Unique-Divine --- CHANGELOG.md | 1 + x/inflation/genesis.go | 2 +- x/inflation/keeper/hooks.go | 8 +- x/inflation/keeper/hooks_test.go | 229 +++++++++++++++++---------- x/inflation/keeper/inflation.go | 4 +- x/inflation/keeper/inflation_test.go | 16 +- x/inflation/keeper/params.go | 14 +- x/inflation/keeper/sudo.go | 4 +- 8 files changed, 171 insertions(+), 107 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b6e5060b..8a08700e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1688](https://github.com/NibiruChain/nibiru/pull/1688) - fix(inflation): make default inflation allocation follow tokenomics * [#1706](https://github.com/NibiruChain/nibiru/pull/706) - fix: `v1.1.0` upgrade handler +* [#1786](https://github.com/NibiruChain/nibiru/pull/1786) - fix(inflation): fix inflation off-by 2 error ### Improvements diff --git a/x/inflation/genesis.go b/x/inflation/genesis.go index e73abea94..b55da1322 100644 --- a/x/inflation/genesis.go +++ b/x/inflation/genesis.go @@ -21,7 +21,7 @@ func InitGenesis( } // Set genesis state - k.UpdateParams(ctx, data.Params) + k.Params.Set(ctx, data.Params) period := data.Period k.CurrentPeriod.Set(ctx, period) diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go index 0299a0cfa..e89a8f2b7 100644 --- a/x/inflation/keeper/hooks.go +++ b/x/inflation/keeper/hooks.go @@ -15,7 +15,9 @@ import ( // BeforeEpochStart: noop, We don't need to do anything here func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} -// AfterEpochEnd mints and allocates coins at the end of each epoch end +// AfterEpochEnd mints and allocates coins at the end of each epoch. +// If inflation is disabled as a module parameter, the state for +// "NumSkippedEpochs" increments. func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { if epochIdentifier != epochstypes.DayEpochID { return @@ -39,7 +41,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb // mint coins, update supply period := k.CurrentPeriod.Peek(ctx) - epochsPerPeriod := k.EpochsPerPeriod(ctx) + epochsPerPeriod := k.GetEpochsPerPeriod(ctx) epochMintProvision := types.CalculateEpochMintProvision( params, @@ -81,7 +83,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb peek := k.NumSkippedEpochs.Peek(ctx) if int64(epochNumber)- int64(epochsPerPeriod*period)- - int64(peek) > int64(epochsPerPeriod) { + int64(peek) >= int64(epochsPerPeriod)-1 { k.CurrentPeriod.Next(ctx) } diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index 10b89d95e..3ffd04926 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -5,20 +5,27 @@ import ( "testing" "time" + sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/stretchr/testify/require" + "github.com/NibiruChain/nibiru/app" "github.com/NibiruChain/nibiru/x/common/denoms" "github.com/NibiruChain/nibiru/x/common/testutil/testapp" epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" "github.com/NibiruChain/nibiru/x/inflation/types" ) +// TestEpochIdentifierAfterEpochEnd: Ensures that the amount in the community +// pool after an epoch ends is greater than the amount before the epoch ends +// with the default module parameters. func TestEpochIdentifierAfterEpochEnd(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.UpdateParams(ctx, params) + nibiruApp.InflationKeeper.Params.Set(ctx, params) feePoolOld := nibiruApp.DistrKeeper.GetFeePool(ctx) nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, 1) @@ -28,9 +35,12 @@ func TestEpochIdentifierAfterEpochEnd(t *testing.T) { feePoolOld.CommunityPool.AmountOf(denoms.NIBI).BigInt().Uint64()) } +// TestPeriodChangesSkippedEpochsAfterEpochEnd: Tests whether current period and +// the number of skipped epochs are accurately updated and that skipped epochs +// are handled correctly. func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - currentEpochPeriod := nibiruApp.InflationKeeper.EpochsPerPeriod(ctx) + epochsPerPeriod := nibiruApp.InflationKeeper.GetEpochsPerPeriod(ctx) testCases := []struct { name string @@ -42,119 +52,119 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { periodChanges bool }{ { - "SkippedEpoch set DayEpochID disabledInflation", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - false, - false, + name: "SkippedEpoch set DayEpochID disabledInflation", + currentPeriod: 0, + height: epochsPerPeriod - 10, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: false, + periodChanges: false, }, { - "SkippedEpoch set WeekEpochID disabledInflation ", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.WeekEpochID, - 0, - false, - false, + name: "SkippedEpoch set WeekEpochID disabledInflation ", + currentPeriod: 0, + height: epochsPerPeriod - 10, // so it's within range + epochIdentifier: epochstypes.WeekEpochID, + skippedEpochs: 0, + InflationEnabled: false, + periodChanges: false, }, { - "[Period 0] disabledInflation", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - false, - false, + name: "[Period 0] disabledInflation", + currentPeriod: 0, + height: epochsPerPeriod - 10, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: false, + periodChanges: false, }, { - "[Period 0] period stays the same under epochs per period", - 0, - currentEpochPeriod - 10, // so it's within range - epochstypes.DayEpochID, - 0, - true, - false, + name: "[Period 0] period stays the same under epochs per period", + currentPeriod: 0, + height: epochsPerPeriod - 10, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: false, }, { name: "[Period 0] period changes once enough epochs have passed", currentPeriod: 0, - height: currentEpochPeriod + 1, + height: epochsPerPeriod + 1, epochIdentifier: epochstypes.DayEpochID, skippedEpochs: 0, InflationEnabled: true, periodChanges: true, }, { - "[Period 1] period stays the same under the epoch per period", - 1, - 2*currentEpochPeriod - 1, - epochstypes.DayEpochID, - 0, - true, - false, + name: "[Period 1] period stays the same under the epoch per period", + currentPeriod: 1, + height: 2*epochsPerPeriod - 2, // period change is at the end of epoch 59 + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: false, }, { - "[Period 1] period changes once enough epochs have passed", - 1, - 2*currentEpochPeriod + 1, - epochstypes.DayEpochID, - 0, - true, - true, + name: "[Period 1] period changes once enough epochs have passed", + currentPeriod: 1, + height: 2*epochsPerPeriod + 1, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: true, }, { - "[Period 0] with skipped epochs - period stays the same under epochs per period", - 0, - currentEpochPeriod - 1, - epochstypes.DayEpochID, - 10, - true, - false, + name: "[Period 0] with skipped epochs - period stays the same under epochs per period", + currentPeriod: 0, + height: epochsPerPeriod - 1, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: false, }, { - "[Period 0] with skipped epochs - period stays the same under epochs per period", - 0, - currentEpochPeriod + 1, - epochstypes.DayEpochID, - 10, - true, - false, + name: "[Period 0] with skipped epochs - period stays the same under epochs per period", + currentPeriod: 0, + height: epochsPerPeriod + 1, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: false, }, { - "[Period 0] with skipped epochs - period changes once enough epochs have passed", - 0, - currentEpochPeriod + 11, - epochstypes.DayEpochID, - 10, - true, - true, + name: "[Period 0] with skipped epochs - period changes once enough epochs have passed", + currentPeriod: 0, + height: epochsPerPeriod + 11, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: true, }, { - "[Period 1] with skipped epochs - period stays the same under epochs per period", - 1, - 2*currentEpochPeriod + 1, - epochstypes.DayEpochID, - 10, - true, - false, + name: "[Period 1] with skipped epochs - period stays the same under epochs per period", + currentPeriod: 1, + height: 2*epochsPerPeriod + 1, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: false, }, { - "[Period 1] with skipped epochs - period changes once enough epochs have passed", - 1, - 2*currentEpochPeriod + 11, - epochstypes.DayEpochID, - 10, - true, - true, + name: "[Period 1] with skipped epochs - period changes once enough epochs have passed", + currentPeriod: 1, + height: 2*epochsPerPeriod + 11, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: true, }, } for _, tc := range testCases { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = tc.InflationEnabled - nibiruApp.InflationKeeper.UpdateParams(ctx, params) + nibiruApp.InflationKeeper.Params.Set(ctx, params) nibiruApp.InflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) nibiruApp.InflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) @@ -185,7 +195,7 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { require.Equal(t, currentSkippedEpochs, skippedEpochs) require.Equal(t, currentPeriod+1, period) } else { - require.Equal(t, currentPeriod, period) + require.Equal(t, currentPeriod, period, "period should not change but it did") if !tc.InflationEnabled { // Check for epochIdentifier for skippedEpoch increment if tc.epochIdentifier == epochstypes.DayEpochID { @@ -196,3 +206,58 @@ func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { }) } } + +func GetBalanceStaking(ctx sdk.Context, nibiruApp *app.NibiruApp) sdkmath.Int { + return nibiruApp.BankKeeper.GetBalance( + ctx, + nibiruApp.AccountKeeper.GetModuleAddress(authtypes.FeeCollectorName), + denoms.NIBI, + ).Amount +} + +func TestManual(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + + params := nibiruApp.InflationKeeper.GetParams(ctx) + epochNumber := uint64(0) + + params.InflationEnabled = false + params.EpochsPerPeriod = 30 + + // y = 30 * x + 30 -> 3 nibi per epoch for period 0, 6 nibi per epoch for period 1 + params.PolynomialFactors = []sdk.Dec{sdk.NewDec(3), sdk.NewDec(3)} + params.InflationDistribution = types.InflationDistribution{ + CommunityPool: sdk.ZeroDec(), + StakingRewards: sdk.OneDec(), + StrategicReserves: sdk.ZeroDec(), + } + + nibiruApp.InflationKeeper.Params.Set(ctx, params) + + require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) + + for i := 0; i < 42069; i++ { + nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + epochNumber++ + } + require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) + + params.InflationEnabled = true + nibiruApp.InflationKeeper.Params.Set(ctx, params) + + for i := 0; i < 30; i++ { + nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + require.Equal(t, sdk.NewInt(100_000).Mul(sdk.NewInt(int64(i+1))), GetBalanceStaking(ctx, nibiruApp)) + epochNumber++ + } + require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) + + // Period 1 - we do 200_000 per periods now + for i := 0; i < 30; i++ { + nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + require.Equal(t, sdk.NewInt(3_000_000).Add(sdk.NewInt(200_000).Mul(sdk.NewInt(int64(i+1)))), GetBalanceStaking(ctx, nibiruApp)) + epochNumber++ + } + require.EqualValues(t, epochNumber, uint64(42069+60)) + require.Equal(t, sdk.NewInt(9_000_000), GetBalanceStaking(ctx, nibiruApp)) +} diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go index 6377db6f8..28dee826b 100644 --- a/x/inflation/keeper/inflation.go +++ b/x/inflation/keeper/inflation.go @@ -136,8 +136,8 @@ func (k Keeper) GetInflationRate(ctx sdk.Context, mintDenom string) sdk.Dec { // EpochMintProvision * 365 / circulatingSupply * 100 circulatingSupplyToDec := sdk.NewDecFromInt(circulatingSupply) return epochMintProvision. - MulInt64(int64(k.EpochsPerPeriod(ctx))). - MulInt64(int64(k.PeriodsPerYear(ctx))). + MulInt64(int64(k.GetEpochsPerPeriod(ctx))). + MulInt64(int64(k.GetPeriodsPerYear(ctx))). Quo(circulatingSupplyToDec). Mul(sdk.NewDec(100)) } diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 0f3d0efb4..497f24244 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -137,7 +137,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { "no epochs per period", sdk.TokensFromConsensusPower(400_000_000, sdk.DefaultPowerReduction), func(nibiruApp *app.NibiruApp, ctx sdk.Context) { - nibiruApp.InflationKeeper.UpdateParams(ctx, types.Params{ + nibiruApp.InflationKeeper.Params.Set(ctx, types.Params{ EpochsPerPeriod: 0, InflationEnabled: true, PolynomialFactors: types.DefaultPolynomialFactors, @@ -152,7 +152,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.UpdateParams(ctx, params) + nibiruApp.InflationKeeper.Params.Set(ctx, params) }, sdk.MustNewDecFromStr("27.095518287362700000"), }, @@ -162,7 +162,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { func(nibiruApp *app.NibiruApp, ctx sdk.Context) { params := nibiruApp.InflationKeeper.GetParams(ctx) params.InflationEnabled = true - nibiruApp.InflationKeeper.UpdateParams(ctx, params) + nibiruApp.InflationKeeper.Params.Set(ctx, params) }, sdk.MustNewDecFromStr("54.191036574725400000"), }, @@ -194,10 +194,10 @@ func TestGetters(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() k := nibiruApp.InflationKeeper require.NotPanics(t, func() { - _ = k.PolynomialFactors(ctx) - _ = k.PeriodsPerYear(ctx) - _ = k.InflationDistribution(ctx) - _ = k.InflationEnabled(ctx) - _ = k.EpochsPerPeriod(ctx) + _ = k.GetPolynomialFactors(ctx) + _ = k.GetPeriodsPerYear(ctx) + _ = k.GetInflationDistribution(ctx) + _ = k.GetInflationEnabled(ctx) + _ = k.GetEpochsPerPeriod(ctx) }) } diff --git a/x/inflation/keeper/params.go b/x/inflation/keeper/params.go index cda15033f..3068045de 100644 --- a/x/inflation/keeper/params.go +++ b/x/inflation/keeper/params.go @@ -6,36 +6,32 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -func (k Keeper) UpdateParams(ctx sdk.Context, params types.Params) { - k.Params.Set(ctx, params) -} - func (k Keeper) GetParams(ctx sdk.Context) types.Params { params, _ := k.Params.Get(ctx) return params } -func (k Keeper) PolynomialFactors(ctx sdk.Context) (res []sdk.Dec) { +func (k Keeper) GetPolynomialFactors(ctx sdk.Context) (res []sdk.Dec) { params, _ := k.Params.Get(ctx) return params.PolynomialFactors } -func (k Keeper) InflationDistribution(ctx sdk.Context) (res types.InflationDistribution) { +func (k Keeper) GetInflationDistribution(ctx sdk.Context) (res types.InflationDistribution) { params, _ := k.Params.Get(ctx) return params.InflationDistribution } -func (k Keeper) InflationEnabled(ctx sdk.Context) (res bool) { +func (k Keeper) GetInflationEnabled(ctx sdk.Context) (res bool) { params, _ := k.Params.Get(ctx) return params.InflationEnabled } -func (k Keeper) EpochsPerPeriod(ctx sdk.Context) (res uint64) { +func (k Keeper) GetEpochsPerPeriod(ctx sdk.Context) (res uint64) { params, _ := k.Params.Get(ctx) return params.EpochsPerPeriod } -func (k Keeper) PeriodsPerYear(ctx sdk.Context) (res uint64) { +func (k Keeper) GetPeriodsPerYear(ctx sdk.Context) (res uint64) { params, _ := k.Params.Get(ctx) return params.PeriodsPerYear } diff --git a/x/inflation/keeper/sudo.go b/x/inflation/keeper/sudo.go index 2877b3be0..95b6f5dd7 100644 --- a/x/inflation/keeper/sudo.go +++ b/x/inflation/keeper/sudo.go @@ -40,7 +40,7 @@ func (k sudoExtension) EditInflationParams( if err != nil { return } - k.UpdateParams(ctx, paramsAfter) + k.Params.Set(ctx, paramsAfter) return paramsAfter.Validate() } @@ -57,7 +57,7 @@ func (k sudoExtension) ToggleInflation( } params.InflationEnabled = enabled - k.UpdateParams(ctx, params) + k.Params.Set(ctx, params) return } From cb0afcd8331d9d3ca258320cb5d286dd5c94f641 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 9 Feb 2024 10:25:33 -0600 Subject: [PATCH 42/99] ci: update goreleaser config file --- .goreleaser.yml | 39 +++++++++++++++++++-------------------- Dockerfile | 4 ++-- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 8b158ed4f..2c18897a1 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -9,14 +9,19 @@ builds: binary: nibid hooks: pre: - - bash contrib/scripts/release_pre_darwin.sh + - cmd: bash contrib/scripts/release_pre_darwin.sh + output: false # enable for debug + env: + - TARGET={{ .Target }} goos: - darwin goarch: - amd64 - arm64 env: - - CC=o64-clang + - CC_darwin_amd64=o64-clang + - CC_darwin_arm64=oa64-clang + - 'CC={{ index .Env (print "CC_" .Os "_" .Arch) }}' flags: - -mod=readonly - -trimpath @@ -34,28 +39,28 @@ builds: - osusergo - ledger - static - - static_wasm - rocksdb + - static_wasm - grocksdb_no_link - overrides: - - goos: darwin - goarch: arm64 - env: - - CC=oa64-clang - id: linux main: ./cmd/nibid binary: nibid hooks: pre: - - bash contrib/scripts/release_pre_linux.sh + - cmd: bash contrib/scripts/release_pre_linux.sh + output: false # enable for debug + env: + - TARGET={{ .Target }} goos: - linux goarch: - amd64 - arm64 env: - - CC=x86_64-linux-gnu-gcc + - CC_linux_amd64=x86_64-linux-gnu-gcc + - CC_linux_arm64=aarch64-linux-gnu-gcc + - 'CC={{ index .Env (print "CC_" .Os "_" .Arch) }}' flags: - -mod=readonly - -trimpath @@ -67,20 +72,14 @@ builds: - -X github.com/cosmos/cosmos-sdk/version.Commit={{ .Commit }} - -X github.com/cosmos/cosmos-sdk/types.DBBackend=rocksdb - -linkmode=external - - -extldflags '-static -lrocksdb -lstdc++ -lm -ldl -lpthread' + - -extldflags '-static -lm -lbz2' tags: - netgo - osusergo - ledger - - muslc - - rocksdb - - grocksdb_no_link - static - overrides: - - goos: linux - goarch: arm64 - env: - - CC=aarch64-linux-gnu-gcc + - rocksdb + - muslc universal_binaries: - - id: darwin + - id: darwin \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 03afeba75..a8ef323b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.19 AS builder +FROM golang:1.21 AS builder WORKDIR /nibiru @@ -24,4 +24,4 @@ RUN apk --no-cache add \ COPY --from=builder /nibiru/build/nibid /usr/local/bin/nibid ENTRYPOINT ["nibid"] -CMD [ "start" ] +CMD [ "start" ] \ No newline at end of file From 1898bc12d2bbe747c703b1a4e16aee316a1826ee Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:25:29 -0600 Subject: [PATCH 43/99] feat: upgrade handler for v1.0.1 --- app/app.go | 1 + app/upgrades.go | 42 ++++++++++++++++++++++++++++++++ app/upgrades/types.go | 15 ++++++++++++ app/upgrades/v1_0_1/constants.go | 23 +++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 app/upgrades.go create mode 100644 app/upgrades/types.go create mode 100644 app/upgrades/v1_0_1/constants.go diff --git a/app/app.go b/app/app.go index 4657d3e51..983bc4972 100644 --- a/app/app.go +++ b/app/app.go @@ -169,6 +169,7 @@ func NewNibiruApp( app.initModuleManager(encodingConfig, skipGenesisInvariants) + app.setupUpgrades() // NOTE: Any module instantiated in the module manager that is later modified // must be passed by reference here. diff --git a/app/upgrades.go b/app/upgrades.go new file mode 100644 index 000000000..5a57a758f --- /dev/null +++ b/app/upgrades.go @@ -0,0 +1,42 @@ +package app + +import ( + "fmt" + + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_1" +) + +var Upgrades = []upgrades.Upgrade{ + v1_0_1.Upgrade, +} + +func (app *NibiruApp) setupUpgrades() { + app.setUpgradeHandlers() + app.setUpgradeStoreLoaders() +} + +func (app *NibiruApp) setUpgradeHandlers() { + for _, u := range Upgrades { + app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.mm, app.configurator)) + } +} + +func (app *NibiruApp) setUpgradeStoreLoaders() { + upgradeInfo, err := app.upgradeKeeper.ReadUpgradeInfoFromDisk() + if err != nil { + panic(fmt.Sprintf("failed to read upgrade info from disk: %s", err.Error())) + } + + if app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + return + } + + for _, u := range Upgrades { + if upgradeInfo.Name == u.UpgradeName { + app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &u.StoreUpgrades)) + } + } +} diff --git a/app/upgrades/types.go b/app/upgrades/types.go new file mode 100644 index 000000000..a2cdde4b5 --- /dev/null +++ b/app/upgrades/types.go @@ -0,0 +1,15 @@ +package upgrades + +import ( + store "github.com/cosmos/cosmos-sdk/store/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +type Upgrade struct { + UpgradeName string + + CreateUpgradeHandler func(*module.Manager, module.Configurator) types.UpgradeHandler + + StoreUpgrades store.StoreUpgrades +} diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_1/constants.go new file mode 100644 index 000000000..79444f0b5 --- /dev/null +++ b/app/upgrades/v1_0_1/constants.go @@ -0,0 +1,23 @@ +package v1_0_1 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.0.1" + +// pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{}, +} From d94f76fc24a257d3fee528dc1079991b5fbfacd0 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 14 Feb 2024 11:14:28 -0500 Subject: [PATCH 44/99] feat(inflation): add inflation tx cmds (#1795) * feat(inflation): add toggle-inflation cli command * feat(inflation): add edit-params command and update validate-basic * chore: update changelog --- CHANGELOG.md | 1 + x/inflation/client/cli/tx.go | 172 +++++++++++++++++++++++++++++++ x/inflation/keeper/msg_server.go | 2 +- x/inflation/module.go | 2 +- x/inflation/types/msgs.go | 29 ++++++ 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 x/inflation/client/cli/tx.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a08700e5..fa08b5bb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1670](https://github.com/NibiruChain/nibiru/pull/1670) - feat(inflation): Make inflation polynomial * [#1682](https://github.com/NibiruChain/nibiru/pull/1682) - feat!: add upgrade handler for v1.1.0 * [#1776](https://github.com/NibiruChain/nibiru/pull/1776) - feat(inflation): make inflation params a collection and add commands to update them +* [#1795](https://github.com/NibiruChain/nibiru/pull/1795) - feat(inflation): add inflation tx cmds ### Bug Fixes diff --git a/x/inflation/client/cli/tx.go b/x/inflation/client/cli/tx.go new file mode 100644 index 000000000..5c3f1253e --- /dev/null +++ b/x/inflation/client/cli/tx.go @@ -0,0 +1,172 @@ +package cli + +import ( + "fmt" + "strings" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/cobra" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// GetTxCmd returns the transaction commands for this module +func GetTxCmd() *cobra.Command { + inflationTxCmd := &cobra.Command{ + Use: types.ModuleName, + Short: "Inflation module subcommands", + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + inflationTxCmd.AddCommand( + CmdToggleInflation(), + CmdEditInflationParams(), + ) + + return inflationTxCmd +} + +func CmdToggleInflation() *cobra.Command { + cmd := &cobra.Command{ + Use: "toggle-inflation [true | false]", + Args: cobra.ExactArgs(1), + Short: "Toggle inflation on or off", + Long: strings.TrimSpace(` +Toggle inflation on or off. + +Requires sudo permissions. + +$ nibid tx inflation toggle-inflation true +`), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := &types.MsgToggleInflation{ + Sender: clientCtx.GetFromAddress().String(), + Enable: args[0] == "true", + } + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +func CmdEditInflationParams() *cobra.Command { + cmd := &cobra.Command{ + Use: "edit-params --staking-proportion [staking-proportion] --community-pool-proportion [community-pool-proportion] --strategic-reserves-proportion [strategic-reserves-proportion] --polynomial-factors [polynomial-factors] --epochs-per-period [epochs-per-period] --periods-per-year [periods-per-year] --max-period [max-period]", + Args: cobra.ExactArgs(0), + Short: "Edit the inflation module parameters", + Long: strings.TrimSpace(` +Edit the inflation module parameters. + +Requires sudo permissions. + +--staking-proportion: the proportion of minted tokens to be distributed to stakers +--community-pool-proportion: the proportion of minted tokens to be distributed to the community pool +--strategic-reserves-proportion: the proportion of minted tokens to be distributed to validators + +--polynomial-factors: the polynomial factors of the inflation distribution curve +--epochs-per-period: the number of epochs per period +--periods-per-year: the number of periods per year +--max-period: the maximum number of periods + +$ nibid tx oracle edit-params --staking-proportion 0.6 --community-pool-proportion 0.2 --strategic-reserves-proportion 0.2 --polynomial-factors 0.1,0.2,0.3,0.4,0.5,0.6 --epochs-per-period 100 --periods-per-year 100 --max-period 100 +`), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := &types.MsgEditInflationParams{ + Sender: clientCtx.GetFromAddress().String(), + } + + var stakingProportionDec sdk.Dec + if stakingProportion, _ := cmd.Flags().GetString("staking-proportion"); stakingProportion != "" { + stakingProportionDec = sdk.MustNewDecFromStr(stakingProportion) + msg.InflationDistribution.StakingRewards = stakingProportionDec + } + + var communityPoolProportionDec sdk.Dec + if communityPoolProportion, _ := cmd.Flags().GetString("community-pool-proportion"); communityPoolProportion != "" { + communityPoolProportionDec = sdk.MustNewDecFromStr(communityPoolProportion) + msg.InflationDistribution.CommunityPool = communityPoolProportionDec + } + + var strategicReservesProportionDec sdk.Dec + if strategicReservesProportion, _ := cmd.Flags().GetString("strategic-reserves-proportion"); strategicReservesProportion != "" { + strategicReservesProportionDec = sdk.MustNewDecFromStr(strategicReservesProportion) + msg.InflationDistribution.StrategicReserves = strategicReservesProportionDec + } + + if !stakingProportionDec.IsNil() && !communityPoolProportionDec.IsNil() && !strategicReservesProportionDec.IsNil() { + msg.InflationDistribution = &types.InflationDistribution{ + StakingRewards: stakingProportionDec, + CommunityPool: communityPoolProportionDec, + StrategicReserves: strategicReservesProportionDec, + } + } + + if polynomialFactors, _ := cmd.Flags().GetString("polynomial-factors"); polynomialFactors != "" { + polynomialFactorsArr := strings.Split(polynomialFactors, ",") + fmt.Println(polynomialFactorsArr) + realPolynomialFactors := make([]sdk.Dec, len(polynomialFactorsArr)) + for i, factor := range polynomialFactorsArr { + factorDec := sdk.MustNewDecFromStr(factor) + realPolynomialFactors[i] = factorDec + } + msg.PolynomialFactors = realPolynomialFactors + } + + if epochsPerPeriod, _ := cmd.Flags().GetUint64("epochs-per-period"); epochsPerPeriod != 0 { + epochsPerPeriodInt := sdk.NewIntFromUint64(epochsPerPeriod) + msg.EpochsPerPeriod = &epochsPerPeriodInt + } + + if periodsPerYear, _ := cmd.Flags().GetUint64("periods-per-year"); periodsPerYear != 0 { + periodsPerYearInt := sdk.NewIntFromUint64(periodsPerYear) + msg.PeriodsPerYear = &periodsPerYearInt + } + + if maxPeriod, _ := cmd.Flags().GetUint64("max-period"); maxPeriod != 0 { + maxPeriodInt := sdk.NewIntFromUint64(maxPeriod) + msg.MaxPeriod = &maxPeriodInt + } + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + cmd.Flags().String("staking-proportion", "", "the proportion of minted tokens to be distributed to stakers") + cmd.Flags().String("community-pool-proportion", "", "the proportion of minted tokens to be distributed to the community pool") + cmd.Flags().String("strategic-reserves-proportion", "", "the proportion of minted tokens to be distributed to validators") + cmd.Flags().String("polynomial-factors", "", "the polynomial factors of the inflation distribution curve") + cmd.Flags().Uint64("epochs-per-period", 0, "the number of epochs per period") + cmd.Flags().Uint64("periods-per-year", 0, "the number of periods per year") + cmd.Flags().Uint64("max-period", 0, "the maximum number of periods") + + return cmd +} diff --git a/x/inflation/keeper/msg_server.go b/x/inflation/keeper/msg_server.go index 7b1b20624..21a67dc38 100644 --- a/x/inflation/keeper/msg_server.go +++ b/x/inflation/keeper/msg_server.go @@ -18,7 +18,7 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { return &msgServer{Keeper: keeper} } -// EditOracleParams: gRPC tx msg for editing the inflation module params. +// EditInflationParams: gRPC tx msg for editing the inflation module params. // [SUDO] Only callable by sudoers. func (ms msgServer) EditInflationParams( goCtx context.Context, msg *types.MsgEditInflationParams, diff --git a/x/inflation/module.go b/x/inflation/module.go index 3fccc5404..ad0944370 100644 --- a/x/inflation/module.go +++ b/x/inflation/module.go @@ -76,7 +76,7 @@ func (b AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *ru } // GetTxCmd returns the root tx command for the inflation module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } +func (AppModuleBasic) GetTxCmd() *cobra.Command { return cli.GetTxCmd() } // GetQueryCmd returns no root query command for the inflation module. func (AppModuleBasic) GetQueryCmd() *cobra.Command { diff --git a/x/inflation/types/msgs.go b/x/inflation/types/msgs.go index fa9c8da82..18496542e 100644 --- a/x/inflation/types/msgs.go +++ b/x/inflation/types/msgs.go @@ -1,6 +1,8 @@ package types import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -41,6 +43,33 @@ func (m MsgEditInflationParams) ValidateBasic() error { if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { return err } + + if m.InflationDistribution != nil { + if m.InflationDistribution.CommunityPool.IsNil() { + return fmt.Errorf("inflation distribution community pool should not be nil") + } + if m.InflationDistribution.StakingRewards.IsNil() { + return fmt.Errorf("inflation distribution staking rewards should not be nil") + } + if m.InflationDistribution.StrategicReserves.IsNil() { + return fmt.Errorf("inflation distribution strategic reserves should not be nil") + } + + sum := sdk.NewDec(0) + sum = sum.Add(m.InflationDistribution.CommunityPool) + sum = sum.Add(m.InflationDistribution.StakingRewards) + sum = sum.Add(m.InflationDistribution.StrategicReserves) + if !sum.Equal(sdk.OneDec()) { + return fmt.Errorf("inflation distribution sum should be 1, got %s", sum) + } + } + + if m.PolynomialFactors != nil { + if len(m.PolynomialFactors) != 6 { + return fmt.Errorf("polynomial factors should have 6 elements, got %d", len(m.PolynomialFactors)) + } + } + return nil } From d3280641e996f370d821431970b84bb6e8162906 Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Wed, 14 Feb 2024 22:24:51 +0100 Subject: [PATCH 45/99] feat: uncomment amino registering on register legacy amino codec for inflation module (#1792) * uncomment amino registering on register legacy amino codec * add changelog entry --------- Co-authored-by: Unique-Divine --- CHANGELOG.md | 1 + x/inflation/keeper/hooks.go | 2 +- x/inflation/module.go | 4 ++-- x/inflation/types/inflation_calculation.go | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa08b5bb4..5fec61a7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution * [#1712](https://github.com/NibiruChain/nibiru/pull/1712) - refactor(inflation): turn inflation off by default +* [#1792](https://github.com/NibiruChain/nibiru/pull/1792) - fix(inflation): uncomment legacy amino register on app module basic ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go index e89a8f2b7..e186ad2e1 100644 --- a/x/inflation/keeper/hooks.go +++ b/x/inflation/keeper/hooks.go @@ -12,7 +12,7 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -// BeforeEpochStart: noop, We don't need to do anything here +// BeforeEpochStart noop, We don't need to do anything here func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} // AfterEpochEnd mints and allocates coins at the end of each epoch. diff --git a/x/inflation/module.go b/x/inflation/module.go index ad0944370..3eac91cfa 100644 --- a/x/inflation/module.go +++ b/x/inflation/module.go @@ -29,7 +29,7 @@ var ( _ module.AppModuleSimulation = AppModule{} ) -// app module Basics object +// AppModuleBasic struct type AppModuleBasic struct{} // Name returns the inflation module's name. @@ -39,7 +39,7 @@ func (AppModuleBasic) Name() string { // RegisterLegacyAminoCodec registers the inflation module's types on the given LegacyAmino codec. func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { - // types.RegisterLegacyAminoCodec(cdc) + types.RegisterLegacyAminoCodec(cdc) } // ConsensusVersion returns the consensus state-breaking version for the module. diff --git a/x/inflation/types/inflation_calculation.go b/x/inflation/types/inflation_calculation.go index e1c6d2c38..15181166c 100644 --- a/x/inflation/types/inflation_calculation.go +++ b/x/inflation/types/inflation_calculation.go @@ -4,7 +4,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -// CalculateEpochProvisions returns mint provision per epoch +// CalculateEpochMintProvision returns mint provision per epoch func CalculateEpochMintProvision( params Params, period uint64, From 7b2be2c852b2750f87fb858639333fceb17ec878 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:54:52 +0100 Subject: [PATCH 46/99] feat: handle case where skip epoch not aligned with epoch passed (#1796) --- CHANGELOG.md | 1 + app/keepers.go | 2 +- contrib/scripts/localnet.sh | 16 ++++++---------- x/inflation/keeper/hooks_test.go | 33 +++++++++++++++++++++++++++++--- x/inflation/keeper/keeper.go | 3 +++ x/inflation/keeper/sudo.go | 13 +++++++++++++ x/inflation/types/interfaces.go | 6 ++++++ 7 files changed, 60 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fec61a7b..aaedffc17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1688](https://github.com/NibiruChain/nibiru/pull/1688) - fix(inflation): make default inflation allocation follow tokenomics * [#1706](https://github.com/NibiruChain/nibiru/pull/706) - fix: `v1.1.0` upgrade handler * [#1786](https://github.com/NibiruChain/nibiru/pull/1786) - fix(inflation): fix inflation off-by 2 error +* [#1796](https://github.com/NibiruChain/nibiru/pull/1796) - fix(inflation): fix num skipped epoch when inflation is added to an existing chain ### Improvements diff --git a/app/keepers.go b/app/keepers.go index 82aadce12..a52214678 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -353,7 +353,7 @@ func (app *NibiruApp) InitKeepers( app.InflationKeeper = inflationkeeper.NewKeeper( appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, app.EpochsKeeper, ) app.EpochsKeeper.SetHooks( diff --git a/contrib/scripts/localnet.sh b/contrib/scripts/localnet.sh index 1fb1f064e..c807c9665 100755 --- a/contrib/scripts/localnet.sh +++ b/contrib/scripts/localnet.sh @@ -36,9 +36,9 @@ echo_success() { # Flag parsing: --flag-name (BASH_VAR_NAME) # -# --no-build ($FLAG_NO_BUILD): toggles whether to build from source. The default -# behavior of the script is to run make install. -FLAG_NO_BUILD=false +# --no-build ($FLAG_NO_BUILD): toggles whether to build from source. The default +# behavior of the script is to run make install. +FLAG_NO_BUILD=false build_from_source() { echo_info "Building from source..." @@ -53,20 +53,17 @@ build_from_source() { echo_info "Parsing flags for the script..." # Iterate over all arguments to the script -for arg in "$@" -do - if [ "$arg" == "--no-build" ] ; then +for arg in "$@"; do + if [ "$arg" == "--no-build" ]; then FLAG_NO_BUILD=true fi done - # Check if FLAG_NO_BUILD was set to true -if ! $FLAG_NO_BUILD ; then +if ! $FLAG_NO_BUILD; then build_from_source fi - # Set localnet settings BINARY="nibid" CHAIN_ID="nibiru-localnet-0" @@ -78,7 +75,6 @@ CHAIN_DIR="$HOME/.nibid" echo "CHAIN_DIR: $CHAIN_DIR" echo "CHAIN_ID: $CHAIN_ID" - SEDOPTION="" if [[ "$OSTYPE" == "darwin"* ]]; then SEDOPTION="''" diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index 3ffd04926..fc56e7037 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -216,6 +216,11 @@ func GetBalanceStaking(ctx sdk.Context, nibiruApp *app.NibiruApp) sdkmath.Int { } func TestManual(t *testing.T) { + // This test is a manual test to check if the inflation is working as expected + // We turn off inflation, then we turn it on and check if the balance is increasing + // We turn it off again and check if the balance is not increasing + // We turn it on again and check if the balance is increasing again with the correct amount + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() params := nibiruApp.InflationKeeper.GetParams(ctx) @@ -242,8 +247,18 @@ func TestManual(t *testing.T) { } require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) - params.InflationEnabled = true - nibiruApp.InflationKeeper.Params.Set(ctx, params) + nibiruApp.EpochsKeeper.Epochs.Insert(ctx, epochstypes.DayEpochID, epochstypes.EpochInfo{ + Identifier: epochstypes.DayEpochID, + StartTime: time.Now(), + Duration: 0, + CurrentEpoch: 42069, + CurrentEpochStartTime: time.Now(), + EpochCountingStarted: false, + CurrentEpochStartHeight: 0, + }, + ) + err := nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) + require.NoError(t, err) for i := 0; i < 30; i++ { nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) @@ -252,12 +267,24 @@ func TestManual(t *testing.T) { } require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) + err = nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, false, testapp.DefaultSudoRoot()) + require.NoError(t, err) + + for i := 0; i < 42069; i++ { + nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + epochNumber++ + } + require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) + + err = nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) + require.NoError(t, err) + // Period 1 - we do 200_000 per periods now for i := 0; i < 30; i++ { nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) require.Equal(t, sdk.NewInt(3_000_000).Add(sdk.NewInt(200_000).Mul(sdk.NewInt(int64(i+1)))), GetBalanceStaking(ctx, nibiruApp)) epochNumber++ } - require.EqualValues(t, epochNumber, uint64(42069+60)) + require.EqualValues(t, epochNumber, uint64(2*42069+60)) require.Equal(t, sdk.NewInt(9_000_000), GetBalanceStaking(ctx, nibiruApp)) } diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index 29dbe5c14..bffe6a258 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -23,6 +23,7 @@ type Keeper struct { distrKeeper types.DistrKeeper stakingKeeper types.StakingKeeper sudoKeeper types.SudoKeeper + epochsKeeper types.EpochsKeeper feeCollectorName string CurrentPeriod collections.Sequence @@ -41,6 +42,7 @@ func NewKeeper( stakingKeeper types.StakingKeeper, sudoKeeper types.SudoKeeper, feeCollectorName string, + epochsKeeper types.EpochsKeeper, ) Keeper { // ensure mint module account is set if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { @@ -56,6 +58,7 @@ func NewKeeper( distrKeeper: distributionKeeper, stakingKeeper: stakingKeeper, sudoKeeper: sudoKeeper, + epochsKeeper: epochsKeeper, feeCollectorName: feeCollectorName, CurrentPeriod: collections.NewSequence(storeKey, 0), NumSkippedEpochs: collections.NewSequence(storeKey, 1), diff --git a/x/inflation/keeper/sudo.go b/x/inflation/keeper/sudo.go index 95b6f5dd7..9f9506ed6 100644 --- a/x/inflation/keeper/sudo.go +++ b/x/inflation/keeper/sudo.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" + epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" ) @@ -57,6 +58,18 @@ func (k sudoExtension) ToggleInflation( } params.InflationEnabled = enabled + if k.NumSkippedEpochs.Peek(ctx) == 0 { + // update skipped epochs since this means that inflation could have + // added to the chain after launch + + epochInfo, err := k.epochsKeeper.GetEpochInfo(ctx, epochstypes.DayEpochID) + if err != nil { + return err + } + + k.NumSkippedEpochs.Set(ctx, epochInfo.CurrentEpoch) + } + k.Params.Set(ctx, params) return } diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index 2233ac4e0..ca4bebd1b 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -4,6 +4,8 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" + + epochsTypes "github.com/NibiruChain/nibiru/x/epochs/types" ) // AccountKeeper defines the contract required for account APIs. @@ -44,3 +46,7 @@ type SudoKeeper interface { GetRootAddr(ctx sdk.Context) (sdk.AccAddress, error) CheckPermissions(contract sdk.AccAddress, ctx sdk.Context) error } + +type EpochsKeeper interface { + GetEpochInfo(ctx sdk.Context, epochIdentifier string) (epochsTypes.EpochInfo, error) +} From 6efa242b338532e9927bf7862de26d6e709d99e4 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Thu, 15 Feb 2024 17:39:59 +0100 Subject: [PATCH 47/99] fix(inflation): num skipped epochs tracking (#1797) * fix: fix bug on inflation * chore: changelog * fix: add bool to see wether inflation ever started * fix: epoch off by one error * chore: unwire epochs keeper from inflation keeper * fix: off by one tests --------- Co-authored-by: Kevin Yang <5478483+k-yang@users.noreply.github.com> --- CHANGELOG.md | 1 + app/keepers.go | 2 +- proto/nibiru/inflation/v1/genesis.proto | 5 + x/inflation/client/cli/tx.go | 2 - x/inflation/keeper/hooks.go | 34 +++- x/inflation/keeper/hooks_test.go | 260 ++++++++++++------------ x/inflation/keeper/keeper.go | 3 - x/inflation/keeper/sudo.go | 13 +- x/inflation/types/events.go | 2 +- x/inflation/types/genesis.pb.go | 103 +++++++--- x/inflation/types/interfaces.go | 6 - x/inflation/types/params.go | 7 + x/inflation/types/params_test.go | 31 +-- 13 files changed, 265 insertions(+), 204 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaedffc17..0ef75a86e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1706](https://github.com/NibiruChain/nibiru/pull/706) - fix: `v1.1.0` upgrade handler * [#1786](https://github.com/NibiruChain/nibiru/pull/1786) - fix(inflation): fix inflation off-by 2 error * [#1796](https://github.com/NibiruChain/nibiru/pull/1796) - fix(inflation): fix num skipped epoch when inflation is added to an existing chain +* [#1797](https://github.com/NibiruChain/nibiru/pull/1797) - fix(inflation): fix num skipped epoch updates logic ### Improvements diff --git a/app/keepers.go b/app/keepers.go index a52214678..82aadce12 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -353,7 +353,7 @@ func (app *NibiruApp) InitKeepers( app.InflationKeeper = inflationkeeper.NewKeeper( appCodec, keys[inflationtypes.StoreKey], app.GetSubspace(inflationtypes.ModuleName), - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, app.EpochsKeeper, + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.SudoKeeper, authtypes.FeeCollectorName, ) app.EpochsKeeper.SetHooks( diff --git a/proto/nibiru/inflation/v1/genesis.proto b/proto/nibiru/inflation/v1/genesis.proto index e72fff223..773bfaef5 100644 --- a/proto/nibiru/inflation/v1/genesis.proto +++ b/proto/nibiru/inflation/v1/genesis.proto @@ -42,4 +42,9 @@ message Params { // max_period is the maximum number of periods that have inflation being // paid off. After this period, inflation will be disabled. uint64 max_period = 6; + + // has_inflation_started is the parameter that indicates if inflation has + // started. It's set to false at the starts, and stays at true when we toggle + // inflation on. It's used to track num skipped epochs + bool has_inflation_started = 7; } diff --git a/x/inflation/client/cli/tx.go b/x/inflation/client/cli/tx.go index 5c3f1253e..a66b46db0 100644 --- a/x/inflation/client/cli/tx.go +++ b/x/inflation/client/cli/tx.go @@ -1,7 +1,6 @@ package cli import ( - "fmt" "strings" "github.com/cosmos/cosmos-sdk/client" @@ -126,7 +125,6 @@ $ nibid tx oracle edit-params --staking-proportion 0.6 --community-pool-proporti if polynomialFactors, _ := cmd.Flags().GetString("polynomial-factors"); polynomialFactors != "" { polynomialFactorsArr := strings.Split(polynomialFactors, ",") - fmt.Println(polynomialFactorsArr) realPolynomialFactors := make([]sdk.Dec, len(polynomialFactorsArr)) for i, factor := range polynomialFactorsArr { factorDec := sdk.MustNewDecFromStr(factor) diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go index e186ad2e1..420ec0b5f 100644 --- a/x/inflation/keeper/hooks.go +++ b/x/inflation/keeper/hooks.go @@ -27,14 +27,22 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb // Skip inflation if it is disabled and increment number of skipped epochs if !params.InflationEnabled { - prevSkippedEpochs := k.NumSkippedEpochs.Next(ctx) + var prevSkippedEpochs uint64 + if !params.HasInflationStarted { + // If the inflation never started, we use epochNumber as the number of skipped epochs + // to avoid missing periods when we upgrade a chain. + k.NumSkippedEpochs.Set(ctx, epochNumber) + prevSkippedEpochs = epochNumber + } else { + prevSkippedEpochs = k.NumSkippedEpochs.Next(ctx) + } k.Logger(ctx).Debug( "skipping inflation mint and allocation", "height", ctx.BlockHeight(), "epoch-id", epochIdentifier, "epoch-number", epochNumber, - "skipped-epochs", prevSkippedEpochs+1, + "skipped-epochs", prevSkippedEpochs, ) return } @@ -76,15 +84,19 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb // where inflation minted tokens. // // Examples: - // Given, epochNumber = 1, period = 0, epochPerPeriod = 365, skippedEpochs = 0 - // => 1 - 365 * 0 - 0 < 365 --- nothing to do here - // Given, epochNumber = 741, period = 1, epochPerPeriod = 365, skippedEpochs = 10 - // => 741 - 1 * 365 - 10 > 365 --- a period has passed! we set a new period - peek := k.NumSkippedEpochs.Peek(ctx) + // Given, epochNumber = 1, period = 0, epochPerPeriod = 30, skippedEpochs = 0 + // => 1 - 30 * 0 - 0 < 30 --- nothing to do here + // Given, epochNumber = 70, period = 1, epochPerPeriod = 30, skippedEpochs = 10 + // => 70 - 1 * 30 - 10 >= 30 --- a period has ended! we set a new period + // Given, epochNumber = 42099, period = 0, epochPerPeriod = 30, skippedEpochs = 42069 + // => 42099 - 0 * 30 - 42069 >= 30 --- a period has ended! we set a new period + numSkippedEpochs := k.NumSkippedEpochs.Peek(ctx) if int64(epochNumber)- int64(epochsPerPeriod*period)- - int64(peek) >= int64(epochsPerPeriod)-1 { - k.CurrentPeriod.Next(ctx) + int64(numSkippedEpochs) >= int64(epochsPerPeriod) { + prevPeriod := k.CurrentPeriod.Next(ctx) + + k.Logger(ctx).Info(fmt.Sprintf("setting new period: %d", prevPeriod+1)) } defer func() { @@ -124,8 +136,8 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb ctx.EventManager().EmitEvent( sdk.NewEvent( - types.EventTypeMint, - sdk.NewAttribute(types.AttributeEpochNumber, fmt.Sprintf("%d", epochNumber)), + types.EventTypeInflation, + sdk.NewAttribute(types.AttributeEpochNumber, fmt.Sprintf("%d", epochNumber-numSkippedEpochs)), sdk.NewAttribute(types.AttributeKeyEpochProvisions, epochMintProvision.String()), sdk.NewAttribute(sdk.AttributeKeyAmount, mintedCoin.Amount.String()), ), diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index fc56e7037..c6f5b431f 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -40,167 +40,159 @@ func TestEpochIdentifierAfterEpochEnd(t *testing.T) { // are handled correctly. func TestPeriodChangesSkippedEpochsAfterEpochEnd(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - epochsPerPeriod := nibiruApp.InflationKeeper.GetEpochsPerPeriod(ctx) + inflationKeeper := nibiruApp.InflationKeeper testCases := []struct { - name string - currentPeriod uint64 - height uint64 - epochIdentifier string - skippedEpochs uint64 - InflationEnabled bool - periodChanges bool + name string + currentPeriod uint64 + currentEpochNumber uint64 + epochIdentifier string + skippedEpochs uint64 + InflationEnabled bool + periodChanges bool }{ { - name: "SkippedEpoch set DayEpochID disabledInflation", - currentPeriod: 0, - height: epochsPerPeriod - 10, // so it's within range - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: false, - periodChanges: false, + name: "SkippedEpoch set DayEpochID disabledInflation", + currentPeriod: 0, + currentEpochNumber: 20, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 19, + InflationEnabled: false, + periodChanges: false, }, { - name: "SkippedEpoch set WeekEpochID disabledInflation ", - currentPeriod: 0, - height: epochsPerPeriod - 10, // so it's within range - epochIdentifier: epochstypes.WeekEpochID, - skippedEpochs: 0, - InflationEnabled: false, - periodChanges: false, + name: "SkippedEpoch set WeekEpochID disabledInflation ", + currentPeriod: 0, + currentEpochNumber: 20, // so it's within range + epochIdentifier: epochstypes.WeekEpochID, + skippedEpochs: 19, + InflationEnabled: false, + periodChanges: false, }, { - name: "[Period 0] disabledInflation", - currentPeriod: 0, - height: epochsPerPeriod - 10, // so it's within range - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: false, - periodChanges: false, + name: "[Period 0] disabledInflation", + currentPeriod: 0, + currentEpochNumber: 20, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 19, + InflationEnabled: false, + periodChanges: false, }, { - name: "[Period 0] period stays the same under epochs per period", - currentPeriod: 0, - height: epochsPerPeriod - 10, // so it's within range - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: true, - periodChanges: false, + name: "[Period 0] period stays the same under epochs per period", + currentPeriod: 0, + currentEpochNumber: 29, // so it's within range + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: false, }, { - name: "[Period 0] period changes once enough epochs have passed", - currentPeriod: 0, - height: epochsPerPeriod + 1, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: true, - periodChanges: true, + name: "[Period 0] period changes once enough epochs have passed", + currentPeriod: 0, + currentEpochNumber: 30, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: true, }, { - name: "[Period 1] period stays the same under the epoch per period", - currentPeriod: 1, - height: 2*epochsPerPeriod - 2, // period change is at the end of epoch 59 - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: true, - periodChanges: false, + name: "[Period 1] period stays the same under the epoch per period", + currentPeriod: 1, + currentEpochNumber: 59, // period change is at the end of epoch 59 + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: false, }, { - name: "[Period 1] period changes once enough epochs have passed", - currentPeriod: 1, - height: 2*epochsPerPeriod + 1, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 0, - InflationEnabled: true, - periodChanges: true, + name: "[Period 1] period changes once enough epochs have passed", + currentPeriod: 1, + currentEpochNumber: 60, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 0, + InflationEnabled: true, + periodChanges: true, }, { - name: "[Period 0] with skipped epochs - period stays the same under epochs per period", - currentPeriod: 0, - height: epochsPerPeriod - 1, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 10, - InflationEnabled: true, - periodChanges: false, + name: "[Period 0] with skipped epochs - period stays the same under epochs per period", + currentPeriod: 0, + currentEpochNumber: 30, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 1, + InflationEnabled: true, + periodChanges: false, }, { - name: "[Period 0] with skipped epochs - period stays the same under epochs per period", - currentPeriod: 0, - height: epochsPerPeriod + 1, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 10, - InflationEnabled: true, - periodChanges: false, + name: "[Period 0] with skipped epochs - period changes once enough epochs have passed", + currentPeriod: 0, + currentEpochNumber: 40, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: true, }, { - name: "[Period 0] with skipped epochs - period changes once enough epochs have passed", - currentPeriod: 0, - height: epochsPerPeriod + 11, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 10, - InflationEnabled: true, - periodChanges: true, + name: "[Period 1] with skipped epochs - period stays the same under epochs per period", + currentPeriod: 1, + currentEpochNumber: 69, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: false, }, { - name: "[Period 1] with skipped epochs - period stays the same under epochs per period", - currentPeriod: 1, - height: 2*epochsPerPeriod + 1, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 10, - InflationEnabled: true, - periodChanges: false, - }, - { - name: "[Period 1] with skipped epochs - period changes once enough epochs have passed", - currentPeriod: 1, - height: 2*epochsPerPeriod + 11, - epochIdentifier: epochstypes.DayEpochID, - skippedEpochs: 10, - InflationEnabled: true, - periodChanges: true, + name: "[Period 1] with skipped epochs - period changes once enough epochs have passed", + currentPeriod: 1, + currentEpochNumber: 70, + epochIdentifier: epochstypes.DayEpochID, + skippedEpochs: 10, + InflationEnabled: true, + periodChanges: true, }, } for _, tc := range testCases { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - params := nibiruApp.InflationKeeper.GetParams(ctx) + params := inflationKeeper.GetParams(ctx) params.InflationEnabled = tc.InflationEnabled - nibiruApp.InflationKeeper.Params.Set(ctx, params) + params.HasInflationStarted = tc.InflationEnabled + inflationKeeper.Params.Set(ctx, params) - nibiruApp.InflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) - nibiruApp.InflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) + inflationKeeper.NumSkippedEpochs.Set(ctx, tc.skippedEpochs) + inflationKeeper.CurrentPeriod.Set(ctx, tc.currentPeriod) - currentSkippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) - currentPeriod := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) - originalProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) + // original values + prevSkippedEpochs := inflationKeeper.NumSkippedEpochs.Peek(ctx) + prevPeriod := inflationKeeper.CurrentPeriod.Peek(ctx) + originalProvision := inflationKeeper.GetEpochMintProvision(ctx) // Perform Epoch Hooks futureCtx := ctx.WithBlockTime(time.Now().Add(time.Minute)) - nibiruApp.EpochsKeeper.BeforeEpochStart(futureCtx, tc.epochIdentifier, tc.height) - nibiruApp.EpochsKeeper.AfterEpochEnd(futureCtx, tc.epochIdentifier, tc.height) + nibiruApp.EpochsKeeper.BeforeEpochStart(futureCtx, tc.epochIdentifier, tc.currentEpochNumber) + nibiruApp.EpochsKeeper.AfterEpochEnd(futureCtx, tc.epochIdentifier, tc.currentEpochNumber) - skippedEpochs := nibiruApp.InflationKeeper.NumSkippedEpochs.Peek(ctx) - period := nibiruApp.InflationKeeper.CurrentPeriod.Peek(ctx) + // new values + newSkippedEpochs := inflationKeeper.NumSkippedEpochs.Peek(ctx) + newPeriod := inflationKeeper.CurrentPeriod.Peek(ctx) if tc.periodChanges { - newProvision := nibiruApp.InflationKeeper.GetEpochMintProvision(ctx) + newProvision := inflationKeeper.GetEpochMintProvision(ctx) expectedProvision := types.CalculateEpochMintProvision( - nibiruApp.InflationKeeper.GetParams(ctx), - period, + inflationKeeper.GetParams(ctx), + newPeriod, ) require.Equal(t, expectedProvision, newProvision) // mint provisions will change require.NotEqual(t, newProvision, originalProvision) - require.Equal(t, currentSkippedEpochs, skippedEpochs) - require.Equal(t, currentPeriod+1, period) + require.Equal(t, prevSkippedEpochs, newSkippedEpochs) + require.Equal(t, prevPeriod+1, newPeriod) } else { - require.Equal(t, currentPeriod, period, "period should not change but it did") - if !tc.InflationEnabled { + require.Equal(t, prevPeriod, newPeriod, "period should not change but it did") + if !tc.InflationEnabled && tc.epochIdentifier == epochstypes.DayEpochID { // Check for epochIdentifier for skippedEpoch increment - if tc.epochIdentifier == epochstypes.DayEpochID { - require.Equal(t, currentSkippedEpochs+1, skippedEpochs) - } + require.EqualValues(t, prevSkippedEpochs+1, newSkippedEpochs) } } }) @@ -222,14 +214,16 @@ func TestManual(t *testing.T) { // We turn it on again and check if the balance is increasing again with the correct amount nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + inflationKeeper := nibiruApp.InflationKeeper - params := nibiruApp.InflationKeeper.GetParams(ctx) - epochNumber := uint64(0) + params := inflationKeeper.GetParams(ctx) + epochNumber := uint64(1) params.InflationEnabled = false + params.HasInflationStarted = false params.EpochsPerPeriod = 30 - // y = 30 * x + 30 -> 3 nibi per epoch for period 0, 6 nibi per epoch for period 1 + // y = 3 * x + 3 -> 3 nibi per epoch for period 0, 6 nibi per epoch for period 1 params.PolynomialFactors = []sdk.Dec{sdk.NewDec(3), sdk.NewDec(3)} params.InflationDistribution = types.InflationDistribution{ CommunityPool: sdk.ZeroDec(), @@ -237,15 +231,17 @@ func TestManual(t *testing.T) { StrategicReserves: sdk.ZeroDec(), } - nibiruApp.InflationKeeper.Params.Set(ctx, params) + inflationKeeper.Params.Set(ctx, params) require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) for i := 0; i < 42069; i++ { - nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) epochNumber++ } require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) + require.EqualValues(t, uint64(0), inflationKeeper.CurrentPeriod.Peek(ctx)) + require.EqualValues(t, uint64(42069), inflationKeeper.NumSkippedEpochs.Peek(ctx)) nibiruApp.EpochsKeeper.Epochs.Insert(ctx, epochstypes.DayEpochID, epochstypes.EpochInfo{ Identifier: epochstypes.DayEpochID, @@ -257,34 +253,42 @@ func TestManual(t *testing.T) { CurrentEpochStartHeight: 0, }, ) - err := nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) + err := inflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) require.NoError(t, err) + // Period 0 - inflate 3M NIBI over 30 epochs or 100k uNIBI per epoch for i := 0; i < 30; i++ { - nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) require.Equal(t, sdk.NewInt(100_000).Mul(sdk.NewInt(int64(i+1))), GetBalanceStaking(ctx, nibiruApp)) epochNumber++ } require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) + require.EqualValues(t, uint64(1), inflationKeeper.CurrentPeriod.Peek(ctx)) + require.EqualValues(t, uint64(42069), inflationKeeper.NumSkippedEpochs.Peek(ctx)) - err = nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, false, testapp.DefaultSudoRoot()) + err = inflationKeeper.Sudo().ToggleInflation(ctx, false, testapp.DefaultSudoRoot()) require.NoError(t, err) for i := 0; i < 42069; i++ { - nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) epochNumber++ } require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) + require.EqualValues(t, uint64(1), inflationKeeper.CurrentPeriod.Peek(ctx)) + require.EqualValues(t, uint64(84138), inflationKeeper.NumSkippedEpochs.Peek(ctx)) - err = nibiruApp.InflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) + err = inflationKeeper.Sudo().ToggleInflation(ctx, true, testapp.DefaultSudoRoot()) require.NoError(t, err) - // Period 1 - we do 200_000 per periods now + // Period 1 - inflate 6M NIBI over 30 epochs or 200k uNIBI per epoch for i := 0; i < 30; i++ { - nibiruApp.InflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) require.Equal(t, sdk.NewInt(3_000_000).Add(sdk.NewInt(200_000).Mul(sdk.NewInt(int64(i+1)))), GetBalanceStaking(ctx, nibiruApp)) epochNumber++ } - require.EqualValues(t, epochNumber, uint64(2*42069+60)) require.Equal(t, sdk.NewInt(9_000_000), GetBalanceStaking(ctx, nibiruApp)) + require.EqualValues(t, uint64(2), inflationKeeper.CurrentPeriod.Peek(ctx)) + require.EqualValues(t, uint64(84138), inflationKeeper.NumSkippedEpochs.Peek(ctx)) + + require.EqualValues(t, uint64(1+2*42069+60), epochNumber) } diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index bffe6a258..29dbe5c14 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -23,7 +23,6 @@ type Keeper struct { distrKeeper types.DistrKeeper stakingKeeper types.StakingKeeper sudoKeeper types.SudoKeeper - epochsKeeper types.EpochsKeeper feeCollectorName string CurrentPeriod collections.Sequence @@ -42,7 +41,6 @@ func NewKeeper( stakingKeeper types.StakingKeeper, sudoKeeper types.SudoKeeper, feeCollectorName string, - epochsKeeper types.EpochsKeeper, ) Keeper { // ensure mint module account is set if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { @@ -58,7 +56,6 @@ func NewKeeper( distrKeeper: distributionKeeper, stakingKeeper: stakingKeeper, sudoKeeper: sudoKeeper, - epochsKeeper: epochsKeeper, feeCollectorName: feeCollectorName, CurrentPeriod: collections.NewSequence(storeKey, 0), NumSkippedEpochs: collections.NewSequence(storeKey, 1), diff --git a/x/inflation/keeper/sudo.go b/x/inflation/keeper/sudo.go index 9f9506ed6..91f882b31 100644 --- a/x/inflation/keeper/sudo.go +++ b/x/inflation/keeper/sudo.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" - epochstypes "github.com/NibiruChain/nibiru/x/epochs/types" inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" ) @@ -58,16 +57,8 @@ func (k sudoExtension) ToggleInflation( } params.InflationEnabled = enabled - if k.NumSkippedEpochs.Peek(ctx) == 0 { - // update skipped epochs since this means that inflation could have - // added to the chain after launch - - epochInfo, err := k.epochsKeeper.GetEpochInfo(ctx, epochstypes.DayEpochID) - if err != nil { - return err - } - - k.NumSkippedEpochs.Set(ctx, epochInfo.CurrentEpoch) + if enabled && !params.HasInflationStarted { + params.HasInflationStarted = true } k.Params.Set(ctx, params) diff --git a/x/inflation/types/events.go b/x/inflation/types/events.go index 5f6374c54..3a6febaa7 100644 --- a/x/inflation/types/events.go +++ b/x/inflation/types/events.go @@ -2,7 +2,7 @@ package types // Minting module event types const ( - EventTypeMint = ModuleName + EventTypeInflation = ModuleName AttributeKeyEpochProvisions = "epoch_provisions" AttributeEpochNumber = "epoch_number" diff --git a/x/inflation/types/genesis.pb.go b/x/inflation/types/genesis.pb.go index 61e7d72ce..522028269 100644 --- a/x/inflation/types/genesis.pb.go +++ b/x/inflation/types/genesis.pb.go @@ -107,6 +107,10 @@ type Params struct { // max_period is the maximum number of periods that have inflation being // paid off. After this period, inflation will be disabled. MaxPeriod uint64 `protobuf:"varint,6,opt,name=max_period,json=maxPeriod,proto3" json:"max_period,omitempty"` + // has_inflation_started is the parameter that indicates if inflation has + // started. It's set to false at the starts, and stays at true when we toggle + // inflation on. It's used to track num skipped epochs + HasInflationStarted bool `protobuf:"varint,7,opt,name=has_inflation_started,json=hasInflationStarted,proto3" json:"has_inflation_started,omitempty"` } func (m *Params) Reset() { *m = Params{} } @@ -177,6 +181,13 @@ func (m *Params) GetMaxPeriod() uint64 { return 0 } +func (m *Params) GetHasInflationStarted() bool { + if m != nil { + return m.HasInflationStarted + } + return false +} + func init() { proto.RegisterType((*GenesisState)(nil), "nibiru.inflation.v1.GenesisState") proto.RegisterType((*Params)(nil), "nibiru.inflation.v1.Params") @@ -185,35 +196,36 @@ func init() { func init() { proto.RegisterFile("nibiru/inflation/v1/genesis.proto", fileDescriptor_2d00e2bb98c08f74) } var fileDescriptor_2d00e2bb98c08f74 = []byte{ - // 438 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0x6e, 0xd4, 0x30, - 0x10, 0xc6, 0x37, 0xdb, 0x25, 0xa2, 0x2e, 0x94, 0xae, 0x81, 0x2a, 0x2a, 0x22, 0x5d, 0x8a, 0x40, - 0x51, 0x11, 0xb6, 0x5a, 0x4e, 0x5c, 0x97, 0x16, 0xd4, 0x0b, 0x8a, 0xc2, 0x09, 0x24, 0x14, 0x39, - 0x89, 0x9b, 0xb5, 0x9a, 0xc4, 0x96, 0xed, 0xad, 0x76, 0xdf, 0x80, 0x23, 0x8f, 0xd5, 0x63, 0x8f, - 0x88, 0x43, 0x85, 0x76, 0xdf, 0x80, 0x27, 0xa8, 0xd6, 0xf6, 0xfe, 0x39, 0xe4, 0x94, 0xcc, 0xcc, - 0x6f, 0xbe, 0x19, 0x7f, 0x1a, 0xf0, 0xaa, 0x61, 0x19, 0x93, 0x63, 0xcc, 0x9a, 0xcb, 0x8a, 0x68, - 0xc6, 0x1b, 0x7c, 0x7d, 0x82, 0x4b, 0xda, 0x50, 0xc5, 0x14, 0x12, 0x92, 0x6b, 0x0e, 0x9f, 0x5a, - 0x04, 0xad, 0x10, 0x74, 0x7d, 0x72, 0xf0, 0xac, 0xe4, 0x25, 0x37, 0x75, 0xbc, 0xf8, 0xb3, 0xe8, - 0xc1, 0xeb, 0x36, 0xb5, 0x75, 0x9f, 0x81, 0x8e, 0x7e, 0x79, 0xe0, 0xd1, 0x17, 0x3b, 0xe1, 0x9b, - 0x26, 0x9a, 0xc2, 0x8f, 0xc0, 0x17, 0x44, 0x92, 0x5a, 0x05, 0xde, 0xc0, 0x8b, 0x76, 0x4e, 0x5f, - 0xa0, 0x96, 0x89, 0x28, 0x36, 0xc8, 0xb0, 0x77, 0x73, 0x77, 0xd8, 0x49, 0x5c, 0x03, 0xdc, 0x07, - 0xbe, 0xa0, 0x92, 0xf1, 0x22, 0xe8, 0x0e, 0xbc, 0xa8, 0x97, 0xb8, 0x08, 0xbe, 0x01, 0xbb, 0xea, - 0x8a, 0x09, 0x41, 0x8b, 0x94, 0x0a, 0x9e, 0x8f, 0x54, 0xb0, 0x65, 0xea, 0x8f, 0x5d, 0xf6, 0xdc, - 0x24, 0x8f, 0xfe, 0x77, 0x81, 0x6f, 0x75, 0xe1, 0x3b, 0xd0, 0x5f, 0x8d, 0x4b, 0x69, 0x43, 0xb2, - 0x8a, 0x16, 0x66, 0x9f, 0x87, 0xc9, 0xde, 0xaa, 0x70, 0x6e, 0xf3, 0xf0, 0x27, 0x80, 0x82, 0x57, - 0xd3, 0x86, 0xd7, 0x8c, 0x54, 0xe9, 0x25, 0xc9, 0x35, 0x97, 0x2a, 0xe8, 0x0e, 0xb6, 0xa2, 0xed, - 0x21, 0x5a, 0x2c, 0xf8, 0xf7, 0xee, 0xf0, 0x6d, 0xc9, 0xf4, 0x68, 0x9c, 0xa1, 0x9c, 0xd7, 0x38, - 0xe7, 0xaa, 0xe6, 0xca, 0x7d, 0xde, 0xab, 0xe2, 0x0a, 0xeb, 0xa9, 0xa0, 0x0a, 0x9d, 0xd1, 0x3c, - 0xe9, 0xaf, 0x95, 0x3e, 0x5b, 0x21, 0x58, 0x82, 0xfd, 0xf5, 0x2e, 0x05, 0x53, 0x5a, 0xb2, 0x6c, - 0xbc, 0x08, 0xcc, 0x2b, 0x76, 0x4e, 0x8f, 0x5b, 0x0d, 0xba, 0x58, 0x06, 0x67, 0x1b, 0x1d, 0xce, - 0xaf, 0xe7, 0xac, 0xad, 0x08, 0x8f, 0x41, 0xdf, 0xda, 0x93, 0x0a, 0x2a, 0x53, 0xe7, 0x64, 0xcf, - 0x38, 0xf5, 0xc4, 0x16, 0x62, 0x2a, 0x63, 0x6b, 0x69, 0x04, 0xf6, 0x2c, 0x60, 0xe1, 0x29, 0x25, - 0x32, 0x78, 0x60, 0xd0, 0x5d, 0x97, 0x8f, 0xa9, 0xfc, 0x4e, 0x89, 0x84, 0x2f, 0x01, 0xa8, 0xc9, - 0x64, 0x29, 0xe7, 0x1b, 0x66, 0xbb, 0x26, 0x13, 0x2b, 0x34, 0xbc, 0xb8, 0x99, 0x85, 0xde, 0xed, - 0x2c, 0xf4, 0xfe, 0xcd, 0x42, 0xef, 0xf7, 0x3c, 0xec, 0xdc, 0xce, 0xc3, 0xce, 0x9f, 0x79, 0xd8, - 0xf9, 0x81, 0x37, 0x2c, 0xfb, 0x6a, 0x5e, 0xf8, 0x69, 0x44, 0x58, 0x83, 0xdd, 0x55, 0x4d, 0x36, - 0xee, 0xca, 0xf8, 0x97, 0xf9, 0xe6, 0xa2, 0x3e, 0xdc, 0x07, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x56, - 0x6e, 0x63, 0xc6, 0x02, 0x00, 0x00, + // 461 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xc1, 0x6e, 0x13, 0x31, + 0x10, 0xcd, 0x36, 0x61, 0xa1, 0x2e, 0x94, 0xc6, 0xa5, 0xd5, 0xaa, 0x88, 0x6d, 0x28, 0x02, 0x45, + 0x45, 0xac, 0xd5, 0x70, 0xe2, 0x1a, 0x5a, 0x50, 0x2f, 0x28, 0x4a, 0x4f, 0x20, 0xa1, 0x95, 0x77, + 0x77, 0xba, 0x6b, 0x35, 0xbb, 0xb6, 0x6c, 0xa7, 0x4a, 0xfe, 0x80, 0x23, 0x5f, 0xc1, 0xb7, 0xf4, + 0xd8, 0x23, 0xe2, 0x50, 0xa1, 0xe4, 0x47, 0xaa, 0xd8, 0x6e, 0x92, 0xc3, 0x9e, 0xec, 0x99, 0xf7, + 0xe6, 0xcd, 0xcc, 0xd3, 0xa0, 0xd7, 0x15, 0x4b, 0x98, 0x1c, 0x13, 0x56, 0x5d, 0x8e, 0xa8, 0x66, + 0xbc, 0x22, 0xd7, 0x27, 0x24, 0x87, 0x0a, 0x14, 0x53, 0x91, 0x90, 0x5c, 0x73, 0xbc, 0x6b, 0x29, + 0xd1, 0x92, 0x12, 0x5d, 0x9f, 0x1c, 0xbc, 0xc8, 0x79, 0xce, 0x0d, 0x4e, 0x16, 0x3f, 0x4b, 0x3d, + 0x78, 0x53, 0xa7, 0xb6, 0xaa, 0x33, 0xa4, 0xa3, 0x5f, 0x1e, 0x7a, 0xfa, 0xd5, 0x76, 0xb8, 0xd0, + 0x54, 0x03, 0xfe, 0x84, 0x7c, 0x41, 0x25, 0x2d, 0x55, 0xe0, 0x75, 0xbc, 0xee, 0x56, 0xef, 0x65, + 0x54, 0xd3, 0x31, 0x1a, 0x18, 0x4a, 0xbf, 0x75, 0x73, 0x77, 0xd8, 0x18, 0xba, 0x02, 0xbc, 0x8f, + 0x7c, 0x01, 0x92, 0xf1, 0x2c, 0xd8, 0xe8, 0x78, 0xdd, 0xd6, 0xd0, 0x45, 0xf8, 0x2d, 0xda, 0x56, + 0x57, 0x4c, 0x08, 0xc8, 0x62, 0x10, 0x3c, 0x2d, 0x54, 0xd0, 0x34, 0xf8, 0x33, 0x97, 0x3d, 0x33, + 0xc9, 0xa3, 0x3f, 0x4d, 0xe4, 0x5b, 0x5d, 0xfc, 0x1e, 0xb5, 0x97, 0xed, 0x62, 0xa8, 0x68, 0x32, + 0x82, 0xcc, 0xcc, 0xf3, 0x64, 0xb8, 0xb3, 0x04, 0xce, 0x6c, 0x1e, 0xff, 0x44, 0x58, 0xf0, 0xd1, + 0xb4, 0xe2, 0x25, 0xa3, 0xa3, 0xf8, 0x92, 0xa6, 0x9a, 0x4b, 0x15, 0x6c, 0x74, 0x9a, 0xdd, 0xcd, + 0x7e, 0xb4, 0x18, 0xf0, 0xdf, 0xdd, 0xe1, 0xbb, 0x9c, 0xe9, 0x62, 0x9c, 0x44, 0x29, 0x2f, 0x49, + 0xca, 0x55, 0xc9, 0x95, 0x7b, 0x3e, 0xa8, 0xec, 0x8a, 0xe8, 0xa9, 0x00, 0x15, 0x9d, 0x42, 0x3a, + 0x6c, 0xaf, 0x94, 0xbe, 0x58, 0x21, 0x9c, 0xa3, 0xfd, 0xd5, 0x2c, 0x19, 0x53, 0x5a, 0xb2, 0x64, + 0xbc, 0x08, 0xcc, 0x16, 0x5b, 0xbd, 0xe3, 0x5a, 0x83, 0xce, 0x1f, 0x82, 0xd3, 0xb5, 0x0a, 0xe7, + 0xd7, 0x1e, 0xab, 0x03, 0xf1, 0x31, 0x6a, 0x5b, 0x7b, 0x62, 0x01, 0x32, 0x76, 0x4e, 0xb6, 0x8c, + 0x53, 0xcf, 0x2d, 0x30, 0x00, 0x39, 0xb0, 0x96, 0x76, 0xd1, 0x8e, 0x25, 0x58, 0xf2, 0x14, 0xa8, + 0x0c, 0x1e, 0x19, 0xea, 0xb6, 0xcb, 0x0f, 0x40, 0x7e, 0x07, 0x2a, 0xf1, 0x2b, 0x84, 0x4a, 0x3a, + 0x79, 0x90, 0xf3, 0x0d, 0x67, 0xb3, 0xa4, 0x13, 0x27, 0xd4, 0x43, 0x7b, 0x05, 0x55, 0xf1, 0x6a, + 0x43, 0xa5, 0xa9, 0xd4, 0x90, 0x05, 0x8f, 0x8d, 0xdb, 0xbb, 0x05, 0x55, 0xcb, 0x55, 0x2e, 0x2c, + 0xd4, 0x3f, 0xbf, 0x99, 0x85, 0xde, 0xed, 0x2c, 0xf4, 0xfe, 0xcf, 0x42, 0xef, 0xf7, 0x3c, 0x6c, + 0xdc, 0xce, 0xc3, 0xc6, 0xdf, 0x79, 0xd8, 0xf8, 0x41, 0xd6, 0x6c, 0xfe, 0x66, 0x5c, 0xf9, 0x5c, + 0x50, 0x56, 0x11, 0x77, 0x89, 0x93, 0xb5, 0x5b, 0x34, 0x9e, 0x27, 0xbe, 0xb9, 0xc2, 0x8f, 0xf7, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xc8, 0x43, 0x3a, 0xc4, 0xfa, 0x02, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -279,6 +291,16 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.HasInflationStarted { + i-- + if m.HasInflationStarted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x38 + } if m.MaxPeriod != 0 { i = encodeVarintGenesis(dAtA, i, uint64(m.MaxPeriod)) i-- @@ -385,6 +407,9 @@ func (m *Params) Size() (n int) { if m.MaxPeriod != 0 { n += 1 + sovGenesis(uint64(m.MaxPeriod)) } + if m.HasInflationStarted { + n += 2 + } return n } @@ -690,6 +715,26 @@ func (m *Params) Unmarshal(dAtA []byte) error { break } } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HasInflationStarted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.HasInflationStarted = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index ca4bebd1b..2233ac4e0 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -4,8 +4,6 @@ import ( sdkmath "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/types" - - epochsTypes "github.com/NibiruChain/nibiru/x/epochs/types" ) // AccountKeeper defines the contract required for account APIs. @@ -46,7 +44,3 @@ type SudoKeeper interface { GetRootAddr(ctx sdk.Context) (sdk.AccAddress, error) CheckPermissions(contract sdk.AccAddress, ctx sdk.Context) error } - -type EpochsKeeper interface { - GetEpochInfo(ctx sdk.Context, epochIdentifier string) (epochsTypes.EpochInfo, error) -} diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go index 63b879546..1302c2411 100644 --- a/x/inflation/types/params.go +++ b/x/inflation/types/params.go @@ -9,6 +9,7 @@ import ( var ( KeyInflationEnabled = []byte("InflationEnabled") + KeyHasInflationStarted = []byte("HasInflationStarted") KeyPolynomialFactors = []byte("PolynomialFactors") KeyInflationDistribution = []byte("InflationDistribution") KeyEpochsPerPeriod = []byte("EpochsPerPeriod") @@ -40,6 +41,7 @@ func NewParams( polynomialCalculation []sdk.Dec, inflationDistribution InflationDistribution, inflationEnabled bool, + hasInflationStarted bool, epochsPerPeriod, periodsPerYear, maxPeriod uint64, @@ -48,6 +50,7 @@ func NewParams( PolynomialFactors: polynomialCalculation, InflationDistribution: inflationDistribution, InflationEnabled: inflationEnabled, + HasInflationStarted: hasInflationStarted, EpochsPerPeriod: epochsPerPeriod, PeriodsPerYear: periodsPerYear, MaxPeriod: maxPeriod, @@ -60,6 +63,7 @@ func DefaultParams() Params { PolynomialFactors: DefaultPolynomialFactors, InflationDistribution: DefaultInflationDistribution, InflationEnabled: DefaultInflation, + HasInflationStarted: DefaultInflation, EpochsPerPeriod: DefaultEpochsPerPeriod, PeriodsPerYear: DefaultPeriodsPerYear, MaxPeriod: DefaultMaxPeriod, @@ -163,6 +167,9 @@ func (p Params) Validate() error { if err := validateUint64(p.MaxPeriod); err != nil { return err } + if err := validateBool(p.HasInflationStarted); err != nil { + return err + } return validateBool(p.InflationEnabled) } diff --git a/x/inflation/types/params_test.go b/x/inflation/types/params_test.go index e51ecf1bd..4f668b087 100644 --- a/x/inflation/types/params_test.go +++ b/x/inflation/types/params_test.go @@ -26,6 +26,7 @@ func TestParamsValidate(t *testing.T) { inflationtypes.DefaultPolynomialFactors, inflationtypes.DefaultInflationDistribution, true, + true, inflationtypes.DefaultEpochsPerPeriod, inflationtypes.DefaultPeriodsPerYear, inflationtypes.DefaultMaxPeriod, @@ -38,6 +39,7 @@ func TestParamsValidate(t *testing.T) { PolynomialFactors: inflationtypes.DefaultPolynomialFactors, InflationDistribution: inflationtypes.DefaultInflationDistribution, InflationEnabled: true, + HasInflationStarted: true, EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, @@ -49,6 +51,7 @@ func TestParamsValidate(t *testing.T) { PolynomialFactors: []sdk.Dec{}, InflationDistribution: inflationtypes.DefaultInflationDistribution, InflationEnabled: true, + HasInflationStarted: true, EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, @@ -63,9 +66,10 @@ func TestParamsValidate(t *testing.T) { CommunityPool: sdk.NewDecWithPrec(133333, 6), StrategicReserves: sdk.NewDecWithPrec(333333, 6), }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + InflationEnabled: true, + HasInflationStarted: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, true, }, @@ -78,9 +82,10 @@ func TestParamsValidate(t *testing.T) { CommunityPool: sdk.NewDecWithPrec(133333, 6), StrategicReserves: sdk.OneDec().Neg(), }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + InflationEnabled: true, + HasInflationStarted: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, true, }, @@ -93,9 +98,10 @@ func TestParamsValidate(t *testing.T) { CommunityPool: sdk.OneDec().Neg(), StrategicReserves: sdk.NewDecWithPrec(333333, 6), }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + InflationEnabled: true, + HasInflationStarted: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, true, }, @@ -108,9 +114,10 @@ func TestParamsValidate(t *testing.T) { CommunityPool: sdk.NewDecWithPrec(133333, 6), StrategicReserves: sdk.NewDecWithPrec(333333, 6), }, - InflationEnabled: true, - EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, - PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, + InflationEnabled: true, + HasInflationStarted: true, + EpochsPerPeriod: inflationtypes.DefaultEpochsPerPeriod, + PeriodsPerYear: inflationtypes.DefaultPeriodsPerYear, }, true, }, From 2eb7182e8f0e2ac78ab001724f6bed59faff544f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sat, 24 Feb 2024 10:40:28 -0600 Subject: [PATCH 48/99] chore: bump cosmos-sdk to v0.47.9 (#1808) * chore: bump cosmos-sdk to v0.47.9 * chore: update changelog --- CHANGELOG.md | 2 +- go.mod | 68 ++++++++++++------------ go.sum | 142 ++++++++++++++++++++++++++++----------------------- 3 files changed, 115 insertions(+), 97 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06527d8ff..32e967267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,7 +80,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies * Bump `github.com/prometheus/client_golang` from 1.16.0 to 1.17.0 ([#1605](https://github.com/NibiruChain/nibiru/pull/1605)) - * Bump `bufbuild/buf-setup-action` from 1.26.1 to 1.27.1 ([#1624](https://github.com/NibiruChain/nibiru/pull/1624), [#1641](https://github.com/NibiruChain/nibiru/pull/1641)) * Bump `stefanzweifel/git-auto-commit-action` from 4 to 5 ([#1625](https://github.com/NibiruChain/nibiru/pull/1625)) * Bump `github.com/CosmWasm/wasmvm` from 1.4.0 to 1.5.0 ([#1629](https://github.com/NibiruChain/nibiru/pull/1629), [#1657](https://github.com/NibiruChain/nibiru/pull/1657)) @@ -89,6 +88,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) * Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) * Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) +* [#1808](https://github.com/NibiruChain/nibiru/pull/1808) - Bump `cosmos-sdk` to v0.47.9 ### Bug Fixes diff --git a/go.mod b/go.mod index 61320a298..800e9d8a8 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,16 @@ module github.com/NibiruChain/nibiru go 1.21 require ( - cosmossdk.io/errors v1.0.0 - cosmossdk.io/math v1.1.2 + cosmossdk.io/errors v1.0.1 + cosmossdk.io/math v1.2.0 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.4.0 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 - github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.5 + github.com/cosmos/cosmos-proto v1.0.0-beta.4 + github.com/cosmos/cosmos-sdk v0.47.9 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -30,22 +30,22 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 + google.golang.org/grpc v1.60.1 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.110.7 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/log v1.3.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -83,7 +83,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -91,18 +91,20 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -122,7 +124,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.3 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect @@ -131,7 +133,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -149,7 +151,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.30.0 // indirect + github.com/rs/zerolog v1.32.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -163,23 +165,25 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.15.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/api v0.149.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect - pgregory.net/rapid v0.5.5 // indirect + pgregory.net/rapid v1.1.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 10a6b12d0..b6544fa34 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -197,12 +197,12 @@ cosmossdk.io/core v0.6.1 h1:OBy7TI2W+/gyn2z40vVvruK3di+cAluinA6cybFbE7s= cosmossdk.io/core v0.6.1/go.mod h1:g3MMBCBXtxbDWBURDVnJE7XML4BG5qENhs0gzkcpuFA= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= -cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= +cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= +cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= +cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -401,10 +401,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= -github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= +github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= +github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= +github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -477,8 +477,8 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= +github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -546,6 +546,11 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -645,8 +650,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -677,20 +683,20 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -700,8 +706,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -842,8 +848,8 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= @@ -893,7 +899,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -903,8 +908,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1085,8 +1091,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1225,6 +1231,14 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1259,10 +1273,9 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1374,8 +1387,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1401,8 +1414,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1417,8 +1430,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1502,7 +1515,6 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1527,14 +1539,15 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1683,8 +1696,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1692,8 +1705,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1805,12 +1819,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1852,8 +1866,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1870,8 +1884,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1909,8 +1923,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1922,8 +1936,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 142419347e65a96af7534144025f24e87dcb00e2 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sat, 24 Feb 2024 12:00:02 -0700 Subject: [PATCH 49/99] chore: add v1.0.2 upgrade handler --- app/upgrades.go | 4 ++-- app/upgrades/{v1_0_1 => v1_0_2}/constants.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) rename app/upgrades/{v1_0_1 => v1_0_2}/constants.go (87%) diff --git a/app/upgrades.go b/app/upgrades.go index 5a57a758f..4bf9b7c20 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -6,11 +6,11 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/NibiruChain/nibiru/app/upgrades" - "github.com/NibiruChain/nibiru/app/upgrades/v1_0_1" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_2" ) var Upgrades = []upgrades.Upgrade{ - v1_0_1.Upgrade, + v1_0_2.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_2/constants.go similarity index 87% rename from app/upgrades/v1_0_1/constants.go rename to app/upgrades/v1_0_2/constants.go index 79444f0b5..417e241ef 100644 --- a/app/upgrades/v1_0_1/constants.go +++ b/app/upgrades/v1_0_2/constants.go @@ -1,4 +1,4 @@ -package v1_0_1 +package v1_0_2 import ( "github.com/cosmos/cosmos-sdk/store/types" @@ -9,9 +9,9 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades" ) -const UpgradeName = "v1.0.1" +const UpgradeName = "v1.0.2" -// pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb +// pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb + cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { From 16dbe32c84b91e136b7ab30cc00ab17e6c526de8 Mon Sep 17 00:00:00 2001 From: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> Date: Sun, 18 Feb 2024 02:00:32 -0600 Subject: [PATCH 50/99] =?UTF-8?q?fix(inflation-docs):=20=E2=91=A0=20Docume?= =?UTF-8?q?nt=20inflation=20+=20=E2=91=A1=20delete=20unused=20code=20+=20?= =?UTF-8?q?=E2=91=A2=20fix=20CI=20(#1799)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor,docs(inflation): Document everything + delete unused code * changelog * feat(localnet): make perp and spot modules optional features * fix(e2e-wasm.yml-ci): Use consistent command runner * wip! move nibid to path after downlaoding release * wip! fix syntax error in localnet.sh * wip!: what version is running? * wip! try: simplify and use fresh build * wip! fix param space * wip!: fix source path in chaosnet and localnet * wip!: fix source path in chaosnet and localnet * wip!: fix source path in chaosnet and localnet * fix(localent.sh): missing prices in oralce genesis * wait a bit since localnet is fixed now * fix(deploy-wasm): using wrong binary name * ci: Runs well but needs a better name --- .github/workflows/e2e-wasm.yml | 20 ++- CHANGELOG.md | 3 +- contrib/make/localnet.mk | 3 +- contrib/scripts/chaosnet.sh | 35 +--- contrib/scripts/e2e/deploy-wasm.sh | 7 +- contrib/scripts/feat-perp.sh | 62 +++++++ contrib/scripts/localnet.sh | 167 +++++++++--------- justfile | 80 +++++++++ x/devgas/v1/keeper/keeper.go | 6 + x/epochs/keeper/hooks_test.go | 1 - x/epochs/types/hooks.go | 19 +- x/inflation/doc.go | 11 ++ x/inflation/keeper/grpc_query.go | 4 +- x/inflation/keeper/hooks.go | 89 +++++----- x/inflation/keeper/hooks_test.go | 8 +- x/inflation/keeper/inflation.go | 46 +++-- x/inflation/keeper/keeper.go | 44 +++-- x/inflation/keeper/msg_server.go | 2 + x/inflation/keeper/sudo.go | 21 ++- .../types/inflation_calculation_test.go | 10 +- 20 files changed, 419 insertions(+), 219 deletions(-) create mode 100644 contrib/scripts/feat-perp.sh create mode 100644 justfile create mode 100644 x/inflation/doc.go diff --git a/.github/workflows/e2e-wasm.yml b/.github/workflows/e2e-wasm.yml index 867259ebb..ac37a71b3 100644 --- a/.github/workflows/e2e-wasm.yml +++ b/.github/workflows/e2e-wasm.yml @@ -1,17 +1,17 @@ --- -name: CosmWasm e2e contract tests +name: CosmWasm e2e tests on: # On normal PRs or when workflow goreleaser finishes, as it gets the last release tag. pull_request: -# Allow concurrent runs on main/release branches but isolates other branches +# Allow concurrent runs on main/release branches but isolates other branches concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref }} cancel-in-progress: ${{ ! (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release/')) }} jobs: - get-release: + e2e-wasm: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: uses: robinraju/release-downloader@v1.8 with: # uses latest (including drafts) - # tag: ${{ steps.latest_release.outputs.release }} + # tag: ${{ steps.latest_release.outputs.release }} # uses latest (excluding drafts) as tagged by GitHub latest: true fileName: "*linux_amd64.tar.gz" @@ -38,10 +38,18 @@ jobs: tar -xzf *linux_amd64.tar.gz rm nibid*.gz mv nibid* nibid || true + mv nibid /usr/local/bin/ + echo "nibid version: $(nibid version)" - - name: launch localnet + - name: "Install just" + # casey/just: https://just.systems/man/en/chapter_6.html + # taiki-e/install-action: https://github.com/taiki-e/install-action + uses: taiki-e/install-action@just + + - name: "launch localnet" run: | - sh ./contrib/scripts/e2e/localnet.sh + just localnet --no-build & + sleep 6 - name: run e2e tests run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ef75a86e..f152365f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2023-12-15 +## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) * [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0)] * [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.1.0)] @@ -65,6 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1695](https://github.com/NibiruChain/nibiru/pull/1695) - feat(inflation): add events for inflation distribution * [#1712](https://github.com/NibiruChain/nibiru/pull/1712) - refactor(inflation): turn inflation off by default * [#1792](https://github.com/NibiruChain/nibiru/pull/1792) - fix(inflation): uncomment legacy amino register on app module basic +* [#1799](https://github.com/NibiruChain/nibiru/pull/1799) refactor,docs(inflation): Document everything + delete unused code. Make perp and spot optional features in localnet.sh ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) diff --git a/contrib/make/localnet.mk b/contrib/make/localnet.mk index b0d2eeb72..1983d59e5 100644 --- a/contrib/make/localnet.mk +++ b/contrib/make/localnet.mk @@ -5,5 +5,4 @@ # Simple localnet script for testing .PHONY: localnet localnet: - ./contrib/scripts/localnet.sh - + ./contrib/scripts/localnet.sh $(FLAGS) diff --git a/contrib/scripts/chaosnet.sh b/contrib/scripts/chaosnet.sh index 3fa420651..82ae889b6 100755 --- a/contrib/scripts/chaosnet.sh +++ b/contrib/scripts/chaosnet.sh @@ -47,38 +47,9 @@ add_genesis_param() { mv $HOME/.nibid/config/tmp_genesis.json $HOME/.nibid/config/genesis.json } - -add_genesis_perp_markets_with_coingecko_prices() { - local temp_json_fname="tmp_market_prices.json" - curl -X 'GET' \ - 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum&vs_currencies=usd' \ - -H 'accept: application/json' \ - >$temp_json_fname - - local M=1000000 - - local num_users=300000 - local faucet_nusd_amt=100 - local reserve_amt=$(($num_users * $faucet_nusd_amt * $M)) - - price_btc=$(cat tmp_market_prices.json | jq -r '.bitcoin.usd') - price_btc=${price_btc%.*} - if [ -z "$price_btc" ]; then - return 1 - fi - - nibid genesis add-genesis-perp-market --pair=ubtc:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_btc - - price_eth=$(cat tmp_market_prices.json | jq -r '.ethereum.usd') - price_eth=${price_eth%.*} - if [ -z "$price_eth" ]; then - return 1 - fi - - nibid genesis add-genesis-perp-market --pair=ueth:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_eth -} - -add_genesis_perp_markets_with_coingecko_prices +curr_dir="$(dirname "$0")" +source "$curr_dir/feat-perp.sh" +add_genesis_perp_markets_offline # x/oracle add_genesis_param '.app_state.oracle.params.twap_lookback_window = "900s"' diff --git a/contrib/scripts/e2e/deploy-wasm.sh b/contrib/scripts/e2e/deploy-wasm.sh index ff67710fd..3e02119a7 100644 --- a/contrib/scripts/e2e/deploy-wasm.sh +++ b/contrib/scripts/e2e/deploy-wasm.sh @@ -1,4 +1,7 @@ -BINARY="./nibid" +#!/bin/bash +set -e + +BINARY="nibid" DENOM="unibi" CHAIN_ID="nibiru-localnet-0" TXFLAG="--gas-prices 0.1$DENOM --gas auto --gas-adjustment 1.3 -y -b block --chain-id $CHAIN_ID" @@ -39,4 +42,4 @@ echo "Owner: $DOMAIN_OWNER" if [ $DOMAIN_OWNER != $VALIDATOR_ADDR ]; then echo "Domain owner is not the validator address" exit 1 -fi \ No newline at end of file +fi diff --git a/contrib/scripts/feat-perp.sh b/contrib/scripts/feat-perp.sh new file mode 100644 index 000000000..01a237186 --- /dev/null +++ b/contrib/scripts/feat-perp.sh @@ -0,0 +1,62 @@ +#!/bin/bash +set -e + +# add_genesis_reserve_amt: Used to configure initial reserve values of genesis +# perp markets. +add_genesis_reserve_amt() { + local M=1000000 + local num_users=300000 + local faucet_nusd_amt=100 + local reserve_amt=$(($num_users * $faucet_nusd_amt * $M)) + echo "$reserve_amt" +} + +# add_genesis_perp_markets_with_coingecko_prices: Queries Coingecko to set the +# initial values to for x/perp markets in the genesis. +add_genesis_perp_markets_with_coingecko_prices() { + local temp_json_fname="tmp_market_prices.json" + curl -X 'GET' \ + 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum&vs_currencies=usd' \ + -H 'accept: application/json' \ + >$temp_json_fname + + local reserve_amt=$(add_genesis_reserve_amt) + + price_btc=$(cat tmp_market_prices.json | jq -r '.bitcoin.usd') + price_btc=${price_btc%.*} + if [ -z "$price_btc" ]; then + return 1 + fi + + check_fail() { + if [ $? -eq 0 ]; then + echo "Command \"$*\" executed successfully." + else + echo "Command \"$*\" failed." + exit 1 + fi + } + + check_fail nibid genesis add-genesis-perp-market --pair="ubtc:unusd" --sqrt-depth="$reserve_amt" --price-multiplier="$price_btc" --oracle-pair="ubtc:uusd" + + price_eth=$(cat tmp_market_prices.json | jq -r '.ethereum.usd') + price_eth=${price_eth%.*} + if [ -z "$price_eth" ]; then + return 1 + fi + + check_fail nibid genesis add-genesis-perp-market --pair="ueth:unusd" --sqrt-depth=$reserve_amt --price-multiplier="$price_eth" --oracle-pair="ueth:uusd" + + echo 'tmp_market_prices: ' + cat $temp_json_fname | jq . + rm -f $temp_json_fname +} + +add_genesis_perp_markets_offline() { + local reserve_amt + reserve_amt=$(add_genesis_reserve_amt) + price_btc="20000" + price_eth="2000" + nibid genesis add-genesis-perp-market --pair="ubtc:unusd" --sqrt-depth="$reserve_amt" --price-multiplier="$price_btc" --oracle-pair="ubtc:uusd" + nibid genesis add-genesis-perp-market --pair="ueth:unusd" --sqrt-depth="$reserve_amt" --price-multiplier="$price_eth" --oracle-pair="ueth:uusd" +} diff --git a/contrib/scripts/localnet.sh b/contrib/scripts/localnet.sh index c807c9665..7e805f8a4 100755 --- a/contrib/scripts/localnet.sh +++ b/contrib/scripts/localnet.sh @@ -1,6 +1,20 @@ -#!/bin/sh +#!/bin/bash set -e +# Set localnet settings +BINARY="nibid" +CHAIN_ID="nibiru-localnet-0" +MNEMONIC="guard cream sadness conduct invite crumble clock pudding hole grit liar hotel maid produce squeeze return argue turtle know drive eight casino maze host" +GENESIS_COINS="10000000000000unibi,10000000000000unusd,10000000000000uusdt,10000000000000uusdc" +CHAIN_DIR="$HOME/.nibid" + +echo "CHAIN_DIR: $CHAIN_DIR" +echo "CHAIN_ID: $CHAIN_ID" + +# ------------------------------------------------------------ +# Set up colored text logging +# ------------------------------------------------------------ + # Console log text colour console_log_text_color() { red=$(tput setaf 9) @@ -34,12 +48,22 @@ echo_success() { echo "${reset}" } -# Flag parsing: --flag-name (BASH_VAR_NAME) -# -# --no-build ($FLAG_NO_BUILD): toggles whether to build from source. The default -# behavior of the script is to run make install. +# ------------------------------------------------------------ +# Flag parsing +# ------------------------------------------------------------ + +echo_info "Parsing flags for the script..." + +# $FLAG_NO_BUILD: toggles whether to build from source. The default +# behavior of the script is to run make install if the flag --no-build is not present. FLAG_NO_BUILD=false +# $FLAG_PERP: Feature flag for x/perp. Enabled with `--features perp`. +FLAG_PERP=false + +# $FLAG_SPOT: Feature flag for x/spot. Enabled with `--features spot`. +FLAG_SPOT=false + build_from_source() { echo_info "Building from source..." if make install; then @@ -50,13 +74,34 @@ build_from_source() { fi } -echo_info "Parsing flags for the script..." +# Initialize an associative array for feature flags with default values +declare -A features=( ["perp"]=0 ["spot"]=0 ) -# Iterate over all arguments to the script -for arg in "$@"; do - if [ "$arg" == "--no-build" ]; then - FLAG_NO_BUILD=true - fi +# enable_feature_flag: Enables feature flags variables if present +enable_feature_flag() { + case $1 in + perp) FLAG_PERP=true ;; + spot) FLAG_SPOT=true ;; + *) echo_error "Unknown feature: $1" ;; + esac +} + +# Iterate over flags, handling the cases: "--no-build" and "--features" +while [[ $# -gt 0 ]]; do + case $1 in + --no-build) + FLAG_NO_BUILD=true + shift + ;; + --features) + shift # Remove '--features' from arguments + while [[ $# -gt 0 && $1 != --* ]]; do + enable_feature_flag "$1" + shift # Remove the feature name from arguments + done + ;; + *) shift ;; # Unknown arg + esac done # Check if FLAG_NO_BUILD was set to true @@ -64,16 +109,10 @@ if ! $FLAG_NO_BUILD; then build_from_source fi -# Set localnet settings -BINARY="nibid" -CHAIN_ID="nibiru-localnet-0" -RPC_PORT="26657" -GRPC_PORT="9090" -MNEMONIC="guard cream sadness conduct invite crumble clock pudding hole grit liar hotel maid produce squeeze return argue turtle know drive eight casino maze host" -GENESIS_COINS="10000000000000unibi,10000000000000unusd,10000000000000uusdt,10000000000000uusdc" -CHAIN_DIR="$HOME/.nibid" -echo "CHAIN_DIR: $CHAIN_DIR" -echo "CHAIN_ID: $CHAIN_ID" +echo_info "Features flags:" +echo "FLAG_NO_BUILD: $FLAG_NO_BUILD" +echo "FLAG_PERP: $FLAG_PERP" +echo "FLAG_SPOT: $FLAG_SPOT" SEDOPTION="" if [[ "$OSTYPE" == "darwin"* ]]; then @@ -92,10 +131,10 @@ fi # Remove previous data echo_info "Removing previous chain data from $CHAIN_DIR..." -rm -rf $CHAIN_DIR +rm -rf "$CHAIN_DIR" # Add directory for chain, exit if error -if ! mkdir -p $CHAIN_DIR 2>/dev/null; then +if ! mkdir -p "$CHAIN_DIR" 2>/dev/null; then echo_error "Failed to create chain folder. Aborting..." exit 1 fi @@ -208,79 +247,33 @@ add_genesis_param() { mv $CHAIN_DIR/config/tmp_genesis.json $CHAIN_DIR/config/genesis.json } -add_genesis_reserve_amt() { - local M=1000000 - local num_users=300000 - local faucet_nusd_amt=100 - local reserve_amt=$(($num_users * $faucet_nusd_amt * $M)) - echo "$reserve_amt" -} - -add_genesis_perp_markets_with_coingecko_prices() { - local temp_json_fname="tmp_market_prices.json" - curl -X 'GET' \ - 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum&vs_currencies=usd' \ - -H 'accept: application/json' \ - >$temp_json_fname - - local reserve_amt=$(add_genesis_reserve_amt) +echo_info "Configuring genesis params" - price_btc=$(cat tmp_market_prices.json | jq -r '.bitcoin.usd') - price_btc=${price_btc%.*} - if [ -z "$price_btc" ]; then - return 1 - fi +if $FLAG_PERP; then + local curr_dir="$(dirname "$0")" + source "$curr_dir/feat-perp.sh" - check_fail() { - if [ $? -eq 0 ]; then - echo_success "Command \"$*\" executed successfully." - else - echo_error "Command \"$*\" failed." - exit 1 - fi - } - -# nibid genesis add-genesis-perp-market --pair=ubtc:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_btc -# check_fail nibid genesis add-genesis-perp-market - - price_eth=$(cat tmp_market_prices.json | jq -r '.ethereum.usd') - price_eth=${price_eth%.*} - if [ -z "$price_eth" ]; then - return 1 + if add_genesis_perp_markets_with_coingecko_prices; then + echo_success "set perp markets with coingecko prices" + elif add_genesis_perp_markets_offline; then + echo_success "set perp markets with offline defaults" + else + echo_error "failed to set genesis perp markets" + exit 1 fi - -# nibid genesis add-genesis-perp-market --pair=ueth:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_eth -# check_fail nibid genesis add-genesis-perp-market - - echo 'tmp_market_prices: ' - cat $temp_json_fname | jq . - rm -f $temp_json_fname -} - -add_genesis_perp_markets_offline() { - local reserve_amt=$(add_genesis_reserve_amt) - price_btc="20000" - price_eth="2000" - nibid genesis add-genesis-perp-market --pair=ubtc:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_btc - nibid genesis add-genesis-perp-market --pair=ueth:unusd --sqrt-depth=$reserve_amt --price-multiplier=$price_eth -} - -echo_info "Configuring genesis params" - -if add_genesis_perp_markets_with_coingecko_prices; then - echo_success "set perp markets with coingecko prices" -elif add_genesis_perp_markets_offline; then - echo_success "set perp markets with offline defaults" -else - echo_error "failed to set genesis perp markets" - exit 1 fi +# if $FLAG_SPOT; then +# # Perform any actions specific to the x/spot feature +# fi + # set validator as sudoer add_genesis_param '.app_state.sudo.sudoers.root = "'"$val_address"'"' # hack for localnet since we don't have a pricefeeder yet -add_genesis_param '.app_state.oracle.exchange_rates[0].pair = "ubtc:unusd"' +price_btc="50000" +price_eth="2000" +add_genesis_param '.app_state.oracle.exchange_rates[0].pair = "ubtc:uuusd"' add_genesis_param '.app_state.oracle.exchange_rates[0].exchange_rate = "'"$price_btc"'"' add_genesis_param '.app_state.oracle.exchange_rates[1].pair = "ueth:unusd"' add_genesis_param '.app_state.oracle.exchange_rates[1].exchange_rate = "'"$price_eth"'"' diff --git a/justfile b/justfile new file mode 100644 index 000000000..f48140d06 --- /dev/null +++ b/justfile @@ -0,0 +1,80 @@ +# Displays available recipes by running `just -l`. +setup: + #!/usr/bin/env bash + just -l + +# Locally install the `nibid` binary and build if needed. +install: + go mod tidy + make install + +install-clean: + rm -rf temp + just install + +# Build the `nibid` binary. +build: + make build + +alias b := build + +# Generate protobuf code (Golang) for Nibiru +proto-gen: + #!/usr/bin/env bash + make proto-gen + +alias proto := proto-gen + +# Build protobuf types (Rust) +proto-rs: + bash proto/buf.gen.rs.sh + +lint: + #!/usr/bin/env bash + source contrib/bashlib.sh + if ! which_ok golangci-lint; then + log_info "Installing golangci-lint" + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 + fi + + golangci-lint run --allow-parallel-runners --fix + +# Runs a Nibiru local network. Ex: "just localnet --features perp spot" +localnet *PASS_FLAGS: + make localnet FLAGS="{{PASS_FLAGS}}" + +# Test: "localnet.sh" script +test-localnet: + #!/usr/bin/env bash + source contrib/bashlib.sh + just install + bash contrib/scripts/localnet.sh & + log_info "Sleeping for 6 seconds to give network time to spin up and run a few blocks." + sleep 6 + kill $(pgrep -x nibid) # Stops network running as background process. + log_success "Spun up localnet" + +# Test: "chaosnet.sh" script +test-chaosnet: + #!/usr/bin/env bash + source contrib/bashlib.sh + which_ok nibid + bash contrib/scripts/chaosnet.sh + +# Runs golang formatter (gofumpt) +fmt: + gofumpt -w x app + +# Format and lint +tidy: + #!/usr/bin/env bash + go mod tidy + just proto-gen + just lint + just fmt + +test-release: + make release-snapshot + +release-publish: + make release diff --git a/x/devgas/v1/keeper/keeper.go b/x/devgas/v1/keeper/keeper.go index 8d91db4b5..97081ccd2 100644 --- a/x/devgas/v1/keeper/keeper.go +++ b/x/devgas/v1/keeper/keeper.go @@ -26,6 +26,12 @@ type Keeper struct { wasmKeeper wasmkeeper.Keeper accountKeeper devgastypes.AccountKeeper + // feeCollectorName is the name of of x/auth module's fee collector module + // account, "fee_collector", which collects transaction fees for distribution + // to all stakers. + // + // See the `[AllocateTokens]` function from x/distribution to learn more. + // [AllocateTokens]: https://github.com/cosmos/cosmos-sdk/blob/v0.50.3/x/distribution/keeper/allocation.go feeCollectorName string // DevGasStore: IndexedMap diff --git a/x/epochs/keeper/hooks_test.go b/x/epochs/keeper/hooks_test.go index 9b1cc7e56..5e4d1d477 100644 --- a/x/epochs/keeper/hooks_test.go +++ b/x/epochs/keeper/hooks_test.go @@ -36,7 +36,6 @@ func TestAfterEpochEnd(t *testing.T) { nibiruApp.EpochsKeeper.SetHooks(hooks) hooks.On("AfterEpochEnd", ctx, identifier, epochNumber) nibiruApp.EpochsKeeper.AfterEpochEnd(ctx, identifier, epochNumber) - hooks.AssertExpectations(t) } diff --git a/x/epochs/types/hooks.go b/x/epochs/types/hooks.go index 0ed1cf2c0..ee32a2d81 100644 --- a/x/epochs/types/hooks.go +++ b/x/epochs/types/hooks.go @@ -4,8 +4,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +// EpochHooks defines a set of lifecycle hooks to occur in the ABCI BeginBlock +// hooks based on temporal epochs. type EpochHooks interface { - // AfterEpochEnd the first block whose timestamp is after the duration is counted as the end of the epoch + // AfterEpochEnd the first block whose timestamp is after the duration is + // counted as the end of the epoch AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) // BeforeEpochStart new epoch is next block of epoch end block BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) @@ -13,21 +16,29 @@ type EpochHooks interface { var _ EpochHooks = MultiEpochHooks{} -// MultiEpochHooks combine multiple gamm hooks, all hook functions are run in array sequence. +// MultiEpochHooks combines multiple [EpochHooks]. All hook functions are +// executed sequentially in the order of the slice. type MultiEpochHooks []EpochHooks func NewMultiEpochHooks(hooks ...EpochHooks) MultiEpochHooks { return hooks } -// AfterEpochEnd is called when epoch is going to be ended, epochNumber is the number of epoch that is ending. +// AfterEpochEnd runs logic at the end of an epoch. +// +// - epochIdentifier: The unique identifier of specific epoch. Ex: "30 min", "1 min". +// - epochNumber: Counter for the specific epoch type identified. func (h MultiEpochHooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { for i := range h { h[i].AfterEpochEnd(ctx, epochIdentifier, epochNumber) } } -// BeforeEpochStart is called when epoch is going to be started, epochNumber is the number of epoch that is starting. +// BeforeEpochStart runs logic in the ABCI BeginBlocker right before an epoch +// starts. +// +// - epochIdentifier: The unique identifier of specific epoch. Ex: "30 min", "1 min". +// - epochNumber: Counter for the specific epoch type identified. func (h MultiEpochHooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { for i := range h { h[i].BeforeEpochStart(ctx, epochIdentifier, epochNumber) diff --git a/x/inflation/doc.go b/x/inflation/doc.go new file mode 100644 index 000000000..59130a449 --- /dev/null +++ b/x/inflation/doc.go @@ -0,0 +1,11 @@ +/* +Package inflation implements the token inflation for the staking and utility +token of the network as described by the "Community" portion of the Nibiru Chain +tokenomics. The inflation curve is implemented as a polynomial that corresponds +to a normalized exponential decay until the network reaches its maximum supply. + +References: + - https://github.com/NibiruChain/tokenomics + - https://nibiru.fi/docs/learn/tokenomics.html +*/ +package inflation diff --git a/x/inflation/keeper/grpc_query.go b/x/inflation/keeper/grpc_query.go index fa5d13e0c..39cc78831 100644 --- a/x/inflation/keeper/grpc_query.go +++ b/x/inflation/keeper/grpc_query.go @@ -14,8 +14,8 @@ type querier struct { Keeper } -// NewQuerier returns an implementation of the oracle QueryServer interface -// for the provided Keeper. +// NewQuerier returns an implementation of the [types.QueryServer] interface +// for the provided [Keeper]. func NewQuerier(keeper Keeper) types.QueryServer { return &querier{Keeper: keeper} } diff --git a/x/inflation/keeper/hooks.go b/x/inflation/keeper/hooks.go index 420ec0b5f..0c78c3e0d 100644 --- a/x/inflation/keeper/hooks.go +++ b/x/inflation/keeper/hooks.go @@ -12,18 +12,39 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -// BeforeEpochStart noop, We don't need to do anything here -func (k Keeper) BeforeEpochStart(_ sdk.Context, _ string, _ uint64) {} +// Hooks implements module-specific calls ([epochstypes.EpochHooks]) that will +// occur at the end of every epoch. Hooks is meant for use with with +// `EpochsKeeper.SetHooks`. These functions run outside of the normal body of +// transactions. +type Hooks struct { + K Keeper +} + +var _ epochstypes.EpochHooks = Hooks{} + +// Hooks implements module-speecific calls that will occur in the ABCI +// BeginBlock logic. +func (k Keeper) Hooks() Hooks { + return Hooks{k} +} + +// BeforeEpochStart is a hook that runs just prior to the start of a new epoch. +func (h Hooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { + // Perform no operations; we don't need to do anything here + _, _, _ = ctx, epochIdentifier, epochNumber +} +// AfterEpochEnd is a hook that runs just prior to the first block whose +// timestamp is after the end of an epoch duration. // AfterEpochEnd mints and allocates coins at the end of each epoch. // If inflation is disabled as a module parameter, the state for // "NumSkippedEpochs" increments. -func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { +func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { if epochIdentifier != epochstypes.DayEpochID { return } - params := k.GetParams(ctx) + params := h.K.GetParams(ctx) // Skip inflation if it is disabled and increment number of skipped epochs if !params.InflationEnabled { @@ -31,13 +52,13 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb if !params.HasInflationStarted { // If the inflation never started, we use epochNumber as the number of skipped epochs // to avoid missing periods when we upgrade a chain. - k.NumSkippedEpochs.Set(ctx, epochNumber) + h.K.NumSkippedEpochs.Set(ctx, epochNumber) prevSkippedEpochs = epochNumber } else { - prevSkippedEpochs = k.NumSkippedEpochs.Next(ctx) + prevSkippedEpochs = h.K.NumSkippedEpochs.Next(ctx) } - k.Logger(ctx).Debug( + h.K.Logger(ctx).Debug( "skipping inflation mint and allocation", "height", ctx.BlockHeight(), "epoch-id", epochIdentifier, @@ -48,8 +69,8 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb } // mint coins, update supply - period := k.CurrentPeriod.Peek(ctx) - epochsPerPeriod := k.GetEpochsPerPeriod(ctx) + period := h.K.CurrentPeriod.Peek(ctx) + epochsPerPeriod := h.K.GetEpochsPerPeriod(ctx) epochMintProvision := types.CalculateEpochMintProvision( params, @@ -57,7 +78,7 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb ) if !epochMintProvision.IsPositive() { - k.Logger(ctx).Error( + h.K.Logger(ctx).Error( "SKIPPING INFLATION: negative epoch mint provision", "value", epochMintProvision.String(), ) @@ -69,9 +90,9 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb Amount: epochMintProvision.TruncateInt(), } - staking, strategic, communityPool, err := k.MintAndAllocateInflation(ctx, mintedCoin, params) + staking, strategic, communityPool, err := h.K.MintAndAllocateInflation(ctx, mintedCoin, params) if err != nil { - k.Logger(ctx).Error( + h.K.Logger(ctx).Error( "SKIPPING INFLATION: failed to mint and allocate inflation", "error", err, ) @@ -84,19 +105,22 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb // where inflation minted tokens. // // Examples: - // Given, epochNumber = 1, period = 0, epochPerPeriod = 30, skippedEpochs = 0 - // => 1 - 30 * 0 - 0 < 30 --- nothing to do here - // Given, epochNumber = 70, period = 1, epochPerPeriod = 30, skippedEpochs = 10 - // => 70 - 1 * 30 - 10 >= 30 --- a period has ended! we set a new period - // Given, epochNumber = 42099, period = 0, epochPerPeriod = 30, skippedEpochs = 42069 - // => 42099 - 0 * 30 - 42069 >= 30 --- a period has ended! we set a new period - numSkippedEpochs := k.NumSkippedEpochs.Peek(ctx) + // Given, epochNumber = 1, period = 0, epochPerPeriod = 30, skippedEpochs = 0 + // => 1 - 30 * 0 - 0 < 30 + // => nothing to do here + // Given, epochNumber = 70, period = 1, epochPerPeriod = 30, skippedEpochs = 10 + // => 70 - 1 * 30 - 10 >= 30 + // => a period has ended! we set a new period + // Given, epochNumber = 42099, period = 0, epochPerPeriod = 30, skippedEpochs = 42069 + // => 42099 - 0 * 30 - 42069 >= 30 + // => a period has ended! we set a new period + numSkippedEpochs := h.K.NumSkippedEpochs.Peek(ctx) if int64(epochNumber)- int64(epochsPerPeriod*period)- int64(numSkippedEpochs) >= int64(epochsPerPeriod) { - prevPeriod := k.CurrentPeriod.Next(ctx) + periodBeforeIncrement := h.K.CurrentPeriod.Next(ctx) - k.Logger(ctx).Info(fmt.Sprintf("setting new period: %d", prevPeriod+1)) + h.K.Logger(ctx).Info(fmt.Sprintf("setting new period: %d", periodBeforeIncrement+1)) } defer func() { @@ -143,26 +167,3 @@ func (k Keeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumb ), ) } - -// ___________________________________________________________________________________________________ - -// Hooks wrapper struct for inflation keeper -type Hooks struct { - k Keeper -} - -var _ epochstypes.EpochHooks = Hooks{} - -// Return the wrapper struct -func (k Keeper) Hooks() Hooks { - return Hooks{k} -} - -// epochs hooks -func (h Hooks) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.BeforeEpochStart(ctx, epochIdentifier, epochNumber) -} - -func (h Hooks) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber uint64) { - h.k.AfterEpochEnd(ctx, epochIdentifier, epochNumber) -} diff --git a/x/inflation/keeper/hooks_test.go b/x/inflation/keeper/hooks_test.go index c6f5b431f..b54851ef9 100644 --- a/x/inflation/keeper/hooks_test.go +++ b/x/inflation/keeper/hooks_test.go @@ -236,7 +236,7 @@ func TestManual(t *testing.T) { require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) for i := 0; i < 42069; i++ { - inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.Hooks().AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) epochNumber++ } require.Equal(t, sdk.ZeroInt(), GetBalanceStaking(ctx, nibiruApp)) @@ -258,7 +258,7 @@ func TestManual(t *testing.T) { // Period 0 - inflate 3M NIBI over 30 epochs or 100k uNIBI per epoch for i := 0; i < 30; i++ { - inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.Hooks().AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) require.Equal(t, sdk.NewInt(100_000).Mul(sdk.NewInt(int64(i+1))), GetBalanceStaking(ctx, nibiruApp)) epochNumber++ } @@ -270,7 +270,7 @@ func TestManual(t *testing.T) { require.NoError(t, err) for i := 0; i < 42069; i++ { - inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.Hooks().AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) epochNumber++ } require.Equal(t, sdk.NewInt(3_000_000), GetBalanceStaking(ctx, nibiruApp)) @@ -282,7 +282,7 @@ func TestManual(t *testing.T) { // Period 1 - inflate 6M NIBI over 30 epochs or 200k uNIBI per epoch for i := 0; i < 30; i++ { - inflationKeeper.AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) + inflationKeeper.Hooks().AfterEpochEnd(ctx, epochstypes.DayEpochID, epochNumber) require.Equal(t, sdk.NewInt(3_000_000).Add(sdk.NewInt(200_000).Mul(sdk.NewInt(int64(i+1)))), GetBalanceStaking(ctx, nibiruApp)) epochNumber++ } diff --git a/x/inflation/keeper/inflation.go b/x/inflation/keeper/inflation.go index 28dee826b..16eabb81a 100644 --- a/x/inflation/keeper/inflation.go +++ b/x/inflation/keeper/inflation.go @@ -10,7 +10,21 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -// MintAndAllocateInflation performs inflation minting and allocation +// MintAndAllocateInflation mints and allocates tokens based on the polynomial +// inflation coefficients and current block height. +// +// Args: +// - coins: Tokens to be minted. +// - params: +// +// Returns: +// - staking: Tokens minted for staking inflation that go to the decentralized +// validator set and delegators. This is handled by the `auth` module fee +// collector. +// - strategic: Tokens minted to the Strategic Reserve, the root account fo the +// x/sudo module. +// - community: Tokens minted to the Community Pool, which is managed strictly +// by on-chain governance. func (k Keeper) MintAndAllocateInflation( ctx sdk.Context, coins sdk.Coin, @@ -33,18 +47,23 @@ func (k Keeper) MintAndAllocateInflation( return k.AllocatePolynomialInflation(ctx, coins, params) } -// MintCoins implements an alias call to the underlying supply keeper's -// MintCoins to be used in BeginBlocker. +// MintCoins calls the underlying [BankKeeper] mints tokens "coin". func (k Keeper) MintCoins(ctx sdk.Context, coin sdk.Coin) error { coins := sdk.Coins{coin} return k.bankKeeper.MintCoins(ctx, types.ModuleName, coins) } // AllocatePolynomialInflation allocates coins from the inflation to external -// modules according to allocation proportions: -// - staking rewards -> sdk `auth` module fee collector -// - strategic reserves -> root account of x/sudo module -// - community pool -> `sdk `distr` module community pool +// modules according to proportions proportions: +// +// Returns: +// - staking: Tokens minted for staking inflation that go to the decentralized +// validator set and delegators. This is handled by the `auth` module fee +// collector. +// - strategic: Tokens minted to the Strategic Reserve, the root account fo the +// x/sudo module. +// - community: Tokens minted to the Community Pool, which is managed strictly +// by on-chain governance. func (k Keeper) AllocatePolynomialInflation( ctx sdk.Context, mintedCoin sdk.Coin, @@ -55,27 +74,26 @@ func (k Keeper) AllocatePolynomialInflation( ) { inflationDistribution := params.InflationDistribution inflationModuleAddr := k.accountKeeper.GetModuleAddress(types.ModuleName) + // Allocate staking rewards into fee collector account staking = k.GetProportions(ctx, mintedCoin, inflationDistribution.StakingRewards) - if err := k.bankKeeper.SendCoinsFromModuleToModule( ctx, types.ModuleName, k.feeCollectorName, sdk.NewCoins(staking), ); err != nil { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + return staking, strategic, community, err } // Allocate community pool rewards into community pool community = k.GetProportions(ctx, mintedCoin, inflationDistribution.CommunityPool) - if err = k.distrKeeper.FundCommunityPool( ctx, sdk.NewCoins(community), inflationModuleAddr, ); err != nil { - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + return staking, strategic, community, err } // Remaining balance is strategic reserve allocation to the root account @@ -88,10 +106,12 @@ func (k Keeper) AllocatePolynomialInflation( return staking, strategic, community, err } - if err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic)); err != nil { + if err = k.bankKeeper.SendCoinsFromModuleToAccount( + ctx, types.ModuleName, strategicAccountAddr, sdk.NewCoins(strategic), + ); err != nil { err := fmt.Errorf("inflation error: failed to send coins to sudo root account: %w", err) k.Logger(ctx).Error(err.Error()) - return sdk.Coin{}, sdk.Coin{}, sdk.Coin{}, err + return staking, strategic, community, err } return staking, strategic, community, ctx.EventManager().EmitTypedEvents( diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index 29dbe5c14..03327ac46 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -11,23 +11,45 @@ import ( "github.com/NibiruChain/nibiru/x/inflation/types" ) -// Keeper of the inflation store +// Keeper of the inflation module. Keepers are module-specific "gate keepers" +// responsible for encapsulating access to the key-value stores (state) of the +// network. The functions on the Keeper contain all of the business logic for +// reading and modifying state. type Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + // paramSpace: unused but present for backward compatibility. Removing this + // breaks the state machine and requires an upgrade. paramSpace paramstypes.Subspace - // the address capable of executing a MsgUpdateParams message. Typically, this should be the x/gov module account. - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistrKeeper - stakingKeeper types.StakingKeeper - sudoKeeper types.SudoKeeper + accountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + distrKeeper types.DistrKeeper + stakingKeeper types.StakingKeeper + sudoKeeper types.SudoKeeper + // feeCollectorName is the name of of x/auth module's fee collector module + // account, "fee_collector", which collects transaction fees for distribution + // to all stakers. + // By sending staking inflation to the fee collector, the tokens are properly + // distributed to validator operators and their delegates. + // See the `[AllocateTokens]` function from x/distribution to learn more. + // [AllocateTokens]: https://github.com/cosmos/cosmos-sdk/blob/v0.50.3/x/distribution/keeper/allocation.go feeCollectorName string - CurrentPeriod collections.Sequence + // CurrentPeriod: Strictly increasing counter for the inflation "period". + CurrentPeriod collections.Sequence + + // NumSkippedEpochs: Strictly increasing counter for the number of skipped + // epochs. Inflation epochs are skipped when [types.Params.InflationEnabled] + // is false so that gaps in the active status of inflation don't mess up the + // polynomial computation. It allows inflation to smoothly be toggled on and + // off. NumSkippedEpochs collections.Sequence - Params collections.Item[types.Params] + + // Params stores module-specific parameters that specify the blockchain token + // economics, token release schedule, maximum supply, and whether or not + // inflation is enabled on the network. + Params collections.Item[types.Params] } // NewKeeper creates a new mint Keeper instance diff --git a/x/inflation/keeper/msg_server.go b/x/inflation/keeper/msg_server.go index 21a67dc38..b1cc8048a 100644 --- a/x/inflation/keeper/msg_server.go +++ b/x/inflation/keeper/msg_server.go @@ -33,6 +33,8 @@ func (ms msgServer) EditInflationParams( return resp, err } +// ToggleInflation: gRPC tx msg for enabling or disabling token inflation. +// [SUDO] Only callable by sudoers. func (ms msgServer) ToggleInflation( goCtx context.Context, msg *types.MsgToggleInflation, ) (resp *types.MsgToggleInflationResponse, err error) { diff --git a/x/inflation/keeper/sudo.go b/x/inflation/keeper/sudo.go index 91f882b31..aa01e10a8 100644 --- a/x/inflation/keeper/sudo.go +++ b/x/inflation/keeper/sudo.go @@ -8,21 +8,22 @@ import ( inflationtypes "github.com/NibiruChain/nibiru/x/inflation/types" ) -// Sudo extends the Keeper with sudo functions. See sudo.go. +// Sudo extends the Keeper with sudo functions. See [x/sudo]. // -// These Sudo functions should: +// These sudo functions should: // 1. Not be called in other methods in the module. // 2. Only be callable by the x/sudo root or sudo contracts. // -// The intention behind "Keeper.Sudo()" is to make it more obvious to the +// The intention behind "[Keeper.Sudo]" is to make it more obvious to the // developer that an unsafe function is being used when it's called. +// [x/sudo]: https://pkg.go.dev/github.com/NibiruChain/nibiru@v1.1.0/x/sudo/keeper func (k Keeper) Sudo() sudoExtension { return sudoExtension{k} } type sudoExtension struct{ Keeper } -// ------------------------------------------------------------------ -// Admin.EditInflationParams - +// EditInflationParams performs a partial struct update, or struct merge, on the +// module parameters, given a subset of the params, `newParams`. Only the new +// params are overwritten. func (k sudoExtension) EditInflationParams( ctx sdk.Context, newParams inflationtypes.MsgEditInflationParams, sender sdk.AccAddress, @@ -44,6 +45,7 @@ func (k sudoExtension) EditInflationParams( return paramsAfter.Validate() } +// ToggleInflation disables (pauses) or enables (unpauses) inflation. func (k sudoExtension) ToggleInflation( ctx sdk.Context, enabled bool, sender sdk.AccAddress, ) (err error) { @@ -65,9 +67,10 @@ func (k sudoExtension) ToggleInflation( return } -// MergeInflationParams: Takes the given Inflation params and merges them into the -// existing partial params, keeping any existing values that are not set in the -// partial. +// MergeInflationParams: Performs a partial struct update using [partial] and +// merges its params into the existing [inflationParams], keeping any existing +// values that are not set in the partial. For use with +// [Keeper.EditInflationParams]. func MergeInflationParams( partial inflationtypes.MsgEditInflationParams, inflationParams inflationtypes.Params, diff --git a/x/inflation/types/inflation_calculation_test.go b/x/inflation/types/inflation_calculation_test.go index 8d76e6935..dcda9310c 100644 --- a/x/inflation/types/inflation_calculation_test.go +++ b/x/inflation/types/inflation_calculation_test.go @@ -20,6 +20,13 @@ var ExpectedYearlyInflation = []sdk.Dec{ sdk.NewDec(40_412_283_000_000), } +// ExpectedTotalInflation is the total amount of NIBI tokens (in unibi) that +// should be minted via inflation for the network to reach its target supply. +// The value 810.6 million is equivalent to: +// = (Community allocation of total supply) - (Community supply at start) +// = (60% of the total supply) - (Community supply at start) +// = (60% of 1.5 billion) - (Community supply at start) +// = 810.6 million NIBI var ExpectedTotalInflation = sdk.NewDec(810_600_000_000_000) func TestCalculateEpochMintProvision(t *testing.T) { @@ -29,7 +36,8 @@ func TestCalculateEpochMintProvision(t *testing.T) { epochId := uint64(0) totalInflation := sdk.ZeroDec() - // Only the first 8 years have inflation with default params + // Only the first 8 years have inflation with default params but we run + // for 10 years expecting 0 inflation in the last 2 years. for year := uint64(0); year < 10; year++ { yearlyInflation := sdk.ZeroDec() for month := uint64(0); month < 12; month++ { From 32aa8b7b33254e6f26614157ac894b275d13327e Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 21 Feb 2024 02:37:26 -0600 Subject: [PATCH 51/99] ci: fix chaosnet build (#1806) * ci: fix chaosnet build * fix(scripts): use better current absolute path directory fn * refactor(e2e-localnet): remove unused script * fix(justfile): handle case where stop is called without anything running --------- Co-authored-by: Unique-Divine --- contrib/docker/chaosnet.Dockerfile | 1 + contrib/scripts/chaosnet.sh | 2 +- contrib/scripts/e2e/localnet.sh | 244 ----------------------------- contrib/scripts/localnet.sh | 5 +- justfile | 4 + 5 files changed, 7 insertions(+), 249 deletions(-) delete mode 100644 contrib/scripts/e2e/localnet.sh diff --git a/contrib/docker/chaosnet.Dockerfile b/contrib/docker/chaosnet.Dockerfile index 943c0a4a2..e14fff196 100644 --- a/contrib/docker/chaosnet.Dockerfile +++ b/contrib/docker/chaosnet.Dockerfile @@ -23,6 +23,7 @@ RUN apk --no-cache add \ COPY --from=builder /nibiru/build/nibid /usr/local/bin/nibid COPY ./contrib/scripts/chaosnet.sh ./ +COPY ./contrib/scripts/feat-perp.sh ./ RUN chmod +x ./chaosnet.sh ARG MNEMONIC ARG CHAIN_ID diff --git a/contrib/scripts/chaosnet.sh b/contrib/scripts/chaosnet.sh index 82ae889b6..42b60c613 100755 --- a/contrib/scripts/chaosnet.sh +++ b/contrib/scripts/chaosnet.sh @@ -47,7 +47,7 @@ add_genesis_param() { mv $HOME/.nibid/config/tmp_genesis.json $HOME/.nibid/config/genesis.json } -curr_dir="$(dirname "$0")" +curr_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" source "$curr_dir/feat-perp.sh" add_genesis_perp_markets_offline diff --git a/contrib/scripts/e2e/localnet.sh b/contrib/scripts/e2e/localnet.sh deleted file mode 100644 index 69b655ac2..000000000 --- a/contrib/scripts/e2e/localnet.sh +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh -set -e - -# Console log text colour -console_log_text_color() { - red=$(tput setaf 9) - green=$(tput setaf 10) - blue=$(tput setaf 12) - reset=$(tput sgr0) -} - -if [ console_log_text_color ]; then - echo "succesfully toggled console coloring" -else - # For Ubuntu and Debian. MacOS has tput by default. - apt-get install libncurses5-dbg -y -fi - -echo_info() { - echo "${blue}" - echo "$1" - echo "${reset}" -} - -echo_error() { - echo "${red}" - echo "$1" - echo "${reset}" -} - -echo_success() { - echo "${green}" - echo "$1" - echo "${reset}" -} - -# Set localnet settings -BINARY="./nibid" -CHAIN_ID="nibiru-localnet-0" -RPC_PORT="26657" -GRPC_PORT="9090" -MNEMONIC="guard cream sadness conduct invite crumble clock pudding hole grit liar hotel maid produce squeeze return argue turtle know drive eight casino maze host" -GENESIS_COINS="1000000000unibi,10000000000000unusd" -CHAIN_DIR="$HOME/.nibid" - -SEDOPTION="" -if [[ "$OSTYPE" == "darwin"* ]]; then - SEDOPTION="''" -fi - -# Stop nibid if it is already running -if pgrep -x "$BINARY" >/dev/null; then - echo_error "Terminating $BINARY..." - killall nibid -fi - -# Remove previous data -echo_info "Removing previous chain data from $CHAIN_DIR..." -rm -rf $CHAIN_DIR - -# Add directory for chain, exit if error -if ! mkdir -p $CHAIN_DIR 2>/dev/null; then - echo_error "Failed to create chain folder. Aborting..." - exit 1 -fi - -# Initialize nibid with "localnet" chain id -echo_info "Initializing $CHAIN_ID..." -if $BINARY init nibiru-localnet-0 --chain-id $CHAIN_ID --overwrite; then - echo_success "Successfully initialized $CHAIN_ID" -else - echo_error "Failed to initialize $CHAIN_ID" -fi - -# Configure keyring-backend to "test" -echo_info "Configuring keyring-backend..." -if $BINARY config keyring-backend test; then - echo_success "Successfully configured keyring-backend" -else - echo_error "Failed to configure keyring-backend" -fi - -# Configure chain-id -echo_info "Configuring chain-id..." -if $BINARY config chain-id $CHAIN_ID; then - echo_success "Successfully configured chain-id" -else - echo_error "Failed to configure chain-id" -fi - -# Configure broadcast mode -echo_info "Configuring broadcast mode..." -if $BINARY config broadcast-mode block; then - echo_success "Successfully configured broadcast-mode" -else - echo_error "Failed to configure broadcast mode" -fi - -# Configure output mode -echo_info "Configuring output mode..." -if $BINARY config output json; then - echo_success "Successfully configured output mode" -else - echo_error "Failed to configure output mode" -fi - -# Enable API Server -echo_info "Enabling API server" -if sed -i $SEDOPTION '/\[api\]/,+3 s/enable = false/enable = true/' $CHAIN_DIR/config/app.toml; then - echo_success "Successfully enabled API server" -else - echo_error "Failed to enable API server" -fi - -# Enable Swagger Docs -echo_info "Enabling Swagger Docs" -if sed -i $SEDOPTION 's/swagger = false/swagger = true/' $CHAIN_DIR/config/app.toml; then - echo_success "Successfully enabled Swagger Docs" -else - echo_error "Failed to enable Swagger Docs" -fi - -# Enable CORS for localnet -echo_info "Enabling CORS" -if sed -i $SEDOPTION 's/enabled-unsafe-cors = false/enabled-unsafe-cors = true/' $CHAIN_DIR/config/app.toml; then - echo_success "Successfully enabled CORS" -else - echo_error "Failed to enable CORS" -fi - -echo_info "Adding genesis accounts..." -echo "$MNEMONIC" | $BINARY keys add validator --recover -if $BINARY add-genesis-account $($BINARY keys show validator -a) $GENESIS_COINS; then - echo_success "Successfully added genesis accounts" -else - echo_error "Failed to add genesis accounts" -fi - -echo_info "Adding gentx validator..." -if $BINARY gentx validator 900000000unibi --chain-id $CHAIN_ID; then - echo_success "Successfully added gentx" -else - echo_error "Failed to add gentx" -fi - -echo_info "Collecting gentx..." -if $BINARY collect-gentxs; then - echo_success "Successfully collected genesis txs into genesis.json" -else - echo_error "Failed to collect genesis txs" -fi - -# ------------------------------------------------------------------------ -# Configure genesis params -# ------------------------------------------------------------------------ - -# add_genesis_params runs a jq command to edit fields of the genesis.json . -# -# Args: -# $1 : the jq input that gets mapped to the json. -add_genesis_param() { - echo "jq input $1" - # copy param ($1) to tmp_genesis.json - cat $CHAIN_DIR/config/genesis.json | jq "$1" >$CHAIN_DIR/config/tmp_genesis.json - # rewrite genesis.json with the contents of tmp_genesis.json - mv $CHAIN_DIR/config/tmp_genesis.json $CHAIN_DIR/config/genesis.json -} - -echo_info "Configuring genesis params" - -add_genesis_perp_markets_with_coingecko_prices() { - local temp_json_fname="tmp_market_prices.json" - curl -X 'GET' \ - 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum&vs_currencies=usd' \ - -H 'accept: application/json' \ - >$temp_json_fname - - local M=1000000 - - local num_users=24000 - local faucet_nusd_amt=100 - local quote_amt=$(($num_users * $faucet_nusd_amt * $M)) - - price_btc=$(cat tmp_market_prices.json | jq -r '.bitcoin.usd') - price_btc=${price_btc%.*} - base_amt_btc=$(($quote_amt / $price_btc)) - - price_eth=$(cat tmp_market_prices.json | jq -r '.ethereum.usd') - price_eth=${price_eth%.*} - base_amt_eth=$(($quote_amt / $price_eth)) - - nibid add-genesis-perp-market --pair=ubtc:unusd --base-amt=$base_amt_btc --quote-amt=$quote_amt --max-leverage=12 - nibid add-genesis-perp-market --pair=ueth:unusd --base-amt=$base_amt_eth --quote-amt=$quote_amt --max-leverage=20 --mmr=0.04 - - echo 'tmp_market_prices: ' - cat $temp_json_fname | jq . - rm -f $temp_json_fname -} - -add_genesis_perp_markets_default() { - # nibid add-genesis-perp-market [pair] [base-asset-reserve] [quote-asset-reserve] [trade-limit-ratio] [fluctuation-limit-ratio] [maxOracle-spread-ratio] [maintenance-margin-ratio] [max-leverage] - local KILO="000" - local MEGA="000000" - local quote_amt=10$KILO$MEGA - local base_amt_btc=$(($quote_amt / 16500)) - local base_amt_eth=$(($quote_amt / 1200)) - nibid add-genesis-perp-market --pair=ubtc:unusd --base-amt=$base_amt_btc --quote-amt=$quote_amt --max-leverage=12 - nibid add-genesis-perp-market --pair=ueth:unusd --base-amt=$base_amt_eth --quote-amt=$quote_amt --max-leverage=20 --mmr=0.04 -} - -# x/perp/amm -if add_genesis_perp_markets_with_coingecko_prices; then - echo_success "set perp markets with coingecko prices" -elif add_genesis_perp_markets_default; then - echo_success "set perp markets with defaults" -else - echo_error "failed to set genesis perp markets" -fi - -# x/perp -add_genesis_param '.app_state.perp.params.stopped = false' -add_genesis_param '.app_state.perp.params.fee_pool_fee_ratio = "0.001"' -add_genesis_param '.app_state.perp.params.ecosystem_fund_fee_ratio = "0.001"' -add_genesis_param '.app_state.perp.params.liquidation_fee_ratio = "0.025"' -add_genesis_param '.app_state.perp.params.partial_liquidation_ratio = "0.25"' -add_genesis_param '.app_state.perp.params.funding_rate_interval = "30 min"' -add_genesis_param '.app_state.perp.params.twap_lookback_window = "900s"' -add_genesis_param '.app_state.perp.params.whitelisted_liquidators = ["nibi1zaavvzxez0elundtn32qnk9lkm8kmcsz44g7xl"]' -add_genesis_param '.app_state.perp.pair_metadata[0].pair = "ubtc:unusd"' -add_genesis_param '.app_state.perp.pair_metadata[0].latest_cumulative_premium_fraction = "0"' -add_genesis_param '.app_state.perp.pair_metadata[1].pair = "ueth:unusd"' -add_genesis_param '.app_state.perp.pair_metadata[1].latest_cumulative_premium_fraction = "0"' - -add_genesis_param '.app_state.oracle.params.twap_lookback_window = "900s"' -add_genesis_param '.app_state.oracle.params.vote_period = "10"' -add_genesis_param '.app_state.oracle.params.min_voters = "1"' -add_genesis_param '.app_state.oracle.exchange_rates[0].pair = "ubtc:unusd"' -add_genesis_param '.app_state.oracle.exchange_rates[0].exchange_rate = "20000"' -add_genesis_param '.app_state.oracle.exchange_rates[1].pair = "ueth:unusd"' -add_genesis_param '.app_state.oracle.exchange_rates[1].exchange_rate = "2000"' - -# Start the network -echo_info "Starting $CHAIN_ID in $CHAIN_DIR..." -$BINARY start & diff --git a/contrib/scripts/localnet.sh b/contrib/scripts/localnet.sh index 7e805f8a4..b4e47c8f1 100755 --- a/contrib/scripts/localnet.sh +++ b/contrib/scripts/localnet.sh @@ -74,9 +74,6 @@ build_from_source() { fi } -# Initialize an associative array for feature flags with default values -declare -A features=( ["perp"]=0 ["spot"]=0 ) - # enable_feature_flag: Enables feature flags variables if present enable_feature_flag() { case $1 in @@ -250,7 +247,7 @@ add_genesis_param() { echo_info "Configuring genesis params" if $FLAG_PERP; then - local curr_dir="$(dirname "$0")" + curr_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" source "$curr_dir/feat-perp.sh" if add_genesis_perp_markets_with_coingecko_prices; then diff --git a/justfile b/justfile index f48140d06..9c4a02662 100644 --- a/justfile +++ b/justfile @@ -61,6 +61,10 @@ test-chaosnet: which_ok nibid bash contrib/scripts/chaosnet.sh +# Stops any `nibid` processes, even if they're running in the background. +stop: + kill $(pgrep -x nibid) || true + # Runs golang formatter (gofumpt) fmt: gofumpt -w x app From 3e2d1a34ee6faa0fef6421e4824a732da6efa4c3 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sat, 24 Feb 2024 10:40:28 -0600 Subject: [PATCH 52/99] chore: bump cosmos-sdk to v0.47.9 (#1808) * chore: bump cosmos-sdk to v0.47.9 * chore: update changelog --- CHANGELOG.md | 1 + go.mod | 84 +++++++++++---------- go.sum | 203 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 174 insertions(+), 114 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f152365f5..2860c607c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -66,6 +66,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1712](https://github.com/NibiruChain/nibiru/pull/1712) - refactor(inflation): turn inflation off by default * [#1792](https://github.com/NibiruChain/nibiru/pull/1792) - fix(inflation): uncomment legacy amino register on app module basic * [#1799](https://github.com/NibiruChain/nibiru/pull/1799) refactor,docs(inflation): Document everything + delete unused code. Make perp and spot optional features in localnet.sh +* [#1808](https://github.com/NibiruChain/nibiru/pull/1808) - Bump `cosmos-sdk` to v0.47.9 ## [v1.0.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.0) diff --git a/go.mod b/go.mod index f90d1595b..5637706d9 100644 --- a/go.mod +++ b/go.mod @@ -1,19 +1,21 @@ module github.com/NibiruChain/nibiru -go 1.19 +go 1.21 + +toolchain go1.22.0 require ( - cosmossdk.io/errors v1.0.0 - cosmossdk.io/math v1.1.2 + cosmossdk.io/errors v1.0.1 + cosmossdk.io/math v1.2.0 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.3.0 github.com/armon/go-metrics v0.4.1 - github.com/cometbft/cometbft v0.37.2 - github.com/cometbft/cometbft-db v0.8.0 - github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.5 + github.com/cometbft/cometbft v0.37.4 + github.com/cometbft/cometbft-db v0.9.1 + github.com/cosmos/cosmos-proto v1.0.0-beta.4 + github.com/cosmos/cosmos-sdk v0.47.9 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -31,27 +33,27 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 + google.golang.org/grpc v1.60.1 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.110.7 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/log v1.3.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -83,7 +85,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -91,18 +93,20 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -122,16 +126,16 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.3 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/linxGnu/grocksdb v1.8.0 // indirect + github.com/linxGnu/grocksdb v1.8.6 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -149,7 +153,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.30.0 // indirect + github.com/rs/zerolog v1.32.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -161,25 +165,27 @@ require ( github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/term v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/api v0.149.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect - pgregory.net/rapid v0.5.5 // indirect + pgregory.net/rapid v1.1.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index c1bb79276..f1923929f 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -197,12 +197,12 @@ cosmossdk.io/core v0.6.1 h1:OBy7TI2W+/gyn2z40vVvruK3di+cAluinA6cybFbE7s= cosmossdk.io/core v0.6.1/go.mod h1:g3MMBCBXtxbDWBURDVnJE7XML4BG5qENhs0gzkcpuFA= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= -cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= +cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= +cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= +cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -219,10 +219,11 @@ github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3 github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= -github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= github.com/CosmWasm/wasmd v0.44.0 h1:2sbcoCAvfjCs1O0SWt53xULKjkV06dbSFthEViIC6Zg= github.com/CosmWasm/wasmd v0.44.0/go.mod h1:tDyYN050qUcdd7LOxGeo2e185sEShyO3nJGl2Cf59+k= github.com/CosmWasm/wasmvm v1.5.0 h1:3hKeT9SfwfLhxTGKH3vXaKFzBz1yuvP8SlfwfQXbQfw= @@ -234,9 +235,11 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A= github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/NibiruChain/collections v0.3.0 h1:DB2RPzzgcHk35lRXuJ1cPOezweAZ6/c/Guq3bAo4W6w= github.com/NibiruChain/collections v0.3.0/go.mod h1:tKTlBL+Cs1oJnS4tT9MIaFWr7BWsUXrc7KPzP1LxRBo= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= @@ -247,6 +250,7 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= +github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -303,6 +307,7 @@ github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJ github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= +github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= @@ -319,8 +324,10 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= +github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -337,6 +344,7 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= @@ -373,10 +381,10 @@ github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= -github.com/cometbft/cometbft v0.37.2 h1:XB0yyHGT0lwmJlFmM4+rsRnczPlHoAKFX6K8Zgc2/Jc= -github.com/cometbft/cometbft v0.37.2/go.mod h1:Y2MMMN//O5K4YKd8ze4r9jmk4Y7h0ajqILXbH5JQFVs= -github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= -github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= +github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= +github.com/cometbft/cometbft-db v0.9.1 h1:MIhVX5ja5bXNHF8EYrThkG9F7r9kSfv8BX4LWaxWJ4M= +github.com/cometbft/cometbft-db v0.9.1/go.mod h1:iliyWaoV0mRwBJoizElCwwRA9Tf7jZJOURcRZF9m60U= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= @@ -384,6 +392,7 @@ github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSM github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= +github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -392,10 +401,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= -github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= +github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= +github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= +github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -459,15 +468,17 @@ github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m3 github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= +github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -493,14 +504,17 @@ github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -516,6 +530,7 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -531,16 +546,24 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= +github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -552,6 +575,7 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -626,8 +650,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -639,6 +664,7 @@ github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIG github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -657,20 +683,20 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -680,8 +706,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -787,6 +813,7 @@ github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1C github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -803,6 +830,7 @@ github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -820,11 +848,12 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= +github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -845,6 +874,7 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= @@ -852,8 +882,8 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.8.0 h1:H4L/LhP7GOMf1j17oQAElHgVlbEje2h14A8Tz9cM2BE= -github.com/linxGnu/grocksdb v1.8.0/go.mod h1:09CeBborffXhXdNpEcOeZrLKEnRtrZFEpFdPNI9Zjjg= +github.com/linxGnu/grocksdb v1.8.6 h1:O7I6SIGPrypf3f/gmrrLUBQDKfO8uOoYdWf4gLS06tc= +github.com/linxGnu/grocksdb v1.8.6/go.mod h1:xZCIb5Muw+nhbDK4Y5UJuOrin5MceOuiXkVUR7vp4WY= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -869,7 +899,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -879,8 +908,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -918,6 +948,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= @@ -939,6 +970,7 @@ github.com/neilotoole/errgroup v0.1.6/go.mod h1:Q2nLGf+594h0CLBs/Mbg6qOr7GtqDK7C github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -949,16 +981,20 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.20.0 h1:8W0cWlwFkflGPLltQvLRB7ZVD5HuP6ng320w2IS245Q= +github.com/onsi/gomega v1.20.0/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= +github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= +github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -969,6 +1005,7 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -988,6 +1025,7 @@ github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1053,8 +1091,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1074,6 +1112,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1142,6 +1181,7 @@ github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZF github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -1149,6 +1189,7 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1176,8 +1217,8 @@ github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWp github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1190,6 +1231,14 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1201,6 +1250,7 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= +golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1223,10 +1273,9 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1271,6 +1320,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1337,8 +1387,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1364,8 +1414,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1380,8 +1430,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1465,7 +1515,6 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1490,14 +1539,15 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= -golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1509,8 +1559,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1581,6 +1631,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1645,8 +1696,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1654,8 +1705,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1767,12 +1819,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1814,8 +1866,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1832,8 +1884,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1871,7 +1923,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1883,8 +1936,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 3324bc99904ec8231baf46e4b434ad412499a303 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Sat, 24 Feb 2024 20:02:40 +0100 Subject: [PATCH 53/99] feat: update default inflation rate (#1804) * feat: update default inflation rate * chore: changelog * fix: fix rounding issue --- CHANGELOG.md | 1 + x/inflation/keeper/inflation_test.go | 28 ++++---- x/inflation/simulation/genesis.go | 47 ++++++++++++++ .../types/inflation_calculation_test.go | 64 +++++++++++++------ x/inflation/types/params.go | 18 +++--- 5 files changed, 115 insertions(+), 43 deletions(-) create mode 100644 x/inflation/simulation/genesis.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2860c607c..54ed9a83c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1786](https://github.com/NibiruChain/nibiru/pull/1786) - fix(inflation): fix inflation off-by 2 error * [#1796](https://github.com/NibiruChain/nibiru/pull/1796) - fix(inflation): fix num skipped epoch when inflation is added to an existing chain * [#1797](https://github.com/NibiruChain/nibiru/pull/1797) - fix(inflation): fix num skipped epoch updates logic +* [#1804](https://github.com/NibiruChain/nibiru/pull/1804) - fix(inflation): update default parameters ### Improvements diff --git a/x/inflation/keeper/inflation_test.go b/x/inflation/keeper/inflation_test.go index 497f24244..f652ac352 100644 --- a/x/inflation/keeper/inflation_test.go +++ b/x/inflation/keeper/inflation_test.go @@ -37,12 +37,12 @@ func TestMintAndAllocateInflation(t *testing.T) { { name: "pass", coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(351_591)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(351_591))), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(281_250)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(363_925)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(354_825)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(281_250)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(363_925)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(354_825))), rootAccount: "nibi1qyqf35fkhn73hjr70442fctpq8prpqr9ysj9sn", }, { @@ -59,12 +59,12 @@ func TestMintAndAllocateInflation(t *testing.T) { { name: "pass - no root account", coinsToMint: sdk.NewCoin(denoms.NIBI, sdk.NewInt(1_000_000)), - expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), - expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), - expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(351_591)), - expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(277_572)), - expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(370_837)), - expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(351_591))), + expectedStakingAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(281_250)), + expectedStrategicAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(363_925)), + expectedCommunityAmt: sdk.NewCoin(denoms.NIBI, sdk.NewInt(354_825)), + expectedStakingRewardsBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(281_250)), + expectedStrategicReservesBalance: sdk.NewCoin(denoms.NIBI, sdk.NewInt(363_925)), + expectedCommunityPoolBalance: sdk.NewDecCoins(sdk.NewDecCoin(denoms.NIBI, sdk.NewInt(354_825))), rootAccount: "", }, } @@ -154,7 +154,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { params.InflationEnabled = true nibiruApp.InflationKeeper.Params.Set(ctx, params) }, - sdk.MustNewDecFromStr("27.095518287362700000"), + sdk.MustNewDecFromStr("26.741197359810099000"), }, { "low supply", @@ -164,7 +164,7 @@ func TestGetCirculatingSupplyAndInflationRate(t *testing.T) { params.InflationEnabled = true nibiruApp.InflationKeeper.Params.Set(ctx, params) }, - sdk.MustNewDecFromStr("54.191036574725400000"), + sdk.MustNewDecFromStr("53.482394719620198000"), }, } for _, tc := range testCases { diff --git a/x/inflation/simulation/genesis.go b/x/inflation/simulation/genesis.go new file mode 100644 index 000000000..25add08db --- /dev/null +++ b/x/inflation/simulation/genesis.go @@ -0,0 +1,47 @@ +package simulation + +// DONTCOVER + +import ( + "encoding/json" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +// RandomizedGenState generates a random GenesisState for distribution +func RandomizedGenState(simState *module.SimulationState) { + inflationGenesis := types.GenesisState{ + Params: types.Params{ + InflationEnabled: true, + PolynomialFactors: []sdk.Dec{ + sdk.MustNewDecFromStr("-0.00014851"), + sdk.MustNewDecFromStr("0.07501029"), + sdk.MustNewDecFromStr("-19.04983993"), + sdk.MustNewDecFromStr("3158.89198346"), + sdk.MustNewDecFromStr("-338072.17402939"), + sdk.MustNewDecFromStr("17999834.20786474"), + }, + InflationDistribution: types.InflationDistribution{ + CommunityPool: sdk.NewDecWithPrec(35_142714, 8), // 35.142714% + StakingRewards: sdk.NewDecWithPrec(27_855672, 8), // 27.855672% + StrategicReserves: sdk.NewDecWithPrec(37_001614, 8), // 37.001614% + }, + EpochsPerPeriod: 30, + PeriodsPerYear: 12, + MaxPeriod: 8 * 12, + }, + Period: 0, + SkippedEpochs: 0, + } + + bz, err := json.MarshalIndent(&inflationGenesis, "", " ") + if err != nil { + panic(err) + } + fmt.Printf("Selected randomly generated x/inflation parameters:\n%s\n", bz) + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&inflationGenesis) +} diff --git a/x/inflation/types/inflation_calculation_test.go b/x/inflation/types/inflation_calculation_test.go index dcda9310c..72a87580d 100644 --- a/x/inflation/types/inflation_calculation_test.go +++ b/x/inflation/types/inflation_calculation_test.go @@ -10,30 +10,30 @@ import ( // These numbers are for year n month 1 var ExpectedYearlyInflation = []sdk.Dec{ - sdk.NewDec(195_895_391_000_000), - sdk.NewDec(156_348_637_000_000), - sdk.NewDec(124_785_459_000_000), - sdk.NewDec(99_594_157_000_000), - sdk.NewDec(79_488_398_000_000), - sdk.NewDec(63_441_527_000_000), - sdk.NewDec(50_634_148_000_000), - sdk.NewDec(40_412_283_000_000), + sdk.NewDec(193_333_719e6), + sdk.NewDec(154_304_107e6), + sdk.NewDec(123_153_673e6), + sdk.NewDec(98_291_791e6), + sdk.NewDec(78_448_949e6), + sdk.NewDec(62_611_919e6), + sdk.NewDec(49_972_019e6), + sdk.NewDec(39_883_823e6), } // ExpectedTotalInflation is the total amount of NIBI tokens (in unibi) that // should be minted via inflation for the network to reach its target supply. -// The value 810.6 million is equivalent to: +// The value 800M is equivalent to: // = (Community allocation of total supply) - (Community supply at start) // = (60% of the total supply) - (Community supply at start) // = (60% of 1.5 billion) - (Community supply at start) -// = 810.6 million NIBI -var ExpectedTotalInflation = sdk.NewDec(810_600_000_000_000) +// = 800 million NIBI +var ExpectedTotalInflation = sdk.NewDec(800_000_000e6) func TestCalculateEpochMintProvision(t *testing.T) { params := DefaultParams() params.InflationEnabled = true - epochId := uint64(0) + period := uint64(0) totalInflation := sdk.ZeroDec() // Only the first 8 years have inflation with default params but we run @@ -42,20 +42,45 @@ func TestCalculateEpochMintProvision(t *testing.T) { yearlyInflation := sdk.ZeroDec() for month := uint64(0); month < 12; month++ { for day := uint64(0); day < 30; day++ { - epochMintProvisions := CalculateEpochMintProvision(params, epochId) + epochMintProvisions := CalculateEpochMintProvision(params, period) yearlyInflation = yearlyInflation.Add(epochMintProvisions) } - epochId++ + period++ } // Should be within 0.0098% if year < uint64(len(ExpectedYearlyInflation)) { - require.NoError(t, withingRange(yearlyInflation, ExpectedYearlyInflation[year])) + require.NoError(t, withinRange(ExpectedYearlyInflation[year], yearlyInflation)) } else { require.Equal(t, yearlyInflation, sdk.ZeroDec()) } totalInflation = totalInflation.Add(yearlyInflation) } - require.NoError(t, withingRange(totalInflation, ExpectedTotalInflation)) + require.NoError(t, withinRange(ExpectedTotalInflation, totalInflation)) +} + +func TestCalculateEpochMintProvisionInflationNotEnabled(t *testing.T) { + params := DefaultParams() + params.InflationEnabled = false + + epochId := uint64(0) + totalInflation := sdk.ZeroDec() + + // Only the first 8 years have inflation with default params but we run + // for 10 years expecting 0 inflation + for year := uint64(0); year < 10; year++ { + yearlyInflation := sdk.ZeroDec() + for month := uint64(0); month < 12; month++ { + for day := uint64(0); day < 30; day++ { + epochMintProvisions := CalculateEpochMintProvision(params, epochId) + yearlyInflation = yearlyInflation.Add(epochMintProvisions) + } + epochId++ + } + + require.Equal(t, yearlyInflation, sdk.ZeroDec()) + totalInflation = totalInflation.Add(yearlyInflation) + } + require.Equal(t, totalInflation, sdk.ZeroDec()) } func TestCalculateEpochMintProvision_ZeroEpochs(t *testing.T) { @@ -66,12 +91,11 @@ func TestCalculateEpochMintProvision_ZeroEpochs(t *testing.T) { require.Equal(t, epochMintProvisions, sdk.ZeroDec()) } -// withingRange returns an error if the actual value is not within the expected value +/- tolerance +// withinRange returns an error if the actual value is not within the expected value +/- tolerance // tolerance is a percentage set to 0.01% by default -func withingRange(expected, actual sdk.Dec) error { +func withinRange(expected, actual sdk.Dec) error { tolerance := sdk.NewDecWithPrec(1, 4) - is_within := expected.Sub(actual).Abs().Quo(expected).LTE(tolerance) - if !is_within { + if expected.Sub(actual).Abs().Quo(expected).GT(tolerance) { tolerancePercent := tolerance.Mul(sdk.NewDec(100)) return fmt.Errorf("expected %s to be within %s%% of %s", actual.String(), tolerancePercent.String(), expected.String()) } diff --git a/x/inflation/types/params.go b/x/inflation/types/params.go index 1302c2411..0c60f3ab0 100644 --- a/x/inflation/types/params.go +++ b/x/inflation/types/params.go @@ -20,17 +20,17 @@ var ( var ( DefaultInflation = false DefaultPolynomialFactors = []sdk.Dec{ - sdk.MustNewDecFromStr("-0.00014903"), - sdk.MustNewDecFromStr("0.07527647"), - sdk.MustNewDecFromStr("-19.11742154"), - sdk.MustNewDecFromStr("3170.0969905"), - sdk.MustNewDecFromStr("-339271.31060432"), - sdk.MustNewDecFromStr("18063678.8582418"), + sdk.MustNewDecFromStr("-0.000147085524"), + sdk.MustNewDecFromStr("0.074291982762"), + sdk.MustNewDecFromStr("-18.867415611180"), + sdk.MustNewDecFromStr("3128.641926954698"), + sdk.MustNewDecFromStr("-334834.740631598223"), + sdk.MustNewDecFromStr("17827464.906540066004"), } DefaultInflationDistribution = InflationDistribution{ - CommunityPool: sdk.NewDecWithPrec(35_159141, 8), // 35.159141% - StakingRewards: sdk.NewDecWithPrec(27_757217, 8), // 27.757217% - StrategicReserves: sdk.NewDecWithPrec(37_083642, 8), // 37.083642% + CommunityPool: sdk.NewDecWithPrec(35_4825, 6), // 35.4825% + StakingRewards: sdk.NewDecWithPrec(28_1250, 6), // 28.1250% + StrategicReserves: sdk.NewDecWithPrec(36_3925, 6), // 36.3925% } DefaultEpochsPerPeriod = uint64(30) DefaultPeriodsPerYear = uint64(12) From 98901bfabd147a5aa6599d5ba5c651ae7400d153 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:58:21 -0700 Subject: [PATCH 54/99] ci: remove go toolchain in go.mod file --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 5637706d9..2a39f87c6 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/NibiruChain/nibiru go 1.21 -toolchain go1.22.0 - require ( cosmossdk.io/errors v1.0.1 cosmossdk.io/math v1.2.0 From 283989ad3ba77b2780667403efb5168b9c34ec8e Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:14:15 -0700 Subject: [PATCH 55/99] ci: revert back to cosmos sdk v0.47.5 --- go.mod | 68 +++++++++++++-------------- go.sum | 142 ++++++++++++++++++++++++++------------------------------- 2 files changed, 96 insertions(+), 114 deletions(-) diff --git a/go.mod b/go.mod index 800e9d8a8..61320a298 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,16 @@ module github.com/NibiruChain/nibiru go 1.21 require ( - cosmossdk.io/errors v1.0.1 - cosmossdk.io/math v1.2.0 + cosmossdk.io/errors v1.0.0 + cosmossdk.io/math v1.1.2 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.4.0 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 - github.com/cosmos/cosmos-proto v1.0.0-beta.4 - github.com/cosmos/cosmos-sdk v0.47.9 + github.com/cosmos/cosmos-proto v1.0.0-beta.3 + github.com/cosmos/cosmos-sdk v0.47.5 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -30,22 +30,22 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 - google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.32.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/grpc v1.59.0 + google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.111.0 // indirect - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go v0.110.7 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect + cloud.google.com/go/iam v1.1.1 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.3.1 // indirect + cosmossdk.io/log v1.2.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -83,7 +83,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.6.0 // indirect + github.com/dvsekhvalnov/jose2go v1.5.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -91,20 +91,18 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.4.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -124,7 +122,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.16.3 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect @@ -133,7 +131,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -151,7 +149,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.32.0 // indirect + github.com/rs/zerolog v1.30.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -165,25 +163,23 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.19.0 // indirect - go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.15.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/net v0.18.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/term v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/api v0.149.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.126.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect - pgregory.net/rapid v1.1.0 // indirect + pgregory.net/rapid v0.5.5 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index b6544fa34..10a6b12d0 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= -cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= +cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= +cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -197,12 +197,12 @@ cosmossdk.io/core v0.6.1 h1:OBy7TI2W+/gyn2z40vVvruK3di+cAluinA6cybFbE7s= cosmossdk.io/core v0.6.1/go.mod h1:g3MMBCBXtxbDWBURDVnJE7XML4BG5qENhs0gzkcpuFA= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= -cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= -cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= -cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= -cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= +cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= +cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= +cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= +cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= +cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -401,10 +401,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= -github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= -github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= -github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= +github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= +github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= +github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= +github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -477,8 +477,8 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= -github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= +github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -546,11 +546,6 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -650,9 +645,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -683,20 +677,20 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -706,8 +700,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -848,8 +842,8 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= +github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= @@ -899,6 +893,7 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -908,9 +903,8 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1091,8 +1085,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= +github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1231,14 +1225,6 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= -go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= -go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= -go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= -go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= -go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= -go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= -go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1273,9 +1259,10 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1387,8 +1374,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1414,8 +1401,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1430,8 +1417,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1515,6 +1502,7 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1539,15 +1527,14 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1696,8 +1683,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1705,9 +1692,8 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1819,12 +1805,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= -google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1866,8 +1852,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1884,8 +1870,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1923,8 +1909,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1936,8 +1922,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= +pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 2533c8e55137e6aaa9d8264fd117f3c866e23243 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:15:05 -0700 Subject: [PATCH 56/99] ci: bump to cosmos-sdk v0.47.6 --- go.mod | 22 +++++++++++----------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 61320a298..a0c7cffb5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( cosmossdk.io/errors v1.0.0 - cosmossdk.io/math v1.1.2 + cosmossdk.io/math v1.2.0 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 @@ -12,7 +12,7 @@ require ( github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.5 + github.com/cosmos/cosmos-sdk v0.47.6 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -30,17 +30,17 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.110.7 // indirect + cloud.google.com/go v0.110.8 // indirect cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/iam v1.1.2 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect @@ -101,8 +101,8 @@ require ( github.com/google/orderedcode v0.0.1 // indirect github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect @@ -122,7 +122,7 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.16.3 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect @@ -172,10 +172,10 @@ require ( golang.org/x/term v0.14.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect + google.golang.org/api v0.128.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index 10a6b12d0..e52e60f19 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -201,8 +201,8 @@ cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= -cosmossdk.io/math v1.1.2 h1:ORZetZCTyWkI5GlZ6CZS28fMHi83ZYf+A2vVnHNzZBM= -cosmossdk.io/math v1.1.2/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= +cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -403,8 +403,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= -github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= +github.com/cosmos/cosmos-sdk v0.47.6 h1:uyo/eg9NMB66aQZIZUv/LeOPTdSnsU23wZkgFYpjikQ= +github.com/cosmos/cosmos-sdk v0.47.6/go.mod h1:xTc1chW8HyUWCfrgGbjS5jNu9RzlPVrBNfbL9RmZUio= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -689,8 +689,8 @@ github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -700,8 +700,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -842,8 +842,8 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= @@ -1683,8 +1683,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1805,12 +1805,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= From eab04a1bfb2d673a253b2521121d868672d4fdae Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:16:00 -0700 Subject: [PATCH 57/99] ci: bump to cosmos-sdk v0.47.7 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a0c7cffb5..3f9aeb8d8 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.6 + github.com/cosmos/cosmos-sdk v0.47.7 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 diff --git a/go.sum b/go.sum index e52e60f19..1c19b6e97 100644 --- a/go.sum +++ b/go.sum @@ -403,8 +403,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.6 h1:uyo/eg9NMB66aQZIZUv/LeOPTdSnsU23wZkgFYpjikQ= -github.com/cosmos/cosmos-sdk v0.47.6/go.mod h1:xTc1chW8HyUWCfrgGbjS5jNu9RzlPVrBNfbL9RmZUio= +github.com/cosmos/cosmos-sdk v0.47.7 h1:yoyWF/x2dvKysgB8PVnSc83JIhbx3l11ZSf+bgBBfHQ= +github.com/cosmos/cosmos-sdk v0.47.7/go.mod h1:hljXsedSCJYge78hyaMYy+yzDQVGZtKAZBjZn5QMddk= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= From a26cbe16932ddc961756aea6a90c45224c5f1ae1 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:16:36 -0700 Subject: [PATCH 58/99] ci: bump to cosmos-sdk v0.47.8 --- go.mod | 56 ++++++++++++++------------- go.sum | 118 ++++++++++++++++++++++++++++++++------------------------- 2 files changed, 96 insertions(+), 78 deletions(-) diff --git a/go.mod b/go.mod index 3f9aeb8d8..906dbeda7 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/NibiruChain/nibiru go 1.21 require ( - cosmossdk.io/errors v1.0.0 + cosmossdk.io/errors v1.0.1 cosmossdk.io/math v1.2.0 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 @@ -12,7 +12,7 @@ require ( github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.7 + github.com/cosmos/cosmos-sdk v0.47.8 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -30,22 +30,22 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.16.0 github.com/stretchr/testify v1.8.4 - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 - google.golang.org/grpc v1.59.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 + google.golang.org/grpc v1.60.1 + google.golang.org/protobuf v1.32.0 gopkg.in/yaml.v2 v2.4.0 ) require ( - cloud.google.com/go v0.110.8 // indirect - cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go v0.111.0 // indirect + cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect + cloud.google.com/go/iam v1.1.5 // indirect cloud.google.com/go/storage v1.30.1 // indirect cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.2.1 // indirect + cosmossdk.io/log v1.3.0 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -91,17 +91,19 @@ require ( github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/orderedcode v0.0.1 // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.4 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect github.com/googleapis/gax-go/v2 v2.12.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect @@ -131,7 +133,7 @@ require ( github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -149,7 +151,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.30.0 // indirect + github.com/rs/zerolog v1.31.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -163,19 +165,21 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/crypto v0.15.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect + golang.org/x/crypto v0.16.0 // indirect golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.14.0 // indirect - golang.org/x/term v0.14.0 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.13.0 // indirect + golang.org/x/sync v0.4.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.128.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect + google.golang.org/api v0.149.0 // indirect + google.golang.org/appengine v1.6.8 // indirect + google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect diff --git a/go.sum b/go.sum index 1c19b6e97..b626c2d4d 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9 cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME= -cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.111.0 h1:YHLKNupSD1KqjDbQ3+LVdQ81h/UJbJyZG203cEfnQgM= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= @@ -73,8 +73,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= @@ -114,8 +114,8 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97 cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= @@ -197,10 +197,10 @@ cosmossdk.io/core v0.6.1 h1:OBy7TI2W+/gyn2z40vVvruK3di+cAluinA6cybFbE7s= cosmossdk.io/core v0.6.1/go.mod h1:g3MMBCBXtxbDWBURDVnJE7XML4BG5qENhs0gzkcpuFA= cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= -cosmossdk.io/errors v1.0.0 h1:nxF07lmlBbB8NKQhtJ+sJm6ef5uV1XkvPXG2bUntb04= -cosmossdk.io/errors v1.0.0/go.mod h1:+hJZLuhdDE0pYN8HkOrVNwrIOYvUGnn6+4fjnJs/oV0= -cosmossdk.io/log v1.2.1 h1:Xc1GgTCicniwmMiKwDxUjO4eLhPxoVdI9vtMW8Ti/uk= -cosmossdk.io/log v1.2.1/go.mod h1:GNSCc/6+DhFIj1aLn/j7Id7PaO8DzNylUZoOYBL9+I4= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/log v1.3.0 h1:L0Z0XstClo2kOU4h3V1iDoE5Ji64sg5HLOogzGg67Oo= +cosmossdk.io/log v1.3.0/go.mod h1:HIDyvWLqZe2ovlWabsDN4aPMpY/nUEquAhgfTf2ZzB8= cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= @@ -403,8 +403,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.7 h1:yoyWF/x2dvKysgB8PVnSc83JIhbx3l11ZSf+bgBBfHQ= -github.com/cosmos/cosmos-sdk v0.47.7/go.mod h1:hljXsedSCJYge78hyaMYy+yzDQVGZtKAZBjZn5QMddk= +github.com/cosmos/cosmos-sdk v0.47.8 h1:kzYF2xhnfi8dy15t2VVS24tc2KcuU4JBgjh9yCFx4y4= +github.com/cosmos/cosmos-sdk v0.47.8/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -546,6 +546,11 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -645,8 +650,9 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -677,20 +683,20 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.4 h1:uGy6JWR/uMIILU8wbf+OkstIrNiMjGpEIyhx8f6W7s4= -github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -893,7 +899,6 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -903,8 +908,9 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1085,8 +1091,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c= -github.com/rs/zerolog v1.30.0/go.mod h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1225,6 +1231,14 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1259,10 +1273,9 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1374,8 +1387,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1401,8 +1414,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1417,8 +1430,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1502,7 +1515,6 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1527,14 +1539,15 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1683,8 +1696,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1692,8 +1705,9 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1805,12 +1819,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a h1:fwgW9j3vHirt4ObdHoYNwuO24BEZjSzbh+zPaNWoiY8= -google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0 h1:s1w3X6gQxwrLEpxnLd/qXTVLgQE2yXwaOaoa6IlY/+o= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1852,8 +1866,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= +google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1870,8 +1884,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1909,8 +1923,8 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= -gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From bccad376ee261f04cf1ac46e30735d3f9822c27d Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 10:17:08 -0700 Subject: [PATCH 59/99] ci: bump to cosmos-sdk v0.47.9 --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 906dbeda7..800e9d8a8 100644 --- a/go.mod +++ b/go.mod @@ -11,8 +11,8 @@ require ( github.com/NibiruChain/collections v0.4.0 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 - github.com/cosmos/cosmos-proto v1.0.0-beta.3 - github.com/cosmos/cosmos-sdk v0.47.8 + github.com/cosmos/cosmos-proto v1.0.0-beta.4 + github.com/cosmos/cosmos-sdk v0.47.9 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -45,7 +45,7 @@ require ( cosmossdk.io/api v0.4.0 // indirect cosmossdk.io/core v0.6.1 // indirect cosmossdk.io/depinject v1.0.0-alpha.4 // indirect - cosmossdk.io/log v1.3.0 // indirect + cosmossdk.io/log v1.3.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect @@ -83,7 +83,7 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/dvsekhvalnov/jose2go v1.5.0 // indirect + github.com/dvsekhvalnov/jose2go v1.6.0 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.23.0 // indirect @@ -151,7 +151,7 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rogpeppe/go-internal v1.11.0 // indirect github.com/rs/cors v1.8.3 // indirect - github.com/rs/zerolog v1.31.0 // indirect + github.com/rs/zerolog v1.32.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -183,7 +183,7 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect - pgregory.net/rapid v0.5.5 // indirect + pgregory.net/rapid v1.1.0 // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index b626c2d4d..b6544fa34 100644 --- a/go.sum +++ b/go.sum @@ -199,8 +199,8 @@ cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98ok cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.3.0 h1:L0Z0XstClo2kOU4h3V1iDoE5Ji64sg5HLOogzGg67Oo= -cosmossdk.io/log v1.3.0/go.mod h1:HIDyvWLqZe2ovlWabsDN4aPMpY/nUEquAhgfTf2ZzB8= +cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= +cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= @@ -401,10 +401,10 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= -github.com/cosmos/cosmos-proto v1.0.0-beta.3 h1:VitvZ1lPORTVxkmF2fAp3IiA61xVwArQYKXTdEcpW6o= -github.com/cosmos/cosmos-proto v1.0.0-beta.3/go.mod h1:t8IASdLaAq+bbHbjq4p960BvcTqtwuAxid3b/2rOD6I= -github.com/cosmos/cosmos-sdk v0.47.8 h1:kzYF2xhnfi8dy15t2VVS24tc2KcuU4JBgjh9yCFx4y4= -github.com/cosmos/cosmos-sdk v0.47.8/go.mod h1:VTAtthIsmfplanhFfUTfT6ED4F+kkJxT7nmvmKXRthI= +github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= +github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= +github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= +github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -477,8 +477,8 @@ github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:Htrtb github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/dvsekhvalnov/jose2go v1.5.0 h1:3j8ya4Z4kMCwT5nXIKFSV84YS+HdqSSO0VsTQxaLAeM= -github.com/dvsekhvalnov/jose2go v1.5.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/dvsekhvalnov/jose2go v1.6.0 h1:Y9gnSnP4qEI0+/uQkHvFXeD2PLPJeXEL+ySMEA2EjTY= +github.com/dvsekhvalnov/jose2go v1.6.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= @@ -1091,8 +1091,8 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= -github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1936,8 +1936,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -pgregory.net/rapid v0.5.5 h1:jkgx1TjbQPD/feRoK+S/mXw9e1uj6WilpHrXJowi6oA= -pgregory.net/rapid v0.5.5/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= +pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From a34b5570544e9bbc316c5e7ad8e1668936db678d Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 25 Feb 2024 21:33:44 -0700 Subject: [PATCH 60/99] ci: revert to cosmos sdk v0.47.5 --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 800e9d8a8..4d9de1c32 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,11 @@ require ( github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/NibiruChain/collections v0.4.0 + github.com/armon/go-metrics v0.4.1 github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.4 - github.com/cosmos/cosmos-sdk v0.47.9 + github.com/cosmos/cosmos-sdk v0.47.5 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -51,7 +52,6 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect - github.com/armon/go-metrics v0.4.1 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect diff --git a/go.sum b/go.sum index b6544fa34..792357265 100644 --- a/go.sum +++ b/go.sum @@ -403,8 +403,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= -github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= -github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= +github.com/cosmos/cosmos-sdk v0.47.5 h1:n1+WjP/VM/gAEOx3TqU2/Ny734rj/MX1kpUnn7zVJP8= +github.com/cosmos/cosmos-sdk v0.47.5/go.mod h1:EHwCeN9IXonsjKcjpS12MqeStdZvIdxt3VYXhus3G3c= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= From 65c06ba774c260ece942131ad7a93de0e162266e Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 3 Mar 2024 12:42:36 -0700 Subject: [PATCH 61/99] chore: bump cosmos-sdk to v0.47.10 --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 800e9d8a8..f9336af85 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21 require ( cosmossdk.io/errors v1.0.1 - cosmossdk.io/math v1.2.0 + cosmossdk.io/math v1.3.0 github.com/CosmWasm/wasmd v0.44.0 github.com/CosmWasm/wasmvm v1.5.0 github.com/MakeNowJust/heredoc/v2 v2.0.1 @@ -12,7 +12,7 @@ require ( github.com/cometbft/cometbft v0.37.4 github.com/cometbft/cometbft-db v0.9.1 github.com/cosmos/cosmos-proto v1.0.0-beta.4 - github.com/cosmos/cosmos-sdk v0.47.9 + github.com/cosmos/cosmos-sdk v0.47.10 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 github.com/cosmos/ibc-go/v7 v7.3.1 @@ -184,7 +184,7 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect nhooyr.io/websocket v1.8.6 // indirect pgregory.net/rapid v1.1.0 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) replace github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 diff --git a/go.sum b/go.sum index b6544fa34..149596d2a 100644 --- a/go.sum +++ b/go.sum @@ -201,8 +201,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI= cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM= -cosmossdk.io/math v1.2.0 h1:8gudhTkkD3NxOP2YyyJIYYmt6dQ55ZfJkDOaxXpy7Ig= -cosmossdk.io/math v1.2.0/go.mod h1:l2Gnda87F0su8a/7FEKJfFdJrM0JZRXQaohlgJeyQh0= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= cosmossdk.io/tools/rosetta v0.2.1 h1:ddOMatOH+pbxWbrGJKRAawdBkPYLfKXutK9IETnjYxw= cosmossdk.io/tools/rosetta v0.2.1/go.mod h1:Pqdc1FdvkNV3LcNIkYWt2RQY6IP1ge6YWZk8MhhO9Hw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= @@ -403,8 +403,8 @@ github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cosmos/cosmos-proto v1.0.0-beta.4 h1:aEL7tU/rLOmxZQ9z4i7mzxcLbSCY48OdY7lIWTLG7oU= github.com/cosmos/cosmos-proto v1.0.0-beta.4/go.mod h1:oeB+FyVzG3XrQJbJng0EnV8Vljfk9XvTIpGILNU/9Co= -github.com/cosmos/cosmos-sdk v0.47.9 h1:D51VLkF59D53PMLsbNtp6JyWR+6MbetFyomrH88+y08= -github.com/cosmos/cosmos-sdk v0.47.9/go.mod h1:cmAawe8FV/52oPKbgeHLt4UpNkrNu8R5KD+kw0kxJFc= +github.com/cosmos/cosmos-sdk v0.47.10 h1:Wxf5yEN3jZbG4fftxAMKB6rpd8ME0mxuCVihpz65dt0= +github.com/cosmos/cosmos-sdk v0.47.10/go.mod h1:UWpgWkhcsBIATS68uUC0del7IiBN4hPv/vqg8Zz23uw= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= @@ -1944,6 +1944,6 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From 7d94d93bcb9cf7a67e757d1820ffb52498d16811 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 3 Mar 2024 13:16:59 -0700 Subject: [PATCH 62/99] chore: add back v1.0.1 files --- CHANGELOG.md | 2 +- app/upgrades.go | 4 ++-- app/upgrades/v1_0_1/constants.go | 23 +++++++++++++++++++++++ app/upgrades/v1_0_2/constants.go | 2 +- 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 app/upgrades/v1_0_1/constants.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 32e967267..27d9c02e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -88,7 +88,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Bump `github.com/cosmos/ibc-go/v7` from 7.3.0 to 7.3.1 ([#1647](https://github.com/NibiruChain/nibiru/pull/1647)) * Bump `github.com/CosmWasm/wasmd` from 0.40.2 to 0.43.0 ([#1660](https://github.com/NibiruChain/nibiru/pull/1660)) * Bump `github.com/CosmWasm/wasmd` from 0.43.0 to 0.44.0 ([#1666](https://github.com/NibiruChain/nibiru/pull/1666)) -* [#1808](https://github.com/NibiruChain/nibiru/pull/1808) - Bump `cosmos-sdk` to v0.47.9 +* [65c06ba](https://github.com/NibiruChain/nibiru/commit/65c06ba774c260ece942131ad7a93de0e162266e) - Bump `cosmos-sdk` to v0.47.10 ### Bug Fixes diff --git a/app/upgrades.go b/app/upgrades.go index 4bf9b7c20..5a57a758f 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -6,11 +6,11 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/NibiruChain/nibiru/app/upgrades" - "github.com/NibiruChain/nibiru/app/upgrades/v1_0_2" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_1" ) var Upgrades = []upgrades.Upgrade{ - v1_0_2.Upgrade, + v1_0_1.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_1/constants.go new file mode 100644 index 000000000..79444f0b5 --- /dev/null +++ b/app/upgrades/v1_0_1/constants.go @@ -0,0 +1,23 @@ +package v1_0_1 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.0.1" + +// pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{}, +} diff --git a/app/upgrades/v1_0_2/constants.go b/app/upgrades/v1_0_2/constants.go index 417e241ef..8b878729c 100644 --- a/app/upgrades/v1_0_2/constants.go +++ b/app/upgrades/v1_0_2/constants.go @@ -11,7 +11,7 @@ import ( const UpgradeName = "v1.0.2" -// pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb + cosmos-sdk +// a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { From 740f161dba1f2c0932e2f9e11596801aca0ca5bd Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Sun, 3 Mar 2024 13:19:33 -0700 Subject: [PATCH 63/99] fix: add back v1.0.2 upgrade handler --- app/upgrades.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/upgrades.go b/app/upgrades.go index 5a57a758f..e568fdfd7 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -7,10 +7,12 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades" "github.com/NibiruChain/nibiru/app/upgrades/v1_0_1" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_2" ) var Upgrades = []upgrades.Upgrade{ v1_0_1.Upgrade, + v1_0_2.Upgrade, } func (app *NibiruApp) setupUpgrades() { From 0fd5a86ff45cb8d347d9dc898d093ffeae413b5e Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Mon, 4 Mar 2024 21:01:48 +0100 Subject: [PATCH 64/99] fix: wasm ibc transaction panic (#1816) * fix wasm ibc transaction panic --- CHANGELOG.md | 7 +++++++ app/keepers.go | 29 ++++++++++++++--------------- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27d9c02e5..18823e860 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - To be defined + +### Fix + +- [#1816](https://github.com/NibiruChain/nibiru/pull/1816) - fix(ibc): fix ibc transaction from wasm contract + + ## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - 2024-02-09 ### Dependencies diff --git a/app/keepers.go b/app/keepers.go index 5b02fb860..98eff2c96 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -372,6 +372,18 @@ func (app *NibiruApp) InitKeepers( app.BankKeeper, ) + app.ibcTransferKeeper = ibctransferkeeper.NewKeeper( + appCodec, + keys[ibctransfertypes.StoreKey], + /* paramSubspace */ app.GetSubspace(ibctransfertypes.ModuleName), + /* ibctransfertypes.ICS4Wrapper */ app.ibcFeeKeeper, + /* ibctransfertypes.ChannelKeeper */ app.ibcKeeper.ChannelKeeper, + /* ibctransfertypes.PortKeeper */ &app.ibcKeeper.PortKeeper, + app.AccountKeeper, + app.BankKeeper, + app.ScopedTransferKeeper, + ) + app.ScopedWasmKeeper = app.capabilityKeeper.ScopeToModule(wasmtypes.ModuleName) wasmDir := filepath.Join(homePath, "data") @@ -441,21 +453,6 @@ func (app *NibiruApp) InitKeepers( app.slashingKeeper, ) - /* Create IBC module and a static IBC router */ - ibcRouter := porttypes.NewRouter() - - app.ibcTransferKeeper = ibctransferkeeper.NewKeeper( - appCodec, - keys[ibctransfertypes.StoreKey], - /* paramSubspace */ app.GetSubspace(ibctransfertypes.ModuleName), - /* ibctransfertypes.ICS4Wrapper */ app.ibcFeeKeeper, - /* ibctransfertypes.ChannelKeeper */ app.ibcKeeper.ChannelKeeper, - /* ibctransfertypes.PortKeeper */ &app.ibcKeeper.PortKeeper, - app.AccountKeeper, - app.BankKeeper, - app.ScopedTransferKeeper, - ) - // Mock Module setup for testing IBC and also acts as the interchain accounts authentication module // NOTE: the IBC mock keeper and application module is used only for testing core IBC. Do // not replicate if you do not need to test core IBC or light clients. @@ -472,6 +469,8 @@ func (app *NibiruApp) InitKeepers( // - IBC Fee Middleware // - Transfer + ibcRouter := porttypes.NewRouter() + // create IBC module from bottom to top of stack var transferStack porttypes.IBCModule transferStack = ibctransfer.NewIBCModule(app.ibcTransferKeeper) diff --git a/go.mod b/go.mod index f9336af85..8e96fdf73 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/cosmos/cosmos-sdk v0.47.10 github.com/cosmos/go-bip39 v1.0.0 github.com/cosmos/gogoproto v1.4.10 - github.com/cosmos/ibc-go/v7 v7.3.1 + github.com/cosmos/ibc-go/v7 v7.3.2 github.com/gogo/protobuf v1.3.3 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.3 diff --git a/go.sum b/go.sum index 149596d2a..4561cf8b0 100644 --- a/go.sum +++ b/go.sum @@ -415,8 +415,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/v7 v7.3.1 h1:bil1IjnHdyWDASFYKfwdRiNtFP6WK3osW7QFEAgU4I8= -github.com/cosmos/ibc-go/v7 v7.3.1/go.mod h1:wvx4pPBofe5ZdMNV3OFRxSI4auEP5Qfqf8JXLLNV04g= +github.com/cosmos/ibc-go/v7 v7.3.2 h1:FeUDcBX7VYY0e0iRmcVkPPUjYfAqIc//QuHXo8JHz9c= +github.com/cosmos/ibc-go/v7 v7.3.2/go.mod h1:IMeOXb7gwpZ+/nOG5BuUkdW4weM1ezvN4PQPws4uzOI= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= From 7fe566fd239c5fb1f2b8bee1d2f8dce18e9d2563 Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Tue, 5 Mar 2024 15:23:21 +0100 Subject: [PATCH 65/99] include upgrade 1.0.3 --- app/upgrades.go | 2 ++ app/upgrades/v1_0_3/constants.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 app/upgrades/v1_0_3/constants.go diff --git a/app/upgrades.go b/app/upgrades.go index e568fdfd7..68b195e0b 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -2,6 +2,7 @@ package app import ( "fmt" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_3" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" @@ -13,6 +14,7 @@ import ( var Upgrades = []upgrades.Upgrade{ v1_0_1.Upgrade, v1_0_2.Upgrade, + v1_0_3.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_0_3/constants.go b/app/upgrades/v1_0_3/constants.go new file mode 100644 index 000000000..3ec54ae30 --- /dev/null +++ b/app/upgrades/v1_0_3/constants.go @@ -0,0 +1,23 @@ +package v1_0_3 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.0.3" + +// a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{}, +} From b3936c17f398d12b1746261ee173435410ea1f0a Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Tue, 5 Mar 2024 15:58:49 +0100 Subject: [PATCH 66/99] linter --- app/upgrades.go | 1 + 1 file changed, 1 insertion(+) diff --git a/app/upgrades.go b/app/upgrades.go index 68b195e0b..a02f4c906 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -2,6 +2,7 @@ package app import ( "fmt" + "github.com/NibiruChain/nibiru/app/upgrades/v1_0_3" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" From a7b16a17bcc7db5630d9d4bc64f484fb4be69670 Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Tue, 5 Mar 2024 18:27:24 +0100 Subject: [PATCH 67/99] update and fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18823e860..e1900a150 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - To be defined +## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.3) - To be defined ### Fix From fc99cdd3a31e0fe5bf0da9c9a83ba167e3f09a69 Mon Sep 17 00:00:00 2001 From: Matthias <97468149+matthiasmatt@users.noreply.github.com> Date: Wed, 27 Dec 2023 17:28:06 +0100 Subject: [PATCH 68/99] feat: base64 decoder for cw3 wasm messages (#1731) * wip * feat: have a dirty funny looking solution * chore: changelog * fix: fix replace usage * Update cmd/nibid/cmd/decode_base64.go Co-authored-by: Kevin Yang <5478483+k-yang@users.noreply.github.com> * fix: turns out InterfaceRegistry.Resolve does the trick * chore: changelog * fix: remove unused import --------- Co-authored-by: Kevin Yang <5478483+k-yang@users.noreply.github.com> --- CHANGELOG.md | 4 + cmd/nibid/cmd/decode_base64.go | 126 ++++++++++++++++++++++++++++ cmd/nibid/cmd/decode_base64_test.go | 120 ++++++++++++++++++++++++++ cmd/nibid/cmd/root.go | 1 + 4 files changed, 251 insertions(+) create mode 100644 cmd/nibid/cmd/decode_base64.go create mode 100644 cmd/nibid/cmd/decode_base64_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index e1900a150..7df0e9215 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#1816](https://github.com/NibiruChain/nibiru/pull/1816) - fix(ibc): fix ibc transaction from wasm contract +### CLI + +* [#1731](https://github.com/NibiruChain/nibiru/pull/1731) - feat(cli): add cli command to decode stargate base64 messages + ## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - 2024-02-09 diff --git a/cmd/nibid/cmd/decode_base64.go b/cmd/nibid/cmd/decode_base64.go new file mode 100644 index 000000000..968f07679 --- /dev/null +++ b/cmd/nibid/cmd/decode_base64.go @@ -0,0 +1,126 @@ +package cmd + +import ( + "encoding/base64" + "encoding/json" + "fmt" + "strings" + + "github.com/spf13/cobra" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + sdkcodec "github.com/cosmos/cosmos-sdk/codec" + + wasmvm "github.com/CosmWasm/wasmvm/types" +) + +// YieldStargateMsgs parses the JSON and sends wasmvm.StargateMsg objects to a channel +func YieldStargateMsgs(jsonBz []byte) ([]wasmvm.StargateMsg, error) { + var data interface{} + if err := json.Unmarshal(jsonBz, &data); err != nil { + return nil, err + } + + var msgs []wasmvm.StargateMsg + parseStargateMsgs(data, &msgs) + return msgs, nil +} + +func parseStargateMsgs(jsonData any, msgs *[]wasmvm.StargateMsg) { + switch v := jsonData.(type) { + case map[string]interface{}: + if typeURL, ok := v["type_url"].(string); ok { + if value, ok := v["value"].(string); ok { + *msgs = append(*msgs, wasmvm.StargateMsg{ + TypeURL: typeURL, + Value: []byte(value), + }) + } + } + for _, value := range v { + parseStargateMsgs(value, msgs) + } + case []interface{}: + for _, value := range v { + parseStargateMsgs(value, msgs) + } + } +} + +type StargateMsgDecoded struct { + TypeURL string `json:"type_url"` + Value string `json:"value"` +} + +func DecodeBase64StargateMsgs( + jsonBz []byte, context client.Context, +) (newSgMsgs []StargateMsgDecoded, err error) { + codec := context.Codec + + var data interface{} + if err := json.Unmarshal(jsonBz, &data); err != nil { + return []StargateMsgDecoded{}, err + } + + sgMsgs, err := YieldStargateMsgs(jsonBz) + if err != nil { + return + } + for _, sgMsg := range sgMsgs { + valueStr := string(sgMsg.Value) + value := strings.Replace(string(sgMsg.Value), `\"`, `"`, -1) + value = strings.Replace(value, `"{`, `{`, -1) + value = strings.Replace(value, `}"`, `}`, -1) + + if _, err := base64.StdEncoding.DecodeString(valueStr); err == nil { + protoMsg, err := context.InterfaceRegistry.Resolve(sgMsg.TypeURL) + if err != nil { + return newSgMsgs, err + } + + decodedBz, _ := base64.StdEncoding.Strict().DecodeString(string(sgMsg.Value)) + concrete := protoMsg.(sdkcodec.ProtoMarshaler) + + err = codec.Unmarshal(decodedBz, concrete) + if err != nil { + return newSgMsgs, err + } + + outBytes, err := codec.MarshalJSON(concrete) + if err != nil { + return newSgMsgs, err + } + + newSgMsgs = append(newSgMsgs, StargateMsgDecoded{sgMsg.TypeURL, string(outBytes)}) + } else if _, err := json.Marshal(value); err == nil { + newSgMsgs = append(newSgMsgs, StargateMsgDecoded{sgMsg.TypeURL, string(sgMsg.Value)}) + } else { + return newSgMsgs, fmt.Errorf( + "parse error: encountered wasmvm.StargateMsg with unexpected format: %s", sgMsg) + } + } + return newSgMsgs, nil +} + +// DecodeBase64Cmd creates a cobra command for base64 decoding. +func DecodeBase64Cmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "base64-decode", + Short: "Decode a base64-encoded protobuf message", + Long: `Decode a base64-encoded protobuf message from JSON input. +The input should be a JSON object with 'type_url' and 'value' fields.`, + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + + outMessage, err := DecodeBase64StargateMsgs([]byte(args[0]), clientCtx) + fmt.Println(outMessage) + + return err + }, + } + + cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") + + return cmd +} diff --git a/cmd/nibid/cmd/decode_base64_test.go b/cmd/nibid/cmd/decode_base64_test.go new file mode 100644 index 000000000..c5e3c1e4e --- /dev/null +++ b/cmd/nibid/cmd/decode_base64_test.go @@ -0,0 +1,120 @@ +package cmd_test + +import ( + "context" + "testing" + + "github.com/NibiruChain/nibiru/app" + + "github.com/cometbft/cometbft/libs/log" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/server" + genutiltest "github.com/cosmos/cosmos-sdk/x/genutil/client/testutil" + "github.com/spf13/viper" + "github.com/stretchr/testify/require" + + nibid "github.com/NibiruChain/nibiru/cmd/nibid/cmd" +) + +func TestBase64Decode(t *testing.T) { + type TestCase struct { + name string + json_message string + expectError bool + } + + executeTest := func(t *testing.T, testCase TestCase) { + tc := testCase + t.Run(tc.name, func(t *testing.T) { + home := t.TempDir() + logger := log.NewNopLogger() + cfg, err := genutiltest.CreateDefaultTendermintConfig(home) + require.NoError(t, err) + + appCodec := app.MakeEncodingConfig().Marshaler + err = genutiltest.ExecInitCmd( + testModuleBasicManager, home, appCodec) + require.NoError(t, err) + + serverCtx := server.NewContext(viper.New(), cfg, logger) + clientCtx := (client.Context{}. + WithCodec(appCodec). + WithHomeDir(home). + WithInterfaceRegistry(app.MakeEncodingConfig().InterfaceRegistry)) + + ctx := context.Background() + ctx = context.WithValue(ctx, client.ClientContextKey, &clientCtx) + ctx = context.WithValue(ctx, server.ServerContextKey, serverCtx) + + cmd := nibid.DecodeBase64Cmd(home) + cmd.SetArgs([]string{ + tc.json_message, + }) + + if tc.expectError { + require.Error(t, cmd.ExecuteContext(ctx)) + } else { + require.NoError(t, cmd.ExecuteContext(ctx)) + } + }) + } + + testCases := []TestCase{ + { + name: "valid message", + json_message: ` + { + "stargate": { + "type_url": "/cosmos.staking.v1beta1.MsgUndelegate", + "value": "Cj9uaWJpMTdwOXJ6d25uZnhjanAzMnVuOXVnN3loaHpndGtodmw5amZrc3p0Z3c1dWg2OXdhYzJwZ3N5bjcwbmoSMm5pYml2YWxvcGVyMXdqNWtma25qa3BjNmpkMzByeHRtOHRweGZqZjd4cWx3eDM4YzdwGgwKBXVuaWJpEgMxMTE=" + } + }`, + expectError: false, + }, + { + name: "valid message", + json_message: ` + { + "stargate": { + "type_url": "/cosmos.staking.v1beta1.MsgUndelegate", + "value": "Cj9uaWJpMTdwOXJ6d25uZnhjanAzMnVuOXVnN3loaHpndGtodmw5amZrc3p0Z3c1dWg2OXdhYzJwZ3N5bjcwbmoSMm5pYml2YWxvcGVyMXdqNWtma25qa3BjNmpkMzByeHRtOHRweGZqZjd4cWx3eDM4YzdwGgwKBXVuaWJpEgMxMTE=" + }, + "another": { + "type_url": "/cosmos.staking.v1beta1.MsgDelegate", + "value": {"delegator_address":"cosmos1eckjje8r8s48kv0pndgtwvehveedlzlnnshl3e", "validator_address":"cosmos1n6ndsc04xh2hqf506nhvhcggj0qwguf8ks06jj", "amount":{"denom":"unibi","amount":"42"} } + } + }`, + expectError: false, + }, + { + name: "valid message", + json_message: ` + { + "another": { + "type_url": "/cosmos.staking.v1beta1.MsgDelegate", + "value": "{\"delegator_address\":\"cosmos1eckjje8r8s48kv0pndgtwvehveedlzlnnshl3e\", \"validator_address\":\"cosmos1n6ndsc04xh2hqf506nhvhcggj0qwguf8ks06jj\", \"amount\":{\"denom\":\"unibi\",\"amount\":\"42\"} }" + } + }`, + expectError: false, + }, + { + name: "empty message", + json_message: ` + { + + }`, + expectError: false, + }, + { + name: "invalid json", + json_message: ` + + }`, + expectError: true, + }, + } + + for _, testCase := range testCases { + executeTest(t, testCase) + } +} diff --git a/cmd/nibid/cmd/root.go b/cmd/nibid/cmd/root.go index 6edbc0a18..7e67c2610 100644 --- a/cmd/nibid/cmd/root.go +++ b/cmd/nibid/cmd/root.go @@ -139,6 +139,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig app.EncodingConfig) { InitCmd(app.ModuleBasics, app.DefaultNodeHome), AddGenesisAccountCmd(app.DefaultNodeHome), GetBuildWasmMsg(), + DecodeBase64Cmd(app.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), testnetCmd(app.ModuleBasics, banktypes.GenesisBalancesIterator{}), debug.Cmd(), From bb1d04027817be57dfdc562442eabb729b429125 Mon Sep 17 00:00:00 2001 From: Unique Divine <51418232+Unique-Divine@users.noreply.github.com> Date: Fri, 29 Dec 2023 16:51:33 -0600 Subject: [PATCH 69/99] refactor(decode-base64): clean code improvements and fn docs (#1754) --- CHANGELOG.md | 1 + cmd/nibid/cmd/decode_base64.go | 84 ++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7df0e9215..8382c93c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### CLI * [#1731](https://github.com/NibiruChain/nibiru/pull/1731) - feat(cli): add cli command to decode stargate base64 messages +* [#1754](https://github.com/NibiruChain/nibiru/pull/1754) - refactor(decode-base64): clean code improvements and fn docs ## [v1.0.1](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.1) - 2024-02-09 diff --git a/cmd/nibid/cmd/decode_base64.go b/cmd/nibid/cmd/decode_base64.go index 968f07679..3de3706f2 100644 --- a/cmd/nibid/cmd/decode_base64.go +++ b/cmd/nibid/cmd/decode_base64.go @@ -15,18 +15,39 @@ import ( wasmvm "github.com/CosmWasm/wasmvm/types" ) -// YieldStargateMsgs parses the JSON and sends wasmvm.StargateMsg objects to a channel -func YieldStargateMsgs(jsonBz []byte) ([]wasmvm.StargateMsg, error) { +// YieldStargateMsgs takes a byte slice of JSON data and converts it into a slice +// of wasmvm.StargateMsg objects. This function is essential for processing +// JSON-formatted messages that contain base64-encoded protobuf messages. +// +// Args: +// - jsonBz []byte: A byte slice containing the JSON data to be parsed. +// +// Returns: +// - sgMsgs []wasmvm.StargateMsg: A slice of wasmvm.StargateMsg objects parsed +// from the provided JSON data. +// - err error: An error object, which is nil if the operation is successful. +func YieldStargateMsgs(jsonBz []byte) (sgMsgs []wasmvm.StargateMsg, err error) { var data interface{} if err := json.Unmarshal(jsonBz, &data); err != nil { - return nil, err + return sgMsgs, err } - var msgs []wasmvm.StargateMsg - parseStargateMsgs(data, &msgs) - return msgs, nil + parseStargateMsgs(data, &sgMsgs) + return sgMsgs, nil } +// parseStargateMsgs is a recursive function used by YieldStargateMsgs to +// traverse the JSON data, filter for any protobuf.Any messages in the +// "WasmVM.StargateMsg" format and decode them from base64 back to human-readable +// form as JSON objects. +// +// Args: +// - jsonData any: JSON data to parse. According to the JSON specification, +// possible value types are: +// Null, Bool, Number(f64), String, Array, or Object(Map) +// - msgs *[]wasmvm.StargateMsg: Mutable reference to a slice of protobuf +// messages. These are potentially altered in place if the value is an +// encoded base 64 string. func parseStargateMsgs(jsonData any, msgs *[]wasmvm.StargateMsg) { switch v := jsonData.(type) { case map[string]interface{}: @@ -48,33 +69,51 @@ func parseStargateMsgs(jsonData any, msgs *[]wasmvm.StargateMsg) { } } +// StargateMsgDecoded is a struct designed to hold a decoded version of a +// "wasmvm.StargateMsg". type StargateMsgDecoded struct { TypeURL string `json:"type_url"` Value string `json:"value"` } +// DecodeBase64StargateMsgs decodes a series of base64-encoded +// wasmvm.StargateMsg objects from the provided JSON byte slice (jsonBz). +// This function is vital for extracting and interpreting the contents of these +// protobuf messages. +// +// Args: +// - jsonBz []byte: JSON data containing potential base64-encoded messages. +// - clientCtx client.Context: Context for the `nibid` CLI. +// +// Returns: +// - newSgMsgs []StargateMsgDecoded: The decoded stargate messages. +// - err error: An error object, which is nil if the operation is successful. func DecodeBase64StargateMsgs( - jsonBz []byte, context client.Context, + jsonBz []byte, clientCtx client.Context, ) (newSgMsgs []StargateMsgDecoded, err error) { - codec := context.Codec + codec := clientCtx.Codec var data interface{} if err := json.Unmarshal(jsonBz, &data); err != nil { - return []StargateMsgDecoded{}, err + return newSgMsgs, fmt.Errorf( + "failed to decode stargate msgs due to invalid JSON: %w", err) } sgMsgs, err := YieldStargateMsgs(jsonBz) if err != nil { - return + return newSgMsgs, err } for _, sgMsg := range sgMsgs { valueStr := string(sgMsg.Value) - value := strings.Replace(string(sgMsg.Value), `\"`, `"`, -1) - value = strings.Replace(value, `"{`, `{`, -1) - value = strings.Replace(value, `}"`, `}`, -1) + replacer := strings.NewReplacer( + `\"`, `"`, // old, new + `"{`, `{`, + `}"`, `}`, + ) + value := replacer.Replace(string(sgMsg.Value)) if _, err := base64.StdEncoding.DecodeString(valueStr); err == nil { - protoMsg, err := context.InterfaceRegistry.Resolve(sgMsg.TypeURL) + protoMsg, err := clientCtx.InterfaceRegistry.Resolve(sgMsg.TypeURL) if err != nil { return newSgMsgs, err } @@ -92,9 +131,13 @@ func DecodeBase64StargateMsgs( return newSgMsgs, err } - newSgMsgs = append(newSgMsgs, StargateMsgDecoded{sgMsg.TypeURL, string(outBytes)}) + newSgMsgs = append(newSgMsgs, + StargateMsgDecoded{sgMsg.TypeURL, string(outBytes)}, + ) } else if _, err := json.Marshal(value); err == nil { - newSgMsgs = append(newSgMsgs, StargateMsgDecoded{sgMsg.TypeURL, string(sgMsg.Value)}) + newSgMsgs = append(newSgMsgs, + StargateMsgDecoded{sgMsg.TypeURL, string(sgMsg.Value)}, + ) } else { return newSgMsgs, fmt.Errorf( "parse error: encountered wasmvm.StargateMsg with unexpected format: %s", sgMsg) @@ -103,7 +146,9 @@ func DecodeBase64StargateMsgs( return newSgMsgs, nil } -// DecodeBase64Cmd creates a cobra command for base64 decoding. +// DecodeBase64Cmd creates a Cobra command used to decode base64-encoded protobuf +// messages from a JSON input. This function enables users to input arbitrary +// JSON strings and parse the contents of base-64 encoded protobuf.Any messages. func DecodeBase64Cmd(defaultNodeHome string) *cobra.Command { cmd := &cobra.Command{ Use: "base64-decode", @@ -114,8 +159,9 @@ The input should be a JSON object with 'type_url' and 'value' fields.`, clientCtx := client.GetClientContextFromCmd(cmd) outMessage, err := DecodeBase64StargateMsgs([]byte(args[0]), clientCtx) - fmt.Println(outMessage) - + if err == nil { + fmt.Println(outMessage) + } return err }, } From 208012ca00eb1286786950d5ff6b87ecaaadddd7 Mon Sep 17 00:00:00 2001 From: Jonathan Gimeno Date: Mon, 18 Mar 2024 12:08:09 +0100 Subject: [PATCH 70/99] add date into changelog for release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8382c93c8..0bbdb8e46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.3) - To be defined +## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.3) - 2024-03-18 ### Fix From 3d72b4f3eb17fa3a3f6006b19d8e5d868f392223 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 19 Mar 2024 17:29:32 +0900 Subject: [PATCH 71/99] chore: finalize v1.1.0 changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c770c174..f3ae87cd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) +## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2024-03-19 * [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0)] * [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.1.0)] @@ -67,7 +67,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * [#1712](https://github.com/NibiruChain/nibiru/pull/1712) - refactor(inflation): turn inflation off by default * [#1792](https://github.com/NibiruChain/nibiru/pull/1792) - fix(inflation): uncomment legacy amino register on app module basic * [#1799](https://github.com/NibiruChain/nibiru/pull/1799) refactor,docs(inflation): Document everything + delete unused code. Make perp and spot optional features in localnet.sh -* [#1808](https://github.com/NibiruChain/nibiru/pull/1808) - Bump `cosmos-sdk` to v0.47.9 ## [v1.0.3](https://github.com/NibiruChain/nibiru/releases/tag/v1.0.3) - 2024-03-18 From 56f1449addaa8f096d574774b933c23c5ab52df4 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 20 Mar 2024 04:35:08 +0900 Subject: [PATCH 72/99] feat(inflation): add burn method (#1823) * feat(inflation): add burn method * Update CHANGELOG.md --- app/keepers.go | 2 +- proto/nibiru/inflation/v1/tx.proto | 31 +- x/inflation/keeper/keeper.go | 10 + x/inflation/keeper/keeper_test.go | 53 +++ x/inflation/keeper/msg_server.go | 14 + x/inflation/keeper/msg_server_test.go | 19 ++ x/inflation/types/interfaces.go | 3 + x/inflation/types/msgs.go | 58 +++- x/inflation/types/tx.pb.go | 462 +++++++++++++++++++++++--- x/inflation/types/tx.pb.gw.go | 83 +++++ 10 files changed, 678 insertions(+), 57 deletions(-) create mode 100644 x/inflation/keeper/keeper_test.go diff --git a/app/keepers.go b/app/keepers.go index 3d5734e82..c2d60e3d5 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -763,7 +763,7 @@ func ModuleAccPerms() map[string][]string { return map[string][]string{ authtypes.FeeCollectorName: nil, distrtypes.ModuleName: nil, - inflationtypes.ModuleName: {authtypes.Minter}, + inflationtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, diff --git a/proto/nibiru/inflation/v1/tx.proto b/proto/nibiru/inflation/v1/tx.proto index a63b5299d..da0a31b05 100644 --- a/proto/nibiru/inflation/v1/tx.proto +++ b/proto/nibiru/inflation/v1/tx.proto @@ -4,10 +4,10 @@ package nibiru.inflation.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; import "nibiru/inflation/v1/inflation.proto"; +import "cosmos/base/v1beta1/coin.proto"; option go_package = "github.com/NibiruChain/nibiru/x/inflation/types"; - service Msg { // ToggleInflation defines a method to enable or disable inflation. rpc ToggleInflation(MsgToggleInflation) returns (MsgToggleInflationResponse) { @@ -15,10 +15,14 @@ service Msg { }; // EditInflationParams defines a method to edit the inflation params. - rpc EditInflationParams(MsgEditInflationParams) - returns (MsgEditInflationParamsResponse) { + rpc EditInflationParams(MsgEditInflationParams) + returns (MsgEditInflationParamsResponse) { option (google.api.http).post = "/nibiru/inflation/edit-inflation-params"; - }; + }; + + rpc Burn(MsgBurn) returns (MsgBurnResponse) { + option (google.api.http).post = "/nibiru/inflation/v1/burn"; + }; } // MsgToggleInflation defines a message to enable or disable inflation. @@ -33,16 +37,16 @@ message MsgToggleInflation { message MsgEditInflationParams { option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; - + string sender = 1; bool inflation_enabled = 2; - repeated string polynomial_factors = 3[ + repeated string polynomial_factors = 3 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; InflationDistribution inflation_distribution = 4 [ (gogoproto.nullable) = true ]; - + string epochs_per_period = 5 [ (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = true @@ -57,8 +61,15 @@ message MsgEditInflationParams { ]; } -message MsgToggleInflationResponse { -} +message MsgToggleInflationResponse {} -message MsgEditInflationParamsResponse { +message MsgEditInflationParamsResponse {} + +// MsgBurn: allows burning of any token +message MsgBurn { + string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + cosmos.base.v1beta1.Coin coin = 2 + [ (gogoproto.moretags) = "yaml:\"coin\"", (gogoproto.nullable) = false ]; } + +message MsgBurnResponse {} \ No newline at end of file diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index 03327ac46..43742b843 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -89,3 +89,13 @@ func NewKeeper( func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", "x/"+types.ModuleName) } + +func (k Keeper) Burn(ctx sdk.Context, coins sdk.Coins, sender sdk.AccAddress) error { + if err := k.bankKeeper.SendCoinsFromAccountToModule( + ctx, sender, types.ModuleName, coins, + ); err != nil { + return err + } + + return k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins) +} diff --git a/x/inflation/keeper/keeper_test.go b/x/inflation/keeper/keeper_test.go new file mode 100644 index 000000000..4100e13c8 --- /dev/null +++ b/x/inflation/keeper/keeper_test.go @@ -0,0 +1,53 @@ +package keeper_test + +import ( + "fmt" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + + "github.com/NibiruChain/nibiru/x/common/testutil" + "github.com/NibiruChain/nibiru/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/x/inflation/types" +) + +func init() { + testapp.EnsureNibiruPrefix() +} + +func TestBurn(t *testing.T) { + testCases := []struct { + name string + sender sdk.AccAddress + burnCoin sdk.Coin + expectedErr error + }{ + { + name: "pass", + sender: testutil.AccAddress(), + burnCoin: sdk.NewCoin("nibiru", sdk.NewInt(100)), + expectedErr: nil, + }, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { + nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + require.NoError(t, + nibiruApp.BankKeeper.MintCoins( + ctx, types.ModuleName, sdk.NewCoins(tc.burnCoin))) + require.NoError(t, + nibiruApp.BankKeeper.SendCoinsFromModuleToAccount( + ctx, types.ModuleName, tc.sender, sdk.NewCoins(tc.burnCoin)), + ) + + // Burn coins + err := nibiruApp.InflationKeeper.Burn(ctx, sdk.NewCoins(tc.burnCoin), tc.sender) + if tc.expectedErr != nil { + require.EqualError(t, err, tc.expectedErr.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/x/inflation/keeper/msg_server.go b/x/inflation/keeper/msg_server.go index b1cc8048a..c72725bd6 100644 --- a/x/inflation/keeper/msg_server.go +++ b/x/inflation/keeper/msg_server.go @@ -46,3 +46,17 @@ func (ms msgServer) ToggleInflation( resp = &types.MsgToggleInflationResponse{} return resp, err } + +func (ms msgServer) Burn( + goCtx context.Context, msg *types.MsgBurn, +) (resp *types.MsgBurnResponse, err error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, err + } + + err = ms.Keeper.Burn(ctx, sdk.NewCoins(msg.Coin), sender) + return &types.MsgBurnResponse{}, err +} diff --git a/x/inflation/keeper/msg_server_test.go b/x/inflation/keeper/msg_server_test.go index 2f1e1483f..49cfa1620 100644 --- a/x/inflation/keeper/msg_server_test.go +++ b/x/inflation/keeper/msg_server_test.go @@ -70,3 +70,22 @@ func TestMsgEditInflationParams(t *testing.T) { params = app.InflationKeeper.GetParams(ctx) require.EqualValues(t, params.EpochsPerPeriod, 42) } + +func TestMsgBurn(t *testing.T) { + app, ctx := testapp.NewNibiruTestAppAndContext() + sender := testutil.AccAddress() + err := app.BankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) + require.NoError(t, err) + err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) + require.NoError(t, err) + + msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) + + msg := types.MsgBurn{ + Sender: sender.String(), + Coin: sdk.NewCoin("unibi", sdk.NewInt(100)), + } + + _, err = msgServer.Burn(ctx, &msg) + require.NoError(t, err) +} diff --git a/x/inflation/types/interfaces.go b/x/inflation/types/interfaces.go index 2233ac4e0..1fccafed4 100644 --- a/x/inflation/types/interfaces.go +++ b/x/inflation/types/interfaces.go @@ -21,6 +21,9 @@ type BankKeeper interface { GetAllBalances(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error SendCoinsFromModuleToModule(ctx sdk.Context, senderModule, recipientModule string, amt sdk.Coins) error + SendCoinsFromAccountToModule( + ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins, + ) error MintCoins(ctx sdk.Context, name string, amt sdk.Coins) error BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error HasSupply(ctx sdk.Context, denom string) bool diff --git a/x/inflation/types/msgs.go b/x/inflation/types/msgs.go index 18496542e..1cb387041 100644 --- a/x/inflation/types/msgs.go +++ b/x/inflation/types/msgs.go @@ -4,27 +4,30 @@ import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx" ) // ensure Msg interface compliance at compile time var ( - _ sdk.Msg = &MsgEditInflationParams{} - _ sdk.Msg = &MsgToggleInflation{} + _ legacytx.LegacyMsg = &MsgEditInflationParams{} + _ legacytx.LegacyMsg = &MsgToggleInflation{} + _ legacytx.LegacyMsg = &MsgBurn{} ) // oracle message types const ( TypeMsgEditInflationParams = "edit_inflation_params" TypeMsgToggleInflation = "toggle_inflation" + TypeMsgBurn = "msg_burn" ) -// Route implements sdk.Msg +// Route implements legacytx.LegacyMsg func (msg MsgEditInflationParams) Route() string { return RouterKey } -// Type implements sdk.Msg +// Type implements legacytx.LegacyMsg func (msg MsgEditInflationParams) Type() string { return TypeMsgEditInflationParams } -// GetSignBytes implements sdk.Msg +// GetSignBytes implements legacytx.LegacyMsg func (msg MsgEditInflationParams) GetSignBytes() []byte { return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) } @@ -75,13 +78,13 @@ func (m MsgEditInflationParams) ValidateBasic() error { // ------------------------------------------------- // MsgToggleInflation -// Route implements sdk.Msg +// Route implements legacytx.LegacyMsg func (msg MsgToggleInflation) Route() string { return RouterKey } -// Type implements sdk.Msg +// Type implements legacytx.LegacyMsg func (msg MsgToggleInflation) Type() string { return TypeMsgToggleInflation } -// GetSignBytes implements sdk.Msg +// GetSignBytes implements legacytx.LegacyMsg func (msg MsgToggleInflation) GetSignBytes() []byte { return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) } @@ -102,3 +105,42 @@ func (m MsgToggleInflation) ValidateBasic() error { } return nil } + +// ------------------------------------------------- +// MsgBurn +// Route implements legacytx.LegacyMsg +func (msg MsgBurn) Route() string { return RouterKey } + +// Type implements legacytx.LegacyMsg +func (msg MsgBurn) Type() string { return TypeMsgBurn } + +// GetSignBytes implements legacytx.LegacyMsg +func (msg MsgBurn) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) +} + +// GetSigners implements legacytx.LegacyMsg +func (msg MsgBurn) GetSigners() []sdk.AccAddress { + feeder, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + panic(err) + } + + return []sdk.AccAddress{feeder} +} + +func (m MsgBurn) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { + return err + } + + if err := m.Coin.Validate(); err != nil { + return err + } + + if m.Coin.Amount.IsZero() { + return fmt.Errorf("coin amount should not be zero") + } + + return nil +} diff --git a/x/inflation/types/tx.pb.go b/x/inflation/types/tx.pb.go index 806fe9c66..8d8a555fd 100644 --- a/x/inflation/types/tx.pb.go +++ b/x/inflation/types/tx.pb.go @@ -7,6 +7,7 @@ import ( context "context" fmt "fmt" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -184,54 +185,151 @@ func (m *MsgEditInflationParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgEditInflationParamsResponse proto.InternalMessageInfo +// MsgBurn: allows burning of any token +type MsgBurn struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Coin types.Coin `protobuf:"bytes,2,opt,name=coin,proto3" json:"coin" yaml:"coin"` +} + +func (m *MsgBurn) Reset() { *m = MsgBurn{} } +func (m *MsgBurn) String() string { return proto.CompactTextString(m) } +func (*MsgBurn) ProtoMessage() {} +func (*MsgBurn) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{4} +} +func (m *MsgBurn) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurn.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurn) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurn.Merge(m, src) +} +func (m *MsgBurn) XXX_Size() int { + return m.Size() +} +func (m *MsgBurn) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurn.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurn proto.InternalMessageInfo + +func (m *MsgBurn) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgBurn) GetCoin() types.Coin { + if m != nil { + return m.Coin + } + return types.Coin{} +} + +type MsgBurnResponse struct { +} + +func (m *MsgBurnResponse) Reset() { *m = MsgBurnResponse{} } +func (m *MsgBurnResponse) String() string { return proto.CompactTextString(m) } +func (*MsgBurnResponse) ProtoMessage() {} +func (*MsgBurnResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_9f6843f876608d76, []int{5} +} +func (m *MsgBurnResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurnResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurnResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurnResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurnResponse.Merge(m, src) +} +func (m *MsgBurnResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgBurnResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurnResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurnResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgToggleInflation)(nil), "nibiru.inflation.v1.MsgToggleInflation") proto.RegisterType((*MsgEditInflationParams)(nil), "nibiru.inflation.v1.MsgEditInflationParams") proto.RegisterType((*MsgToggleInflationResponse)(nil), "nibiru.inflation.v1.MsgToggleInflationResponse") proto.RegisterType((*MsgEditInflationParamsResponse)(nil), "nibiru.inflation.v1.MsgEditInflationParamsResponse") + proto.RegisterType((*MsgBurn)(nil), "nibiru.inflation.v1.MsgBurn") + proto.RegisterType((*MsgBurnResponse)(nil), "nibiru.inflation.v1.MsgBurnResponse") } func init() { proto.RegisterFile("nibiru/inflation/v1/tx.proto", fileDescriptor_9f6843f876608d76) } var fileDescriptor_9f6843f876608d76 = []byte{ - // 579 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x41, 0x6f, 0x12, 0x4f, - 0x18, 0xc6, 0xd9, 0xc2, 0x9f, 0x7f, 0x19, 0xa3, 0x2d, 0x53, 0x25, 0x1b, 0xc4, 0x85, 0x6c, 0x13, - 0x4b, 0x6d, 0xd8, 0x49, 0xdb, 0x5b, 0x8f, 0xd8, 0x9a, 0x70, 0xc0, 0x90, 0x8d, 0x07, 0x6d, 0x62, - 0xc8, 0xc0, 0x4e, 0x97, 0x89, 0xbb, 0x3b, 0x9b, 0x99, 0xa1, 0x81, 0xab, 0x27, 0x8f, 0x4d, 0xfc, - 0x02, 0x3d, 0xfa, 0x01, 0xfc, 0x06, 0x5e, 0x7a, 0x6c, 0xe2, 0xc5, 0x78, 0x20, 0x06, 0x3c, 0x78, - 0xf6, 0x13, 0x18, 0x76, 0x60, 0x21, 0xb2, 0x4d, 0x6c, 0x0f, 0x04, 0x66, 0x9f, 0x67, 0x7e, 0xef, - 0x33, 0xbc, 0xef, 0x2c, 0x28, 0x05, 0xb4, 0x43, 0x79, 0x1f, 0xd1, 0xe0, 0xcc, 0xc3, 0x92, 0xb2, - 0x00, 0x9d, 0xef, 0x23, 0x39, 0xb0, 0x42, 0xce, 0x24, 0x83, 0x5b, 0x4a, 0xb5, 0x62, 0xd5, 0x3a, - 0xdf, 0x2f, 0x3e, 0x74, 0x99, 0xcb, 0x22, 0x1d, 0x4d, 0x7f, 0x29, 0x6b, 0xb1, 0xe4, 0x32, 0xe6, - 0x7a, 0x04, 0xe1, 0x90, 0x22, 0x1c, 0x04, 0x4c, 0x46, 0x7e, 0x31, 0x53, 0xb7, 0x93, 0xca, 0x2c, - 0xa8, 0x91, 0xc9, 0xc4, 0x00, 0x36, 0x85, 0xfb, 0x8a, 0xb9, 0xae, 0x47, 0x1a, 0x73, 0x0d, 0x16, - 0x40, 0x56, 0x90, 0xc0, 0x21, 0x5c, 0xd7, 0x2a, 0x5a, 0x35, 0x67, 0xcf, 0x56, 0x70, 0x17, 0x64, - 0x49, 0x80, 0x3b, 0x1e, 0xd1, 0xd7, 0x2a, 0x5a, 0x75, 0xbd, 0x9e, 0xff, 0x3d, 0x2a, 0xdf, 0x1f, - 0x62, 0xdf, 0x3b, 0x32, 0xd5, 0x73, 0xd3, 0x9e, 0x19, 0x8e, 0xd6, 0x3f, 0x5c, 0x96, 0x53, 0xbf, - 0x2e, 0xcb, 0x29, 0xf3, 0x73, 0x06, 0x14, 0x9a, 0xc2, 0x3d, 0x71, 0xa8, 0x8c, 0x2b, 0xb4, 0x30, - 0xc7, 0xbe, 0xb8, 0xb1, 0xce, 0x1e, 0xc8, 0xc7, 0x41, 0xdb, 0x0a, 0xe8, 0xa8, 0x92, 0xf6, 0x66, - 0x2c, 0x9c, 0xa8, 0xe7, 0xf0, 0x2d, 0x80, 0x21, 0xf3, 0x86, 0x01, 0xf3, 0x29, 0xf6, 0xda, 0x67, - 0xb8, 0x2b, 0x19, 0x17, 0x7a, 0xba, 0x92, 0xae, 0xe6, 0xea, 0xd6, 0xd5, 0xa8, 0xac, 0x7d, 0x1f, - 0x95, 0x9f, 0xba, 0x54, 0xf6, 0xfa, 0x1d, 0xab, 0xcb, 0x7c, 0xd4, 0x65, 0xc2, 0x67, 0x62, 0xf6, - 0x55, 0x13, 0xce, 0x3b, 0x24, 0x87, 0x21, 0x11, 0xd6, 0x31, 0xe9, 0xda, 0xf9, 0x05, 0xe9, 0x85, - 0x02, 0x41, 0x17, 0x14, 0x16, 0x59, 0x1c, 0x2a, 0x24, 0xa7, 0x9d, 0xfe, 0x74, 0xa1, 0x67, 0x2a, - 0x5a, 0xf5, 0xde, 0xc1, 0x33, 0x2b, 0xa1, 0x61, 0x56, 0x7c, 0xd2, 0xe3, 0xa5, 0x1d, 0xf5, 0xcc, - 0x34, 0x8e, 0xfd, 0x88, 0x26, 0x89, 0xf0, 0x14, 0xe4, 0x49, 0xc8, 0xba, 0x3d, 0xd1, 0x0e, 0x09, - 0x9f, 0x7e, 0x28, 0x73, 0xf4, 0xff, 0xa6, 0xff, 0xcb, 0xad, 0x8e, 0xd1, 0x08, 0xa4, 0xbd, 0xa1, - 0x40, 0x2d, 0xc2, 0x5b, 0x11, 0x06, 0xbe, 0x06, 0x9b, 0x0a, 0xa8, 0xe0, 0x43, 0x82, 0xb9, 0x9e, - 0xbd, 0x13, 0xfa, 0xc1, 0x8c, 0xd3, 0x22, 0xfc, 0x0d, 0xc1, 0x1c, 0x36, 0x01, 0xf0, 0xf1, 0x60, - 0x1e, 0xf7, 0xff, 0x3b, 0x31, 0x73, 0x3e, 0x1e, 0xa8, 0xa0, 0x4b, 0x63, 0x53, 0x02, 0xc5, 0xd5, - 0xc9, 0xb4, 0x89, 0x08, 0x59, 0x20, 0x88, 0x59, 0x01, 0x46, 0xf2, 0x4c, 0xcd, 0x1d, 0x07, 0x5f, - 0xd6, 0x40, 0xba, 0x29, 0x5c, 0x78, 0xa1, 0x81, 0x8d, 0xbf, 0xe7, 0x7b, 0x27, 0xb1, 0x67, 0xab, - 0xe5, 0x8a, 0xe8, 0x1f, 0x8d, 0x71, 0xae, 0xed, 0xf7, 0x5f, 0x7f, 0x7e, 0x5c, 0x7b, 0x62, 0x3e, - 0x46, 0x89, 0x97, 0x3c, 0xda, 0x05, 0x3f, 0x69, 0x60, 0x2b, 0xe9, 0x3a, 0xec, 0xdd, 0x54, 0x2d, - 0xc1, 0x5c, 0x3c, 0xbc, 0x85, 0x39, 0x8e, 0x87, 0xa2, 0x78, 0xbb, 0xe6, 0xce, 0x6a, 0x3c, 0xe2, - 0x50, 0x59, 0x8b, 0x97, 0xb5, 0x30, 0xda, 0x58, 0x6f, 0x5c, 0x8d, 0x0d, 0xed, 0x7a, 0x6c, 0x68, - 0x3f, 0xc6, 0x86, 0x76, 0x31, 0x31, 0x52, 0xd7, 0x13, 0x23, 0xf5, 0x6d, 0x62, 0xa4, 0x4e, 0xd1, - 0x52, 0x73, 0x5f, 0x46, 0xb0, 0xe7, 0x3d, 0x4c, 0x83, 0x39, 0x78, 0xb0, 0x84, 0x8e, 0x3a, 0xdd, - 0xc9, 0x46, 0x6f, 0x9c, 0xc3, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb3, 0x1b, 0xc3, 0x86, 0xff, - 0x04, 0x00, 0x00, + // 686 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x31, 0x4f, 0xdb, 0x4e, + 0x1c, 0x8d, 0x49, 0xfe, 0x01, 0x0e, 0xfd, 0x0b, 0x31, 0x2d, 0x0a, 0x21, 0xb5, 0x53, 0x53, 0x95, + 0x50, 0x84, 0x4f, 0x81, 0x8d, 0xd1, 0x40, 0x25, 0x86, 0x54, 0x91, 0xd5, 0xa1, 0x45, 0xaa, 0xd0, + 0x39, 0x3e, 0xcc, 0xa9, 0xf6, 0x9d, 0x75, 0xe7, 0xa0, 0x64, 0xed, 0xd4, 0x11, 0xa9, 0x5f, 0x80, + 0xb1, 0x73, 0xd5, 0x0f, 0xc1, 0x88, 0xd4, 0xa5, 0xea, 0x10, 0x55, 0xd0, 0xa1, 0x33, 0x9f, 0xa0, + 0xb2, 0xcf, 0x31, 0x51, 0x31, 0x55, 0x61, 0x88, 0xe2, 0xbb, 0xf7, 0xfb, 0xbd, 0xf7, 0xee, 0xfc, + 0x7e, 0x06, 0x75, 0x4a, 0x1c, 0xc2, 0x7b, 0x90, 0xd0, 0x43, 0x1f, 0x45, 0x84, 0x51, 0x78, 0xdc, + 0x82, 0x51, 0xdf, 0x0c, 0x39, 0x8b, 0x98, 0x3a, 0x2f, 0x51, 0x33, 0x43, 0xcd, 0xe3, 0x56, 0xed, + 0xa1, 0xc7, 0x3c, 0x96, 0xe0, 0x30, 0x7e, 0x92, 0xa5, 0xb5, 0xba, 0xc7, 0x98, 0xe7, 0x63, 0x88, + 0x42, 0x02, 0x11, 0xa5, 0x2c, 0x4a, 0xea, 0x45, 0x8a, 0x2e, 0xe7, 0xc9, 0x5c, 0xb3, 0xca, 0x22, + 0xad, 0xcb, 0x44, 0xc0, 0x04, 0x74, 0x90, 0xc0, 0xf0, 0xb8, 0xe5, 0xe0, 0x08, 0xb5, 0x60, 0x97, + 0x91, 0x14, 0x37, 0x10, 0x50, 0xdb, 0xc2, 0x7b, 0xc5, 0x3c, 0xcf, 0xc7, 0x7b, 0xa3, 0x5e, 0x75, + 0x01, 0x94, 0x05, 0xa6, 0x2e, 0xe6, 0x55, 0xa5, 0xa1, 0x34, 0xa7, 0xed, 0x74, 0xa5, 0xae, 0x82, + 0x32, 0xa6, 0xc8, 0xf1, 0x71, 0x75, 0xa2, 0xa1, 0x34, 0xa7, 0xac, 0xca, 0xd5, 0x50, 0xff, 0x7f, + 0x80, 0x02, 0x7f, 0xcb, 0x90, 0xfb, 0x86, 0x9d, 0x16, 0x6c, 0x4d, 0x7d, 0x38, 0xd5, 0x0b, 0xbf, + 0x4e, 0xf5, 0x82, 0xf1, 0xa5, 0x04, 0x16, 0xda, 0xc2, 0xdb, 0x75, 0x49, 0x94, 0x29, 0x74, 0x10, + 0x47, 0x81, 0xb8, 0x55, 0x67, 0x0d, 0x54, 0xb2, 0x83, 0x1c, 0x48, 0x42, 0x57, 0x4a, 0xda, 0x73, + 0x19, 0xb0, 0x2b, 0xf7, 0xd5, 0xb7, 0x40, 0x0d, 0x99, 0x3f, 0xa0, 0x2c, 0x20, 0xc8, 0x3f, 0x38, + 0x44, 0xdd, 0x88, 0x71, 0x51, 0x2d, 0x36, 0x8a, 0xcd, 0x69, 0xcb, 0x3c, 0x1b, 0xea, 0xca, 0xf7, + 0xa1, 0xfe, 0xcc, 0x23, 0xd1, 0x51, 0xcf, 0x31, 0xbb, 0x2c, 0x80, 0xe9, 0x8d, 0xc8, 0xbf, 0x75, + 0xe1, 0xbe, 0x83, 0xd1, 0x20, 0xc4, 0xc2, 0xdc, 0xc1, 0x5d, 0xbb, 0x72, 0xcd, 0xf4, 0x42, 0x12, + 0xa9, 0x1e, 0x58, 0xb8, 0xf6, 0xe2, 0x12, 0x11, 0x71, 0xe2, 0xf4, 0xe2, 0x45, 0xb5, 0xd4, 0x50, + 0x9a, 0x33, 0x1b, 0xcf, 0xcd, 0x9c, 0x17, 0x6a, 0x66, 0x27, 0xdd, 0x19, 0xeb, 0xb0, 0x4a, 0xb1, + 0x1d, 0xfb, 0x11, 0xc9, 0x03, 0xd5, 0x7d, 0x50, 0xc1, 0x21, 0xeb, 0x1e, 0x89, 0x83, 0x10, 0xf3, + 0xf8, 0x47, 0x98, 0x5b, 0xfd, 0x2f, 0xbe, 0x97, 0x3b, 0x1d, 0x63, 0x8f, 0x46, 0xf6, 0xac, 0x24, + 0xea, 0x60, 0xde, 0x49, 0x68, 0xd4, 0xd7, 0x60, 0x4e, 0x12, 0x4a, 0xf2, 0x01, 0x46, 0xbc, 0x5a, + 0xbe, 0x17, 0xf5, 0x83, 0x94, 0xa7, 0x83, 0xf9, 0x1b, 0x8c, 0xb8, 0xda, 0x06, 0x20, 0x40, 0xfd, + 0x91, 0xdd, 0xc9, 0x7b, 0x71, 0x4e, 0x07, 0xa8, 0x2f, 0x8d, 0x8e, 0xc5, 0xa6, 0x0e, 0x6a, 0x37, + 0x93, 0x69, 0x63, 0x11, 0x32, 0x2a, 0xb0, 0xd1, 0x00, 0x5a, 0x7e, 0xa6, 0xb2, 0x8a, 0x3e, 0x98, + 0x6c, 0x0b, 0xcf, 0xea, 0x71, 0x1a, 0xc7, 0x76, 0x3c, 0x66, 0xe3, 0xb1, 0x95, 0xfb, 0x46, 0x96, + 0x3c, 0x0b, 0x94, 0xe2, 0xe9, 0x48, 0xc2, 0x36, 0xb3, 0xb1, 0x68, 0x4a, 0xbf, 0x66, 0x3c, 0x3e, + 0x66, 0x3a, 0x3e, 0xe6, 0x36, 0x23, 0xd4, 0x9a, 0x3f, 0x1b, 0xea, 0x85, 0xab, 0xa1, 0x3e, 0x23, + 0x79, 0xe2, 0x26, 0xc3, 0x4e, 0x7a, 0x8d, 0x0a, 0x98, 0x4d, 0x95, 0x47, 0x66, 0x36, 0x3e, 0x17, + 0x41, 0xb1, 0x2d, 0x3c, 0xf5, 0x44, 0x01, 0xb3, 0x7f, 0x0e, 0xdb, 0x4a, 0x6e, 0x80, 0x6e, 0x9e, + 0xbd, 0x06, 0xff, 0xb1, 0x30, 0xbb, 0x82, 0xe5, 0xf7, 0x5f, 0x7f, 0x7e, 0x9c, 0x78, 0x6c, 0x2c, + 0xc1, 0xdc, 0x2f, 0x52, 0xd2, 0xa5, 0x7e, 0x52, 0xc0, 0x7c, 0xde, 0x6c, 0xae, 0xdd, 0xa6, 0x96, + 0x53, 0x5c, 0xdb, 0xbc, 0x43, 0x71, 0x66, 0x0f, 0x26, 0xf6, 0x56, 0x8d, 0x95, 0x9b, 0xf6, 0xb0, + 0x4b, 0xa2, 0xf5, 0x6c, 0xb9, 0x1e, 0x4a, 0x4b, 0x01, 0x28, 0x25, 0xef, 0xb3, 0x7e, 0x9b, 0x5a, + 0x8c, 0xd6, 0x9e, 0xfe, 0x0d, 0xcd, 0xc4, 0x9f, 0x24, 0xe2, 0x4b, 0xc6, 0x62, 0xee, 0xdd, 0x38, + 0x3d, 0x4e, 0xad, 0xbd, 0xb3, 0x0b, 0x4d, 0x39, 0xbf, 0xd0, 0x94, 0x1f, 0x17, 0x9a, 0x72, 0x72, + 0xa9, 0x15, 0xce, 0x2f, 0xb5, 0xc2, 0xb7, 0x4b, 0xad, 0xb0, 0x0f, 0xc7, 0x82, 0xfd, 0x32, 0x69, + 0xdf, 0x3e, 0x42, 0x84, 0x8e, 0xa8, 0xfa, 0x63, 0x64, 0x49, 0xca, 0x9d, 0x72, 0xf2, 0xb5, 0xdd, + 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xc6, 0x47, 0x4d, 0x1b, 0x06, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -250,6 +348,7 @@ type MsgClient interface { ToggleInflation(ctx context.Context, in *MsgToggleInflation, opts ...grpc.CallOption) (*MsgToggleInflationResponse, error) // EditInflationParams defines a method to edit the inflation params. EditInflationParams(ctx context.Context, in *MsgEditInflationParams, opts ...grpc.CallOption) (*MsgEditInflationParamsResponse, error) + Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) } type msgClient struct { @@ -278,12 +377,22 @@ func (c *msgClient) EditInflationParams(ctx context.Context, in *MsgEditInflatio return out, nil } +func (c *msgClient) Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) { + out := new(MsgBurnResponse) + err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Msg/Burn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // ToggleInflation defines a method to enable or disable inflation. ToggleInflation(context.Context, *MsgToggleInflation) (*MsgToggleInflationResponse, error) // EditInflationParams defines a method to edit the inflation params. EditInflationParams(context.Context, *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) + Burn(context.Context, *MsgBurn) (*MsgBurnResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -296,6 +405,9 @@ func (*UnimplementedMsgServer) ToggleInflation(ctx context.Context, req *MsgTogg func (*UnimplementedMsgServer) EditInflationParams(ctx context.Context, req *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EditInflationParams not implemented") } +func (*UnimplementedMsgServer) Burn(ctx context.Context, req *MsgBurn) (*MsgBurnResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Burn not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -337,6 +449,24 @@ func _Msg_EditInflationParams_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Msg_Burn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgBurn) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).Burn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.inflation.v1.Msg/Burn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).Burn(ctx, req.(*MsgBurn)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "nibiru.inflation.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -349,6 +479,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "EditInflationParams", Handler: _Msg_EditInflationParams_Handler, }, + { + MethodName: "Burn", + Handler: _Msg_Burn_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "nibiru/inflation/v1/tx.proto", @@ -542,6 +676,69 @@ func (m *MsgEditInflationParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *MsgBurn) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurn) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurn) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgBurnResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurnResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurnResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -625,6 +822,30 @@ func (m *MsgEditInflationParamsResponse) Size() (n int) { return n } +func (m *MsgBurn) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Coin.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgBurnResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1115,6 +1336,171 @@ func (m *MsgEditInflationParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgBurn) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgBurn: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurn: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBurnResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgBurnResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurnResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/inflation/types/tx.pb.gw.go b/x/inflation/types/tx.pb.gw.go index 0d122966c..0a75000c6 100644 --- a/x/inflation/types/tx.pb.gw.go +++ b/x/inflation/types/tx.pb.gw.go @@ -105,6 +105,42 @@ func local_request_Msg_EditInflationParams_0(ctx context.Context, marshaler runt } +var ( + filter_Msg_Burn_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Msg_Burn_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgBurn + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Burn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.Burn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Msg_Burn_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq MsgBurn + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Burn_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.Burn(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". // UnaryRPC :call MsgServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -157,6 +193,29 @@ func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) + mux.Handle("POST", pattern_Msg_Burn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Msg_Burn_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_Burn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -238,6 +297,26 @@ func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_Msg_Burn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Msg_Burn_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Msg_Burn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -245,10 +324,14 @@ var ( pattern_Msg_ToggleInflation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "toggle"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Msg_EditInflationParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "inflation", "edit-inflation-params"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Msg_Burn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "burn"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( forward_Msg_ToggleInflation_0 = runtime.ForwardResponseMessage forward_Msg_EditInflationParams_0 = runtime.ForwardResponseMessage + + forward_Msg_Burn_0 = runtime.ForwardResponseMessage ) From 9178e4f7d5eb28302106be92d5dd33d50dbef9f2 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:51:55 +0900 Subject: [PATCH 73/99] chore: fix changelog (#1824) From 28882810c1941e853c255c57843015a501c85583 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:09:51 +0900 Subject: [PATCH 74/99] test(inflation): add additional burn test cases (#1828) * test(inflation): add negative burn tests * test(inflation): add total supply check to burn tests --- x/inflation/keeper/keeper_test.go | 24 +++++++++++++++++++++--- x/inflation/keeper/msg_server_test.go | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/x/inflation/keeper/keeper_test.go b/x/inflation/keeper/keeper_test.go index 4100e13c8..391efe14f 100644 --- a/x/inflation/keeper/keeper_test.go +++ b/x/inflation/keeper/keeper_test.go @@ -20,33 +20,51 @@ func TestBurn(t *testing.T) { testCases := []struct { name string sender sdk.AccAddress + mintCoin sdk.Coin burnCoin sdk.Coin expectedErr error }{ { name: "pass", sender: testutil.AccAddress(), - burnCoin: sdk.NewCoin("nibiru", sdk.NewInt(100)), + mintCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), + burnCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), expectedErr: nil, }, + { + name: "not enough coins", + sender: testutil.AccAddress(), + mintCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), + burnCoin: sdk.NewCoin("unibi", sdk.NewInt(101)), + expectedErr: fmt.Errorf("spendable balance 100unibi is smaller than 101unibi: insufficient funds"), + }, } + for _, tc := range testCases { t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() + + // mint and send money to the sender require.NoError(t, nibiruApp.BankKeeper.MintCoins( - ctx, types.ModuleName, sdk.NewCoins(tc.burnCoin))) + ctx, types.ModuleName, sdk.NewCoins(tc.mintCoin))) require.NoError(t, nibiruApp.BankKeeper.SendCoinsFromModuleToAccount( - ctx, types.ModuleName, tc.sender, sdk.NewCoins(tc.burnCoin)), + ctx, types.ModuleName, tc.sender, sdk.NewCoins(tc.mintCoin)), ) + supply := nibiruApp.BankKeeper.GetSupply(ctx, "unibi") + require.Equal(t, tc.mintCoin.Amount, supply.Amount) + // Burn coins err := nibiruApp.InflationKeeper.Burn(ctx, sdk.NewCoins(tc.burnCoin), tc.sender) + supply = nibiruApp.BankKeeper.GetSupply(ctx, "unibi") if tc.expectedErr != nil { require.EqualError(t, err, tc.expectedErr.Error()) + require.Equal(t, tc.mintCoin.Amount, supply.Amount) } else { require.NoError(t, err) + require.Equal(t, sdk.ZeroInt(), supply.Amount) } }) } diff --git a/x/inflation/keeper/msg_server_test.go b/x/inflation/keeper/msg_server_test.go index 49cfa1620..cc37a97a3 100644 --- a/x/inflation/keeper/msg_server_test.go +++ b/x/inflation/keeper/msg_server_test.go @@ -88,4 +88,27 @@ func TestMsgBurn(t *testing.T) { _, err = msgServer.Burn(ctx, &msg) require.NoError(t, err) + supply := app.BankKeeper.GetSupply(ctx, "unibi") + require.Equal(t, sdk.ZeroInt(), supply.Amount) +} + +func TestMsgBurn_NotEnoughCoins(t *testing.T) { + app, ctx := testapp.NewNibiruTestAppAndContext() + sender := testutil.AccAddress() + err := app.BankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) + require.NoError(t, err) + err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) + require.NoError(t, err) + + msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) + + msg := types.MsgBurn{ + Sender: sender.String(), + Coin: sdk.NewCoin("unibi", sdk.NewInt(101)), + } + + _, err = msgServer.Burn(ctx, &msg) + require.EqualError(t, err, "spendable balance 100unibi is smaller than 101unibi: insufficient funds") + supply := app.BankKeeper.GetSupply(ctx, "unibi") + require.Equal(t, sdk.NewInt(100), supply.Amount) } From 7d86138b60bb644f03f5e9ffffc4d91690682902 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:22:01 +0900 Subject: [PATCH 75/99] Update CHANGELOG.md --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3ae87cd9..24aca4848 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,8 +40,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.2.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.2.0) - 2024-03-28 + +Nibiru v1.2.0 adds a burn method to the x/inflation module that allows senders to burn tokens. + +* [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.2.0)] +* [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.2.0)] + +### Features + +* [#1823](https://github.com/NibiruChain/nibiru/pull/1823) - feat(inflation): add burn method + ## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2024-03-19 +Nibiru v1.1.0 is the minor release that adds inflation to the network. + * [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0)] * [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.1.0)] From b210bf445a0ded7ef28025c49b34a87c9d3bef59 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:17:17 +0900 Subject: [PATCH 76/99] feat(tokenfactory): burn native method (#1832) * refactor: move Burn rpc method to x/tokenfactory * Update tx_msgs.go * feat: add burn native method to tokenfactory msg server * feat: add cli cmd * fix: validate msg * feat: add v1.2.0 upgrade handler * Update CHANGELOG.md * fix: register codec for MsgBurnNative * fix: test --------- Co-authored-by: Unique-Divine --- CHANGELOG.md | 2 +- app/upgrades.go | 2 + app/upgrades/v1_2_0/constants.go | 22 + proto/nibiru/inflation/v1/tx.proto | 4 - proto/nibiru/tokenfactory/v1/tx.proto | 12 + x/inflation/keeper/msg_server.go | 14 - x/inflation/keeper/msg_server_test.go | 42 -- x/inflation/types/tx.pb.go | 123 ++---- x/inflation/types/tx.pb.gw.go | 83 ---- x/tokenfactory/cli/tx.go | 48 ++- x/tokenfactory/keeper/keeper_test.go | 2 + x/tokenfactory/keeper/msg_server.go | 26 ++ x/tokenfactory/keeper/msg_server_test.go | 87 ++++ x/tokenfactory/types/codec.go | 2 + x/tokenfactory/types/tx.pb.go | 485 ++++++++++++++++++++--- x/tokenfactory/types/tx_msgs.go | 109 ++++- 16 files changed, 769 insertions(+), 294 deletions(-) create mode 100644 app/upgrades/v1_2_0/constants.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 24aca4848..453563d1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,7 @@ Nibiru v1.2.0 adds a burn method to the x/inflation module that allows senders t ### Features -* [#1823](https://github.com/NibiruChain/nibiru/pull/1823) - feat(inflation): add burn method +* [#1832](https://github.com/NibiruChain/nibiru/pull/1832) - feat(tokenfactory): add burn method for native tokens ## [v1.1.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.1.0) - 2024-03-19 diff --git a/app/upgrades.go b/app/upgrades.go index 6f7bca04a..68afbc057 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -11,6 +11,7 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades/v1_0_1" "github.com/NibiruChain/nibiru/app/upgrades/v1_0_2" "github.com/NibiruChain/nibiru/app/upgrades/v1_1_0" + "github.com/NibiruChain/nibiru/app/upgrades/v1_2_0" ) var Upgrades = []upgrades.Upgrade{ @@ -18,6 +19,7 @@ var Upgrades = []upgrades.Upgrade{ v1_0_2.Upgrade, v1_0_3.Upgrade, v1_1_0.Upgrade, + v1_2_0.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_2_0/constants.go b/app/upgrades/v1_2_0/constants.go new file mode 100644 index 000000000..fea9289a7 --- /dev/null +++ b/app/upgrades/v1_2_0/constants.go @@ -0,0 +1,22 @@ +package v1_2_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.2.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{}, +} diff --git a/proto/nibiru/inflation/v1/tx.proto b/proto/nibiru/inflation/v1/tx.proto index da0a31b05..36626a3f9 100644 --- a/proto/nibiru/inflation/v1/tx.proto +++ b/proto/nibiru/inflation/v1/tx.proto @@ -19,10 +19,6 @@ service Msg { returns (MsgEditInflationParamsResponse) { option (google.api.http).post = "/nibiru/inflation/edit-inflation-params"; }; - - rpc Burn(MsgBurn) returns (MsgBurnResponse) { - option (google.api.http).post = "/nibiru/inflation/v1/burn"; - }; } // MsgToggleInflation defines a message to enable or disable inflation. diff --git a/proto/nibiru/tokenfactory/v1/tx.proto b/proto/nibiru/tokenfactory/v1/tx.proto index d62246753..8f984d17b 100644 --- a/proto/nibiru/tokenfactory/v1/tx.proto +++ b/proto/nibiru/tokenfactory/v1/tx.proto @@ -24,6 +24,9 @@ service Msg { rpc Burn(MsgBurn) returns (MsgBurnResponse); rpc SetDenomMetadata(MsgSetDenomMetadata) returns (MsgSetDenomMetadataResponse); + + // burns a native token such as unibi + rpc BurnNative(MsgBurnNative) returns (MsgBurnNativeResponse) {}; } // MsgCreateDenom: sdk.Msg that registers an a token factory denom. @@ -114,3 +117,12 @@ message MsgSetDenomMetadata { } message MsgSetDenomMetadataResponse {} + +// Burn a native token such as unibi +message MsgBurnNative { + string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + cosmos.base.v1beta1.Coin coin = 2 + [ (gogoproto.moretags) = "yaml:\"coin\"", (gogoproto.nullable) = false ]; +} + +message MsgBurnNativeResponse {} \ No newline at end of file diff --git a/x/inflation/keeper/msg_server.go b/x/inflation/keeper/msg_server.go index c72725bd6..b1cc8048a 100644 --- a/x/inflation/keeper/msg_server.go +++ b/x/inflation/keeper/msg_server.go @@ -46,17 +46,3 @@ func (ms msgServer) ToggleInflation( resp = &types.MsgToggleInflationResponse{} return resp, err } - -func (ms msgServer) Burn( - goCtx context.Context, msg *types.MsgBurn, -) (resp *types.MsgBurnResponse, err error) { - ctx := sdk.UnwrapSDKContext(goCtx) - - sender, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - return nil, err - } - - err = ms.Keeper.Burn(ctx, sdk.NewCoins(msg.Coin), sender) - return &types.MsgBurnResponse{}, err -} diff --git a/x/inflation/keeper/msg_server_test.go b/x/inflation/keeper/msg_server_test.go index cc37a97a3..2f1e1483f 100644 --- a/x/inflation/keeper/msg_server_test.go +++ b/x/inflation/keeper/msg_server_test.go @@ -70,45 +70,3 @@ func TestMsgEditInflationParams(t *testing.T) { params = app.InflationKeeper.GetParams(ctx) require.EqualValues(t, params.EpochsPerPeriod, 42) } - -func TestMsgBurn(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - sender := testutil.AccAddress() - err := app.BankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) - require.NoError(t, err) - err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) - require.NoError(t, err) - - msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) - - msg := types.MsgBurn{ - Sender: sender.String(), - Coin: sdk.NewCoin("unibi", sdk.NewInt(100)), - } - - _, err = msgServer.Burn(ctx, &msg) - require.NoError(t, err) - supply := app.BankKeeper.GetSupply(ctx, "unibi") - require.Equal(t, sdk.ZeroInt(), supply.Amount) -} - -func TestMsgBurn_NotEnoughCoins(t *testing.T) { - app, ctx := testapp.NewNibiruTestAppAndContext() - sender := testutil.AccAddress() - err := app.BankKeeper.MintCoins(ctx, types.ModuleName, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) - require.NoError(t, err) - err = app.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, sender, sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(100)))) - require.NoError(t, err) - - msgServer := keeper.NewMsgServerImpl(app.InflationKeeper) - - msg := types.MsgBurn{ - Sender: sender.String(), - Coin: sdk.NewCoin("unibi", sdk.NewInt(101)), - } - - _, err = msgServer.Burn(ctx, &msg) - require.EqualError(t, err, "spendable balance 100unibi is smaller than 101unibi: insufficient funds") - supply := app.BankKeeper.GetSupply(ctx, "unibi") - require.Equal(t, sdk.NewInt(100), supply.Amount) -} diff --git a/x/inflation/types/tx.pb.go b/x/inflation/types/tx.pb.go index 8d8a555fd..ab332dea7 100644 --- a/x/inflation/types/tx.pb.go +++ b/x/inflation/types/tx.pb.go @@ -286,50 +286,49 @@ func init() { func init() { proto.RegisterFile("nibiru/inflation/v1/tx.proto", fileDescriptor_9f6843f876608d76) } var fileDescriptor_9f6843f876608d76 = []byte{ - // 686 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x31, 0x4f, 0xdb, 0x4e, - 0x1c, 0x8d, 0x49, 0xfe, 0x01, 0x0e, 0xfd, 0x0b, 0x31, 0x2d, 0x0a, 0x21, 0xb5, 0x53, 0x53, 0x95, - 0x50, 0x84, 0x4f, 0x81, 0x8d, 0xd1, 0x40, 0x25, 0x86, 0x54, 0x91, 0xd5, 0xa1, 0x45, 0xaa, 0xd0, - 0x39, 0x3e, 0xcc, 0xa9, 0xf6, 0x9d, 0x75, 0xe7, 0xa0, 0x64, 0xed, 0xd4, 0x11, 0xa9, 0x5f, 0x80, - 0xb1, 0x73, 0xd5, 0x0f, 0xc1, 0x88, 0xd4, 0xa5, 0xea, 0x10, 0x55, 0xd0, 0xa1, 0x33, 0x9f, 0xa0, - 0xb2, 0xcf, 0x31, 0x51, 0x31, 0x55, 0x61, 0x88, 0xe2, 0xbb, 0xf7, 0xfb, 0xbd, 0xf7, 0xee, 0xfc, - 0x7e, 0x06, 0x75, 0x4a, 0x1c, 0xc2, 0x7b, 0x90, 0xd0, 0x43, 0x1f, 0x45, 0x84, 0x51, 0x78, 0xdc, - 0x82, 0x51, 0xdf, 0x0c, 0x39, 0x8b, 0x98, 0x3a, 0x2f, 0x51, 0x33, 0x43, 0xcd, 0xe3, 0x56, 0xed, - 0xa1, 0xc7, 0x3c, 0x96, 0xe0, 0x30, 0x7e, 0x92, 0xa5, 0xb5, 0xba, 0xc7, 0x98, 0xe7, 0x63, 0x88, - 0x42, 0x02, 0x11, 0xa5, 0x2c, 0x4a, 0xea, 0x45, 0x8a, 0x2e, 0xe7, 0xc9, 0x5c, 0xb3, 0xca, 0x22, - 0xad, 0xcb, 0x44, 0xc0, 0x04, 0x74, 0x90, 0xc0, 0xf0, 0xb8, 0xe5, 0xe0, 0x08, 0xb5, 0x60, 0x97, - 0x91, 0x14, 0x37, 0x10, 0x50, 0xdb, 0xc2, 0x7b, 0xc5, 0x3c, 0xcf, 0xc7, 0x7b, 0xa3, 0x5e, 0x75, - 0x01, 0x94, 0x05, 0xa6, 0x2e, 0xe6, 0x55, 0xa5, 0xa1, 0x34, 0xa7, 0xed, 0x74, 0xa5, 0xae, 0x82, - 0x32, 0xa6, 0xc8, 0xf1, 0x71, 0x75, 0xa2, 0xa1, 0x34, 0xa7, 0xac, 0xca, 0xd5, 0x50, 0xff, 0x7f, - 0x80, 0x02, 0x7f, 0xcb, 0x90, 0xfb, 0x86, 0x9d, 0x16, 0x6c, 0x4d, 0x7d, 0x38, 0xd5, 0x0b, 0xbf, - 0x4e, 0xf5, 0x82, 0xf1, 0xa5, 0x04, 0x16, 0xda, 0xc2, 0xdb, 0x75, 0x49, 0x94, 0x29, 0x74, 0x10, - 0x47, 0x81, 0xb8, 0x55, 0x67, 0x0d, 0x54, 0xb2, 0x83, 0x1c, 0x48, 0x42, 0x57, 0x4a, 0xda, 0x73, - 0x19, 0xb0, 0x2b, 0xf7, 0xd5, 0xb7, 0x40, 0x0d, 0x99, 0x3f, 0xa0, 0x2c, 0x20, 0xc8, 0x3f, 0x38, - 0x44, 0xdd, 0x88, 0x71, 0x51, 0x2d, 0x36, 0x8a, 0xcd, 0x69, 0xcb, 0x3c, 0x1b, 0xea, 0xca, 0xf7, - 0xa1, 0xfe, 0xcc, 0x23, 0xd1, 0x51, 0xcf, 0x31, 0xbb, 0x2c, 0x80, 0xe9, 0x8d, 0xc8, 0xbf, 0x75, - 0xe1, 0xbe, 0x83, 0xd1, 0x20, 0xc4, 0xc2, 0xdc, 0xc1, 0x5d, 0xbb, 0x72, 0xcd, 0xf4, 0x42, 0x12, - 0xa9, 0x1e, 0x58, 0xb8, 0xf6, 0xe2, 0x12, 0x11, 0x71, 0xe2, 0xf4, 0xe2, 0x45, 0xb5, 0xd4, 0x50, - 0x9a, 0x33, 0x1b, 0xcf, 0xcd, 0x9c, 0x17, 0x6a, 0x66, 0x27, 0xdd, 0x19, 0xeb, 0xb0, 0x4a, 0xb1, - 0x1d, 0xfb, 0x11, 0xc9, 0x03, 0xd5, 0x7d, 0x50, 0xc1, 0x21, 0xeb, 0x1e, 0x89, 0x83, 0x10, 0xf3, - 0xf8, 0x47, 0x98, 0x5b, 0xfd, 0x2f, 0xbe, 0x97, 0x3b, 0x1d, 0x63, 0x8f, 0x46, 0xf6, 0xac, 0x24, - 0xea, 0x60, 0xde, 0x49, 0x68, 0xd4, 0xd7, 0x60, 0x4e, 0x12, 0x4a, 0xf2, 0x01, 0x46, 0xbc, 0x5a, - 0xbe, 0x17, 0xf5, 0x83, 0x94, 0xa7, 0x83, 0xf9, 0x1b, 0x8c, 0xb8, 0xda, 0x06, 0x20, 0x40, 0xfd, - 0x91, 0xdd, 0xc9, 0x7b, 0x71, 0x4e, 0x07, 0xa8, 0x2f, 0x8d, 0x8e, 0xc5, 0xa6, 0x0e, 0x6a, 0x37, - 0x93, 0x69, 0x63, 0x11, 0x32, 0x2a, 0xb0, 0xd1, 0x00, 0x5a, 0x7e, 0xa6, 0xb2, 0x8a, 0x3e, 0x98, - 0x6c, 0x0b, 0xcf, 0xea, 0x71, 0x1a, 0xc7, 0x76, 0x3c, 0x66, 0xe3, 0xb1, 0x95, 0xfb, 0x46, 0x96, - 0x3c, 0x0b, 0x94, 0xe2, 0xe9, 0x48, 0xc2, 0x36, 0xb3, 0xb1, 0x68, 0x4a, 0xbf, 0x66, 0x3c, 0x3e, - 0x66, 0x3a, 0x3e, 0xe6, 0x36, 0x23, 0xd4, 0x9a, 0x3f, 0x1b, 0xea, 0x85, 0xab, 0xa1, 0x3e, 0x23, - 0x79, 0xe2, 0x26, 0xc3, 0x4e, 0x7a, 0x8d, 0x0a, 0x98, 0x4d, 0x95, 0x47, 0x66, 0x36, 0x3e, 0x17, - 0x41, 0xb1, 0x2d, 0x3c, 0xf5, 0x44, 0x01, 0xb3, 0x7f, 0x0e, 0xdb, 0x4a, 0x6e, 0x80, 0x6e, 0x9e, - 0xbd, 0x06, 0xff, 0xb1, 0x30, 0xbb, 0x82, 0xe5, 0xf7, 0x5f, 0x7f, 0x7e, 0x9c, 0x78, 0x6c, 0x2c, - 0xc1, 0xdc, 0x2f, 0x52, 0xd2, 0xa5, 0x7e, 0x52, 0xc0, 0x7c, 0xde, 0x6c, 0xae, 0xdd, 0xa6, 0x96, - 0x53, 0x5c, 0xdb, 0xbc, 0x43, 0x71, 0x66, 0x0f, 0x26, 0xf6, 0x56, 0x8d, 0x95, 0x9b, 0xf6, 0xb0, - 0x4b, 0xa2, 0xf5, 0x6c, 0xb9, 0x1e, 0x4a, 0x4b, 0x01, 0x28, 0x25, 0xef, 0xb3, 0x7e, 0x9b, 0x5a, - 0x8c, 0xd6, 0x9e, 0xfe, 0x0d, 0xcd, 0xc4, 0x9f, 0x24, 0xe2, 0x4b, 0xc6, 0x62, 0xee, 0xdd, 0x38, - 0x3d, 0x4e, 0xad, 0xbd, 0xb3, 0x0b, 0x4d, 0x39, 0xbf, 0xd0, 0x94, 0x1f, 0x17, 0x9a, 0x72, 0x72, - 0xa9, 0x15, 0xce, 0x2f, 0xb5, 0xc2, 0xb7, 0x4b, 0xad, 0xb0, 0x0f, 0xc7, 0x82, 0xfd, 0x32, 0x69, - 0xdf, 0x3e, 0x42, 0x84, 0x8e, 0xa8, 0xfa, 0x63, 0x64, 0x49, 0xca, 0x9d, 0x72, 0xf2, 0xb5, 0xdd, - 0xfc, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xc6, 0x47, 0x4d, 0x1b, 0x06, 0x00, 0x00, + // 660 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x31, 0x4f, 0xdb, 0x40, + 0x14, 0x8e, 0x21, 0x0d, 0x70, 0xa8, 0x85, 0x98, 0x16, 0xa5, 0x29, 0xb5, 0x23, 0x23, 0x95, 0x50, + 0x84, 0x4f, 0x81, 0x8d, 0xd1, 0x40, 0x25, 0x86, 0x54, 0x91, 0xd5, 0xa1, 0x45, 0xaa, 0xd0, 0x39, + 0x3e, 0xcc, 0xa9, 0xf6, 0x9d, 0x75, 0x77, 0x41, 0xc9, 0xda, 0xa9, 0x23, 0x52, 0xff, 0x00, 0x63, + 0x7f, 0x40, 0xff, 0x41, 0x17, 0x46, 0xa4, 0x2e, 0x55, 0x87, 0xa8, 0x82, 0x0e, 0x9d, 0xf9, 0x05, + 0x95, 0x7d, 0x8e, 0x89, 0x8a, 0x91, 0x0a, 0x83, 0x65, 0xdf, 0xbd, 0xef, 0x7d, 0xef, 0x7b, 0xe7, + 0xef, 0x1d, 0x58, 0xa2, 0xc4, 0x23, 0xbc, 0x07, 0x09, 0x3d, 0x0c, 0x91, 0x24, 0x8c, 0xc2, 0xe3, + 0x16, 0x94, 0x7d, 0x3b, 0xe6, 0x4c, 0x32, 0x7d, 0x41, 0x45, 0xed, 0x3c, 0x6a, 0x1f, 0xb7, 0xea, + 0x8f, 0x03, 0x16, 0xb0, 0x34, 0x0e, 0x93, 0x2f, 0x05, 0xad, 0x2f, 0x05, 0x8c, 0x05, 0x21, 0x86, + 0x28, 0x26, 0x10, 0x51, 0xca, 0x64, 0x8a, 0x17, 0x59, 0x74, 0xb9, 0xa8, 0xcc, 0x35, 0xab, 0x02, + 0x19, 0x5d, 0x26, 0x22, 0x26, 0xa0, 0x87, 0x04, 0x86, 0xc7, 0x2d, 0x0f, 0x4b, 0xd4, 0x82, 0x5d, + 0x46, 0xb2, 0xb8, 0x85, 0x80, 0xde, 0x16, 0xc1, 0x1b, 0x16, 0x04, 0x21, 0xde, 0x1b, 0xe5, 0xea, + 0x8b, 0xa0, 0x22, 0x30, 0xf5, 0x31, 0xaf, 0x69, 0x0d, 0xad, 0x39, 0xe3, 0x66, 0x2b, 0x7d, 0x15, + 0x54, 0x30, 0x45, 0x5e, 0x88, 0x6b, 0x13, 0x0d, 0xad, 0x39, 0xed, 0x54, 0xaf, 0x86, 0xe6, 0xc3, + 0x01, 0x8a, 0xc2, 0x2d, 0x4b, 0xed, 0x5b, 0x6e, 0x06, 0xd8, 0x9a, 0xfe, 0x74, 0x6a, 0x96, 0xfe, + 0x9c, 0x9a, 0x25, 0xeb, 0x6b, 0x19, 0x2c, 0xb6, 0x45, 0xb0, 0xeb, 0x13, 0x99, 0x57, 0xe8, 0x20, + 0x8e, 0x22, 0x71, 0x6b, 0x9d, 0x35, 0x50, 0xcd, 0x1b, 0x39, 0x50, 0x84, 0xbe, 0x2a, 0xe9, 0xce, + 0xe7, 0x81, 0x5d, 0xb5, 0xaf, 0xbf, 0x07, 0x7a, 0xcc, 0xc2, 0x01, 0x65, 0x11, 0x41, 0xe1, 0xc1, + 0x21, 0xea, 0x4a, 0xc6, 0x45, 0x6d, 0xb2, 0x31, 0xd9, 0x9c, 0x71, 0xec, 0xb3, 0xa1, 0xa9, 0xfd, + 0x1c, 0x9a, 0x2f, 0x02, 0x22, 0x8f, 0x7a, 0x9e, 0xdd, 0x65, 0x11, 0xcc, 0x4e, 0x44, 0xbd, 0xd6, + 0x85, 0xff, 0x01, 0xca, 0x41, 0x8c, 0x85, 0xbd, 0x83, 0xbb, 0x6e, 0xf5, 0x9a, 0xe9, 0x95, 0x22, + 0xd2, 0x03, 0xb0, 0x78, 0xad, 0xc5, 0x27, 0x42, 0x72, 0xe2, 0xf5, 0x92, 0x45, 0xad, 0xdc, 0xd0, + 0x9a, 0xb3, 0x1b, 0x2f, 0xed, 0x82, 0x1f, 0x6a, 0xe7, 0x9d, 0xee, 0x8c, 0x65, 0x38, 0xe5, 0x44, + 0x8e, 0xfb, 0x84, 0x14, 0x05, 0xf5, 0x7d, 0x50, 0xc5, 0x31, 0xeb, 0x1e, 0x89, 0x83, 0x18, 0xf3, + 0xe4, 0x21, 0xcc, 0xaf, 0x3d, 0x48, 0xce, 0xe5, 0x4e, 0x6d, 0xec, 0x51, 0xe9, 0xce, 0x29, 0xa2, + 0x0e, 0xe6, 0x9d, 0x94, 0x46, 0x7f, 0x0b, 0xe6, 0x15, 0xa1, 0x22, 0x1f, 0x60, 0xc4, 0x6b, 0x95, + 0x7b, 0x51, 0x3f, 0xca, 0x78, 0x3a, 0x98, 0xbf, 0xc3, 0x88, 0xeb, 0x6d, 0x00, 0x22, 0xd4, 0x1f, + 0xc9, 0x9d, 0xba, 0x17, 0xe7, 0x4c, 0x84, 0xfa, 0x4a, 0xe8, 0x98, 0x6d, 0x96, 0x40, 0xfd, 0xa6, + 0x33, 0x5d, 0x2c, 0x62, 0x46, 0x05, 0xb6, 0x1a, 0xc0, 0x28, 0xf6, 0x54, 0x8e, 0xe8, 0x83, 0xa9, + 0xb6, 0x08, 0x9c, 0x1e, 0xa7, 0x89, 0x6d, 0xc7, 0x6d, 0x36, 0x6e, 0x5b, 0xb5, 0x6f, 0xe5, 0xce, + 0x73, 0x40, 0x39, 0x99, 0x8e, 0xd4, 0x6c, 0xb3, 0x1b, 0x4f, 0x6d, 0xa5, 0xd7, 0x4e, 0xc6, 0xc7, + 0xce, 0xc6, 0xc7, 0xde, 0x66, 0x84, 0x3a, 0x0b, 0x67, 0x43, 0xb3, 0x74, 0x35, 0x34, 0x67, 0x15, + 0x4f, 0x92, 0x64, 0xb9, 0x69, 0xae, 0x55, 0x05, 0x73, 0x59, 0xe5, 0x91, 0x98, 0x8d, 0x6f, 0x13, + 0x60, 0xb2, 0x2d, 0x02, 0xfd, 0x44, 0x03, 0x73, 0xff, 0x0e, 0xdb, 0x4a, 0xa1, 0x81, 0x6e, 0xf6, + 0x5e, 0x87, 0xff, 0x09, 0xcc, 0x8f, 0x60, 0xf9, 0xe3, 0xf7, 0xdf, 0x9f, 0x27, 0x9e, 0x5b, 0xcf, + 0x60, 0xe1, 0x8d, 0x94, 0x66, 0xe9, 0x5f, 0x34, 0xb0, 0x50, 0x34, 0x9b, 0x6b, 0xb7, 0x55, 0x2b, + 0x00, 0xd7, 0x37, 0xef, 0x00, 0xce, 0xe5, 0xc1, 0x54, 0xde, 0xaa, 0xb5, 0x72, 0x53, 0x1e, 0xf6, + 0x89, 0x5c, 0xcf, 0x97, 0xeb, 0x71, 0x9a, 0xe8, 0xec, 0x9d, 0x5d, 0x18, 0xda, 0xf9, 0x85, 0xa1, + 0xfd, 0xba, 0x30, 0xb4, 0x93, 0x4b, 0xa3, 0x74, 0x7e, 0x69, 0x94, 0x7e, 0x5c, 0x1a, 0xa5, 0x7d, + 0x38, 0xe6, 0xb4, 0xd7, 0x29, 0xd9, 0xf6, 0x11, 0x22, 0x74, 0x44, 0xdc, 0x1f, 0xa3, 0x4e, 0x6d, + 0xe7, 0x55, 0xd2, 0xeb, 0x6f, 0xf3, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x43, 0x97, 0xb5, + 0xac, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -348,7 +347,6 @@ type MsgClient interface { ToggleInflation(ctx context.Context, in *MsgToggleInflation, opts ...grpc.CallOption) (*MsgToggleInflationResponse, error) // EditInflationParams defines a method to edit the inflation params. EditInflationParams(ctx context.Context, in *MsgEditInflationParams, opts ...grpc.CallOption) (*MsgEditInflationParamsResponse, error) - Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) } type msgClient struct { @@ -377,22 +375,12 @@ func (c *msgClient) EditInflationParams(ctx context.Context, in *MsgEditInflatio return out, nil } -func (c *msgClient) Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) { - out := new(MsgBurnResponse) - err := c.cc.Invoke(ctx, "/nibiru.inflation.v1.Msg/Burn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - // MsgServer is the server API for Msg service. type MsgServer interface { // ToggleInflation defines a method to enable or disable inflation. ToggleInflation(context.Context, *MsgToggleInflation) (*MsgToggleInflationResponse, error) // EditInflationParams defines a method to edit the inflation params. EditInflationParams(context.Context, *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) - Burn(context.Context, *MsgBurn) (*MsgBurnResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -405,9 +393,6 @@ func (*UnimplementedMsgServer) ToggleInflation(ctx context.Context, req *MsgTogg func (*UnimplementedMsgServer) EditInflationParams(ctx context.Context, req *MsgEditInflationParams) (*MsgEditInflationParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EditInflationParams not implemented") } -func (*UnimplementedMsgServer) Burn(ctx context.Context, req *MsgBurn) (*MsgBurnResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Burn not implemented") -} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -449,24 +434,6 @@ func _Msg_EditInflationParams_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Msg_Burn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgBurn) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).Burn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/nibiru.inflation.v1.Msg/Burn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).Burn(ctx, req.(*MsgBurn)) - } - return interceptor(ctx, in, info, handler) -} - var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "nibiru.inflation.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -479,10 +446,6 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "EditInflationParams", Handler: _Msg_EditInflationParams_Handler, }, - { - MethodName: "Burn", - Handler: _Msg_Burn_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "nibiru/inflation/v1/tx.proto", diff --git a/x/inflation/types/tx.pb.gw.go b/x/inflation/types/tx.pb.gw.go index 0a75000c6..0d122966c 100644 --- a/x/inflation/types/tx.pb.gw.go +++ b/x/inflation/types/tx.pb.gw.go @@ -105,42 +105,6 @@ func local_request_Msg_EditInflationParams_0(ctx context.Context, marshaler runt } -var ( - filter_Msg_Burn_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Msg_Burn_0(ctx context.Context, marshaler runtime.Marshaler, client MsgClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBurn - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Burn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.Burn(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Msg_Burn_0(ctx context.Context, marshaler runtime.Marshaler, server MsgServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq MsgBurn - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Msg_Burn_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.Burn(ctx, &protoReq) - return msg, metadata, err - -} - // RegisterMsgHandlerServer registers the http handlers for service Msg to "mux". // UnaryRPC :call MsgServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -193,29 +157,6 @@ func RegisterMsgHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) - mux.Handle("POST", pattern_Msg_Burn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Msg_Burn_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Burn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -297,26 +238,6 @@ func RegisterMsgHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) - mux.Handle("POST", pattern_Msg_Burn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Msg_Burn_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Msg_Burn_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - return nil } @@ -324,14 +245,10 @@ var ( pattern_Msg_ToggleInflation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "toggle"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Msg_EditInflationParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "inflation", "edit-inflation-params"}, "", runtime.AssumeColonVerbOpt(false))) - - pattern_Msg_Burn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"nibiru", "inflation", "v1", "burn"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( forward_Msg_ToggleInflation_0 = runtime.ForwardResponseMessage forward_Msg_EditInflationParams_0 = runtime.ForwardResponseMessage - - forward_Msg_Burn_0 = runtime.ForwardResponseMessage ) diff --git a/x/tokenfactory/cli/tx.go b/x/tokenfactory/cli/tx.go index 5f64f1723..7c472b2cc 100644 --- a/x/tokenfactory/cli/tx.go +++ b/x/tokenfactory/cli/tx.go @@ -2,18 +2,16 @@ package cli import ( "fmt" + "strings" - "github.com/spf13/cobra" - + "github.com/MakeNowJust/heredoc/v2" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/tx" - sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/spf13/cobra" "github.com/NibiruChain/nibiru/x/tokenfactory/types" - - "github.com/MakeNowJust/heredoc/v2" ) // NewTxCmd returns the transaction commands for this module @@ -32,6 +30,7 @@ func NewTxCmd() *cobra.Command { CmdChangeAdmin(), CmdMint(), CmdBurn(), + CmdBurnNative(), // CmdModifyDenomMetadata(), // CosmWasm only ) @@ -213,3 +212,42 @@ func CmdBurn() *cobra.Command { flags.AddTxFlagsToCmd(cmd) return cmd } + +func CmdBurnNative() *cobra.Command { + cmd := &cobra.Command{ + Use: "burn-native [amount]", + Args: cobra.ExactArgs(1), + Short: "Burn native tokens.", + Long: strings.TrimSpace(` +Burn native tokens. + +$ nibid tx tokenfactory burn-native 100unibi +`), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + burnCoin, err := sdk.ParseCoinNormalized(args[0]) + if err != nil { + return err + } + + msg := &types.MsgBurnNative{ + Sender: clientCtx.GetFromAddress().String(), + Coin: burnCoin, + } + + if err := msg.ValidateBasic(); err != nil { + return err + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/tokenfactory/keeper/keeper_test.go b/x/tokenfactory/keeper/keeper_test.go index 51a20cc5e..fc7a44431 100644 --- a/x/tokenfactory/keeper/keeper_test.go +++ b/x/tokenfactory/keeper/keeper_test.go @@ -61,6 +61,8 @@ func (s *TestSuite) HandleMsg(txMsg sdk.Msg) (err error) { _, err = s.app.TokenFactoryKeeper.ChangeAdmin(goCtx, txMsg) case *tftypes.MsgSetDenomMetadata: _, err = s.app.TokenFactoryKeeper.SetDenomMetadata(goCtx, txMsg) + case *tftypes.MsgBurnNative: + _, err = s.app.TokenFactoryKeeper.BurnNative(goCtx, txMsg) default: err = fmt.Errorf("unknown message type: %t", txMsg) } diff --git a/x/tokenfactory/keeper/msg_server.go b/x/tokenfactory/keeper/msg_server.go index e8991585f..8bf814768 100644 --- a/x/tokenfactory/keeper/msg_server.go +++ b/x/tokenfactory/keeper/msg_server.go @@ -274,3 +274,29 @@ func (k Keeper) SetDenomMetadata( Caller: txMsg.Sender, }) } + +func (k Keeper) BurnNative( + goCtx context.Context, msg *types.MsgBurnNative, +) (resp *types.MsgBurnNativeResponse, err error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, err + } + + coins := sdk.NewCoins(msg.Coin) + + if err := k.bankKeeper.SendCoinsFromAccountToModule( + ctx, sender, types.ModuleName, coins, + ); err != nil { + return nil, err + } + + err = k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins) + if err != nil { + return nil, err + } + + return &types.MsgBurnNativeResponse{}, err +} diff --git a/x/tokenfactory/keeper/msg_server_test.go b/x/tokenfactory/keeper/msg_server_test.go index abda9991b..70801cdc4 100644 --- a/x/tokenfactory/keeper/msg_server_test.go +++ b/x/tokenfactory/keeper/msg_server_test.go @@ -636,3 +636,90 @@ func (s *TestSuite) TestSetDenomMetadata() { }) } } + +func (s *TestSuite) TestBurnNative() { + _, addrs := testutil.PrivKeyAddressPairs(4) + tfModuleAddr := authtypes.NewModuleAddress(types.ModuleName) + + testCases := []TestCaseTx{ + { + Name: "happy: burn", + SetupMsgs: []sdk.Msg{}, + PreHook: func(ctx sdk.Context, bapp *app.NibiruApp) { + coins := sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(123))) + s.NoError(bapp.BankKeeper.MintCoins(ctx, types.ModuleName, coins)) + s.NoError(bapp.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addrs[0], coins)) + }, + TestMsgs: []TestMsgElem{ + { + TestMsg: &types.MsgBurnNative{ + Sender: addrs[0].String(), + Coin: sdk.NewCoin("unibi", sdk.NewInt(123)), + }, + WantErr: "", + }, + }, + PostHook: func(ctx sdk.Context, bapp *app.NibiruApp) { + s.Equal( + sdk.NewInt(0), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, + ) + + s.Equal( + sdk.NewInt(0), + s.app.BankKeeper.GetBalance(s.ctx, tfModuleAddr, "unibi").Amount, + ) + + s.Equal( + sdk.NewInt(0), + s.app.BankKeeper.GetBalance(s.ctx, addrs[0], "unibi").Amount, + ) + }, + }, + + { + Name: "sad: not enough funds", + SetupMsgs: []sdk.Msg{}, + PreHook: func(ctx sdk.Context, bapp *app.NibiruApp) { + coins := sdk.NewCoins(sdk.NewCoin("unibi", sdk.NewInt(123))) + s.NoError(bapp.BankKeeper.MintCoins(ctx, types.ModuleName, coins)) + s.NoError(bapp.BankKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleName, addrs[0], coins)) + }, + TestMsgs: []TestMsgElem{ + { + TestMsg: &types.MsgBurnNative{ + Sender: addrs[0].String(), + Coin: sdk.NewCoin("unibi", sdk.NewInt(124)), + }, + WantErr: "spendable balance 123unibi is smaller than 124unibi: insufficient funds", + }, + }, + PostHook: func(ctx sdk.Context, bapp *app.NibiruApp) { + s.Equal( + sdk.NewInt(123), s.app.BankKeeper.GetSupply(s.ctx, "unibi").Amount, + ) + + s.Equal( + sdk.NewInt(123), + s.app.BankKeeper.GetBalance(s.ctx, addrs[0], "unibi").Amount, + ) + }, + }, + + { + Name: "sad: nil msg", + TestMsgs: []TestMsgElem{ + { + TestMsg: (*types.MsgSetDenomMetadata)(nil), + WantErr: "nil msg", + }, + }, + }, + } + + for _, tc := range testCases { + s.Run(tc.Name, func() { + s.SetupTest() + tc.RunTest(s) + }) + } +} diff --git a/x/tokenfactory/types/codec.go b/x/tokenfactory/types/codec.go index 84be87b73..e0e639c0d 100644 --- a/x/tokenfactory/types/codec.go +++ b/x/tokenfactory/types/codec.go @@ -34,6 +34,7 @@ func RegisterInterfaces(registry codectypes.InterfaceRegistry) { &MsgUpdateModuleParams{}, &MsgMint{}, &MsgBurn{}, + &MsgBurnNative{}, &MsgSetDenomMetadata{}, ) @@ -47,6 +48,7 @@ func TX_MSG_TYPE_URLS() []string { "/nibiru.tokenfactory.v1.MsgUpdateModuleParams", "/nibiru.tokenfactory.v1.MsgMint", "/nibiru.tokenfactory.v1.MsgBurn", + "/nibiru.tokenfactory.v1.MsgBurnNative", "/nibiru.tokenfactory.v1.MsgSetDenomMetadata", } } diff --git a/x/tokenfactory/types/tx.pb.go b/x/tokenfactory/types/tx.pb.go index dbfc272ef..25a92dacf 100644 --- a/x/tokenfactory/types/tx.pb.go +++ b/x/tokenfactory/types/tx.pb.go @@ -631,6 +631,95 @@ func (m *MsgSetDenomMetadataResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgSetDenomMetadataResponse proto.InternalMessageInfo +// Burn a native token such as unibi +type MsgBurnNative struct { + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Coin types.Coin `protobuf:"bytes,2,opt,name=coin,proto3" json:"coin" yaml:"coin"` +} + +func (m *MsgBurnNative) Reset() { *m = MsgBurnNative{} } +func (m *MsgBurnNative) String() string { return proto.CompactTextString(m) } +func (*MsgBurnNative) ProtoMessage() {} +func (*MsgBurnNative) Descriptor() ([]byte, []int) { + return fileDescriptor_4c78bacd179e004d, []int{12} +} +func (m *MsgBurnNative) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurnNative) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurnNative.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurnNative) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurnNative.Merge(m, src) +} +func (m *MsgBurnNative) XXX_Size() int { + return m.Size() +} +func (m *MsgBurnNative) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurnNative.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurnNative proto.InternalMessageInfo + +func (m *MsgBurnNative) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgBurnNative) GetCoin() types.Coin { + if m != nil { + return m.Coin + } + return types.Coin{} +} + +type MsgBurnNativeResponse struct { +} + +func (m *MsgBurnNativeResponse) Reset() { *m = MsgBurnNativeResponse{} } +func (m *MsgBurnNativeResponse) String() string { return proto.CompactTextString(m) } +func (*MsgBurnNativeResponse) ProtoMessage() {} +func (*MsgBurnNativeResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4c78bacd179e004d, []int{13} +} +func (m *MsgBurnNativeResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgBurnNativeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgBurnNativeResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgBurnNativeResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgBurnNativeResponse.Merge(m, src) +} +func (m *MsgBurnNativeResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgBurnNativeResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgBurnNativeResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgBurnNativeResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateDenom)(nil), "nibiru.tokenfactory.v1.MsgCreateDenom") proto.RegisterType((*MsgCreateDenomResponse)(nil), "nibiru.tokenfactory.v1.MsgCreateDenomResponse") @@ -644,62 +733,66 @@ func init() { proto.RegisterType((*MsgBurnResponse)(nil), "nibiru.tokenfactory.v1.MsgBurnResponse") proto.RegisterType((*MsgSetDenomMetadata)(nil), "nibiru.tokenfactory.v1.MsgSetDenomMetadata") proto.RegisterType((*MsgSetDenomMetadataResponse)(nil), "nibiru.tokenfactory.v1.MsgSetDenomMetadataResponse") + proto.RegisterType((*MsgBurnNative)(nil), "nibiru.tokenfactory.v1.MsgBurnNative") + proto.RegisterType((*MsgBurnNativeResponse)(nil), "nibiru.tokenfactory.v1.MsgBurnNativeResponse") } func init() { proto.RegisterFile("nibiru/tokenfactory/v1/tx.proto", fileDescriptor_4c78bacd179e004d) } var fileDescriptor_4c78bacd179e004d = []byte{ - // 787 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4d, 0x4f, 0xe3, 0x46, - 0x18, 0x8e, 0x4b, 0x1a, 0x92, 0xa1, 0x7c, 0x19, 0x1a, 0x42, 0x2a, 0xe2, 0x6a, 0x54, 0xd1, 0x96, - 0x0a, 0x5b, 0x01, 0xb5, 0x07, 0x2e, 0x15, 0xa6, 0xea, 0xa9, 0xae, 0x90, 0xa1, 0x97, 0xaa, 0x52, - 0x34, 0x89, 0x07, 0xc7, 0x02, 0xcf, 0x44, 0x9e, 0x09, 0x90, 0xde, 0xda, 0x5f, 0xd0, 0x53, 0xff, - 0x40, 0x4f, 0xd5, 0x5e, 0xf6, 0xb0, 0x3f, 0x82, 0x23, 0xda, 0xd3, 0x9e, 0xac, 0x15, 0x1c, 0x56, - 0x7b, 0xcd, 0x2f, 0x58, 0xcd, 0x47, 0x9c, 0x40, 0x42, 0x76, 0x73, 0xd9, 0xdb, 0x78, 0xde, 0xe7, - 0x7d, 0xde, 0xe7, 0xf1, 0xbc, 0xef, 0x0c, 0xb0, 0x48, 0xd4, 0x8c, 0x92, 0xae, 0xc3, 0xe9, 0x39, - 0x26, 0x67, 0xa8, 0xc5, 0x69, 0xd2, 0x73, 0x2e, 0xeb, 0x0e, 0xbf, 0xb6, 0x3b, 0x09, 0xe5, 0xd4, - 0x2c, 0x2b, 0x80, 0x3d, 0x0a, 0xb0, 0x2f, 0xeb, 0xd5, 0xf5, 0x90, 0x86, 0x54, 0x42, 0x1c, 0xb1, - 0x52, 0xe8, 0x6a, 0xad, 0x45, 0x59, 0x4c, 0x99, 0xd3, 0x44, 0x0c, 0x3b, 0x97, 0xf5, 0x26, 0xe6, - 0xa8, 0xee, 0xb4, 0x68, 0x44, 0x74, 0x7c, 0x43, 0xc7, 0x63, 0x16, 0x8a, 0x2a, 0x31, 0x0b, 0x75, - 0x60, 0x53, 0x05, 0x1a, 0x8a, 0x51, 0x7d, 0x8c, 0x71, 0x92, 0xf3, 0x8c, 0x53, 0x7c, 0xe8, 0x38, - 0x7c, 0xc2, 0x02, 0xe3, 0x88, 0x63, 0x85, 0x81, 0x17, 0x60, 0xc9, 0x63, 0xe1, 0x51, 0x82, 0x11, - 0xc7, 0x3f, 0x61, 0x42, 0x63, 0xf3, 0x5b, 0x50, 0x60, 0x98, 0x04, 0x38, 0xa9, 0x18, 0x5f, 0x1a, - 0xdf, 0x94, 0xdc, 0xd5, 0x7e, 0x6a, 0x2d, 0xf6, 0x50, 0x7c, 0x71, 0x00, 0xd5, 0x3e, 0xf4, 0x35, - 0xc0, 0x74, 0x40, 0x91, 0x75, 0x9b, 0x81, 0x48, 0xab, 0x7c, 0x22, 0xc1, 0x6b, 0xfd, 0xd4, 0x5a, - 0xd6, 0x60, 0x1d, 0x81, 0x7e, 0x06, 0x82, 0x7f, 0x80, 0xf2, 0xc3, 0x6a, 0x3e, 0x66, 0x1d, 0x4a, - 0x18, 0x36, 0x5d, 0xb0, 0x4c, 0xf0, 0x55, 0x43, 0x4a, 0x6d, 0x28, 0x46, 0x55, 0xbe, 0xda, 0x4f, - 0xad, 0xb2, 0x62, 0x7c, 0x04, 0x80, 0xfe, 0x22, 0xc1, 0x57, 0xa7, 0x62, 0x43, 0x72, 0xc1, 0x7f, - 0x0d, 0x65, 0xa6, 0x8d, 0x48, 0x88, 0x0f, 0x83, 0x38, 0x22, 0xb3, 0x98, 0xd9, 0x06, 0x9f, 0x8e, - 0x3a, 0x59, 0xe9, 0xa7, 0xd6, 0x67, 0x0a, 0xa9, 0xab, 0xa9, 0xb0, 0x59, 0x07, 0x25, 0x21, 0x04, - 0x09, 0xfe, 0xca, 0x9c, 0xc4, 0xae, 0xf7, 0x53, 0x6b, 0x65, 0xa8, 0x51, 0x86, 0xa0, 0x5f, 0x24, - 0xf8, 0x4a, 0xaa, 0x80, 0x15, 0x65, 0x7b, 0xa8, 0x6b, 0x60, 0x1b, 0xfe, 0x67, 0x80, 0xcf, 0x3d, - 0x16, 0xfe, 0xd6, 0x09, 0x10, 0xc7, 0x1e, 0x0d, 0xba, 0x17, 0xf8, 0x18, 0x25, 0x28, 0x66, 0xe6, - 0x0f, 0xa0, 0x84, 0xba, 0xbc, 0x4d, 0x93, 0x88, 0xf7, 0xb4, 0xf8, 0xca, 0xcb, 0x17, 0xbb, 0xeb, - 0xba, 0x03, 0x0e, 0x83, 0x20, 0xc1, 0x8c, 0x9d, 0xf0, 0x24, 0x22, 0xa1, 0x3f, 0x84, 0x9a, 0x2e, - 0x28, 0x74, 0x24, 0x83, 0xf4, 0xb1, 0xb0, 0xf7, 0x95, 0x3d, 0xb9, 0x4f, 0xed, 0xd1, 0x6a, 0x6e, - 0xfe, 0x26, 0xb5, 0x72, 0xbe, 0xce, 0x3c, 0x58, 0xfa, 0xfb, 0xcd, 0xf3, 0x9d, 0x21, 0x27, 0xb4, - 0xc0, 0xd6, 0x44, 0x91, 0x99, 0x8d, 0xff, 0x0d, 0x30, 0xef, 0xb1, 0xd0, 0x8b, 0x08, 0x9f, 0xe5, - 0x97, 0xbb, 0x20, 0x2f, 0x46, 0x40, 0x2b, 0xdd, 0xb4, 0xb5, 0x37, 0x31, 0x23, 0xb6, 0xee, 0x67, - 0xfb, 0x88, 0x46, 0xc4, 0x5d, 0x13, 0xf2, 0xfa, 0xa9, 0xb5, 0xa0, 0x78, 0x44, 0x12, 0xf4, 0x65, - 0xae, 0xe9, 0x80, 0xf9, 0x38, 0x22, 0xbc, 0xc1, 0xa9, 0x3e, 0x8c, 0xf2, 0x4d, 0x6a, 0x19, 0xfd, - 0xd4, 0x5a, 0x52, 0x58, 0x1d, 0x84, 0x7e, 0x41, 0xac, 0x4e, 0x29, 0xdc, 0x01, 0xcb, 0x5a, 0x6a, - 0xd6, 0x7c, 0x1b, 0x43, 0x0e, 0xa9, 0x39, 0xc3, 0x3e, 0x53, 0xbe, 0xdc, 0x6e, 0x42, 0x3e, 0xb6, - 0xaf, 0x3a, 0x28, 0x35, 0xbb, 0x09, 0x69, 0x9c, 0x25, 0x34, 0x1e, 0x6f, 0xb3, 0x2c, 0x04, 0xfd, - 0xa2, 0x58, 0xff, 0x2c, 0x96, 0xab, 0xd2, 0x99, 0x10, 0x9b, 0x1d, 0xcc, 0x5f, 0x06, 0x58, 0xf3, - 0x58, 0x78, 0x82, 0xb9, 0x1c, 0x11, 0x0f, 0x73, 0x14, 0x20, 0x8e, 0x66, 0x31, 0xf3, 0x23, 0x28, - 0xc6, 0x3a, 0x4d, 0x1b, 0xda, 0x1a, 0x1a, 0x22, 0xe7, 0x99, 0xa1, 0x01, 0xb7, 0xee, 0xa5, 0x2c, - 0x09, 0x6e, 0x81, 0x2f, 0x26, 0x48, 0x18, 0x48, 0xdc, 0x7b, 0x9b, 0x07, 0x73, 0x1e, 0x0b, 0x4d, - 0x0c, 0x16, 0x46, 0xaf, 0xa1, 0xed, 0x27, 0xfb, 0xf6, 0xc1, 0x05, 0x52, 0xb5, 0x3f, 0x0c, 0x97, - 0x9d, 0xb5, 0x28, 0x33, 0x72, 0x41, 0x4c, 0x2d, 0x33, 0xc4, 0x4d, 0x2f, 0x33, 0x3e, 0xd8, 0xe6, - 0x9f, 0xc0, 0x9c, 0x30, 0xd4, 0xbb, 0x53, 0x58, 0xc6, 0xe1, 0xd5, 0xef, 0x67, 0x82, 0x67, 0xb5, - 0x8f, 0x41, 0x5e, 0x4e, 0xa2, 0x35, 0x25, 0x5d, 0x00, 0xaa, 0x5f, 0xbf, 0x07, 0x30, 0xca, 0x28, - 0x67, 0x60, 0x1a, 0xa3, 0x00, 0x4c, 0x65, 0x1c, 0x6d, 0x4c, 0x93, 0x83, 0x95, 0xb1, 0xa6, 0xfc, - 0x6e, 0x4a, 0xf2, 0x63, 0x70, 0x75, 0x7f, 0x06, 0xf0, 0xa0, 0xaa, 0xfb, 0xcb, 0xcd, 0x5d, 0xcd, - 0xb8, 0xbd, 0xab, 0x19, 0xaf, 0xef, 0x6a, 0xc6, 0x3f, 0xf7, 0xb5, 0xdc, 0xed, 0x7d, 0x2d, 0xf7, - 0xea, 0xbe, 0x96, 0xfb, 0x7d, 0x2f, 0x8c, 0x78, 0xbb, 0xdb, 0xb4, 0x5b, 0x34, 0x76, 0x7e, 0x95, - 0xc4, 0x47, 0x6d, 0x14, 0x11, 0x47, 0x3f, 0xa1, 0xd7, 0x0f, 0x1f, 0x51, 0xde, 0xeb, 0x60, 0xd6, - 0x2c, 0xc8, 0x27, 0x74, 0xff, 0x5d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x36, 0x8b, 0xd0, 0xb4, 0x2b, - 0x08, 0x00, 0x00, + // 826 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0xd9, 0x6e, 0x36, 0x99, 0xd2, 0x3f, 0xeb, 0x96, 0x34, 0x6b, 0xd4, 0x18, 0x8d, 0x60, + 0x81, 0x45, 0xb5, 0x95, 0xae, 0xe0, 0xb0, 0x17, 0xb4, 0x2e, 0xe2, 0x84, 0x57, 0x2b, 0x6f, 0xb9, + 0x20, 0xa4, 0x68, 0x12, 0x4f, 0x1d, 0xab, 0xf5, 0x4c, 0xe4, 0x99, 0xa4, 0x0d, 0x07, 0x24, 0xf8, + 0x04, 0x9c, 0xf8, 0x02, 0x9c, 0x10, 0x17, 0x0e, 0x7c, 0x88, 0xde, 0xa8, 0x38, 0x71, 0xb2, 0x50, + 0x7b, 0xe0, 0x9e, 0x4f, 0xb0, 0x9a, 0x3f, 0xb5, 0xdd, 0x26, 0x4d, 0x9b, 0x4b, 0x6f, 0x63, 0xbf, + 0xdf, 0xfb, 0xbd, 0xdf, 0xcf, 0x7e, 0xef, 0x69, 0x80, 0x4d, 0xe2, 0x6e, 0x9c, 0x0e, 0x5d, 0x4e, + 0x0f, 0x31, 0x39, 0x40, 0x3d, 0x4e, 0xd3, 0xb1, 0x3b, 0x6a, 0xbb, 0xfc, 0xc4, 0x19, 0xa4, 0x94, + 0x53, 0xb3, 0xa1, 0x00, 0x4e, 0x19, 0xe0, 0x8c, 0xda, 0xd6, 0x66, 0x44, 0x23, 0x2a, 0x21, 0xae, + 0x38, 0x29, 0xb4, 0xd5, 0xea, 0x51, 0x96, 0x50, 0xe6, 0x76, 0x11, 0xc3, 0xee, 0xa8, 0xdd, 0xc5, + 0x1c, 0xb5, 0xdd, 0x1e, 0x8d, 0x89, 0x8e, 0x6f, 0xe9, 0x78, 0xc2, 0x22, 0x51, 0x25, 0x61, 0x91, + 0x0e, 0x3c, 0x51, 0x81, 0x8e, 0x62, 0x54, 0x0f, 0x53, 0x9c, 0xe4, 0x30, 0xe7, 0x14, 0x0f, 0x3a, + 0x0e, 0x6f, 0xb0, 0xc0, 0x38, 0xe2, 0x58, 0x61, 0xe0, 0x11, 0x58, 0xf5, 0x59, 0xb4, 0x97, 0x62, + 0xc4, 0xf1, 0x57, 0x98, 0xd0, 0xc4, 0xfc, 0x14, 0x54, 0x19, 0x26, 0x21, 0x4e, 0x9b, 0xc6, 0x07, + 0xc6, 0x27, 0x75, 0xef, 0xf1, 0x24, 0xb3, 0x57, 0xc6, 0x28, 0x39, 0x7a, 0x01, 0xd5, 0x7b, 0x18, + 0x68, 0x80, 0xe9, 0x82, 0x1a, 0x1b, 0x76, 0x43, 0x91, 0xd6, 0x7c, 0x47, 0x82, 0x37, 0x26, 0x99, + 0xbd, 0xa6, 0xc1, 0x3a, 0x02, 0x83, 0x1c, 0x04, 0xbf, 0x07, 0x8d, 0xab, 0xd5, 0x02, 0xcc, 0x06, + 0x94, 0x30, 0x6c, 0x7a, 0x60, 0x8d, 0xe0, 0xe3, 0x8e, 0x94, 0xda, 0x51, 0x8c, 0xaa, 0xbc, 0x35, + 0xc9, 0xec, 0x86, 0x62, 0xbc, 0x06, 0x80, 0xc1, 0x0a, 0xc1, 0xc7, 0xfb, 0xe2, 0x85, 0xe4, 0x82, + 0xbf, 0x1a, 0xca, 0x4c, 0x1f, 0x91, 0x08, 0xbf, 0x0c, 0x93, 0x98, 0x2c, 0x62, 0xe6, 0x29, 0x78, + 0x58, 0x76, 0xb2, 0x3e, 0xc9, 0xec, 0x77, 0x15, 0x52, 0x57, 0x53, 0x61, 0xb3, 0x0d, 0xea, 0x42, + 0x08, 0x12, 0xfc, 0xcd, 0x07, 0x12, 0xbb, 0x39, 0xc9, 0xec, 0xf5, 0x42, 0xa3, 0x0c, 0xc1, 0xa0, + 0x46, 0xf0, 0xb1, 0x54, 0x01, 0x9b, 0xca, 0x76, 0xa1, 0xeb, 0xd2, 0x36, 0xfc, 0xcd, 0x00, 0xef, + 0xf9, 0x2c, 0xfa, 0x76, 0x10, 0x22, 0x8e, 0x7d, 0x1a, 0x0e, 0x8f, 0xf0, 0x6b, 0x94, 0xa2, 0x84, + 0x99, 0x5f, 0x80, 0x3a, 0x1a, 0xf2, 0x3e, 0x4d, 0x63, 0x3e, 0xd6, 0xe2, 0x9b, 0xff, 0xfc, 0xb5, + 0xb3, 0xa9, 0x3b, 0xe0, 0x65, 0x18, 0xa6, 0x98, 0xb1, 0x37, 0x3c, 0x8d, 0x49, 0x14, 0x14, 0x50, + 0xd3, 0x03, 0xd5, 0x81, 0x64, 0x90, 0x3e, 0x96, 0x77, 0x3f, 0x74, 0x66, 0xf7, 0xa9, 0x53, 0xae, + 0xe6, 0x2d, 0x9d, 0x66, 0x76, 0x25, 0xd0, 0x99, 0x2f, 0x56, 0x7f, 0xfe, 0xff, 0xcf, 0x67, 0x05, + 0x27, 0xb4, 0xc1, 0xf6, 0x4c, 0x91, 0xb9, 0x8d, 0xdf, 0x0d, 0xf0, 0xc8, 0x67, 0x91, 0x1f, 0x13, + 0xbe, 0xc8, 0x27, 0xf7, 0xc0, 0x92, 0x18, 0x01, 0xad, 0xf4, 0x89, 0xa3, 0xbd, 0x89, 0x19, 0x71, + 0x74, 0x3f, 0x3b, 0x7b, 0x34, 0x26, 0xde, 0x86, 0x90, 0x37, 0xc9, 0xec, 0x65, 0xc5, 0x23, 0x92, + 0x60, 0x20, 0x73, 0x4d, 0x17, 0x3c, 0x4a, 0x62, 0xc2, 0x3b, 0x9c, 0xea, 0x9f, 0xd1, 0x38, 0xcd, + 0x6c, 0x63, 0x92, 0xd9, 0xab, 0x0a, 0xab, 0x83, 0x30, 0xa8, 0x8a, 0xd3, 0x3e, 0x85, 0xcf, 0xc0, + 0x9a, 0x96, 0x9a, 0x37, 0xdf, 0x56, 0xc1, 0x21, 0x35, 0xe7, 0xd8, 0x3f, 0x94, 0x2f, 0x6f, 0x98, + 0x92, 0xfb, 0xf6, 0xd5, 0x06, 0xf5, 0xee, 0x30, 0x25, 0x9d, 0x83, 0x94, 0x26, 0xd3, 0x6d, 0x96, + 0x87, 0x60, 0x50, 0x13, 0xe7, 0xaf, 0xc5, 0xf1, 0xb1, 0x74, 0x26, 0xc4, 0xe6, 0x3f, 0xe6, 0x27, + 0x03, 0x6c, 0xf8, 0x2c, 0x7a, 0x83, 0xb9, 0x1c, 0x11, 0x1f, 0x73, 0x14, 0x22, 0x8e, 0x16, 0x31, + 0xf3, 0x25, 0xa8, 0x25, 0x3a, 0x4d, 0x1b, 0xda, 0x2e, 0x0c, 0x91, 0xc3, 0xdc, 0xd0, 0x25, 0xb7, + 0xee, 0xa5, 0x3c, 0x09, 0x6e, 0x83, 0xf7, 0x67, 0x48, 0xc8, 0x25, 0xfe, 0x08, 0x56, 0xb4, 0xea, + 0x57, 0x88, 0xc7, 0x23, 0x7c, 0xcf, 0x1f, 0x1a, 0x6e, 0xc9, 0x09, 0x2c, 0xea, 0x5f, 0x0a, 0xdb, + 0xfd, 0xfb, 0x21, 0x78, 0xe0, 0xb3, 0xc8, 0xc4, 0x60, 0xb9, 0xbc, 0x1f, 0x9f, 0xde, 0x38, 0x50, + 0x57, 0x36, 0x9b, 0xe5, 0xdc, 0x0d, 0x97, 0x37, 0xa1, 0x28, 0x53, 0xda, 0x5c, 0x73, 0xcb, 0x14, + 0xb8, 0xf9, 0x65, 0xa6, 0x37, 0x8e, 0xf9, 0x03, 0x30, 0x67, 0x6c, 0x9b, 0x9d, 0x39, 0x2c, 0xd3, + 0x70, 0xeb, 0xf3, 0x85, 0xe0, 0x79, 0xed, 0xd7, 0x60, 0x49, 0xae, 0x08, 0x7b, 0x4e, 0xba, 0x00, + 0x58, 0x1f, 0xdf, 0x02, 0x28, 0x33, 0xca, 0xe1, 0x9c, 0xc7, 0x28, 0x00, 0x73, 0x19, 0xcb, 0x13, + 0x63, 0x72, 0xb0, 0x3e, 0x35, 0x2d, 0x9f, 0xcd, 0x49, 0xbe, 0x0e, 0xb6, 0x9e, 0x2f, 0x00, 0xce, + 0xab, 0x86, 0x00, 0x94, 0x26, 0xe0, 0xa3, 0x5b, 0xc4, 0x2a, 0x98, 0xb5, 0x73, 0x27, 0x58, 0x3e, + 0x68, 0x15, 0xef, 0x9b, 0xd3, 0xf3, 0x96, 0x71, 0x76, 0xde, 0x32, 0xfe, 0x3b, 0x6f, 0x19, 0xbf, + 0x5c, 0xb4, 0x2a, 0x67, 0x17, 0xad, 0xca, 0xbf, 0x17, 0xad, 0xca, 0x77, 0xbb, 0x51, 0xcc, 0xfb, + 0xc3, 0xae, 0xd3, 0xa3, 0x89, 0xfb, 0x4a, 0x92, 0xee, 0xf5, 0x51, 0x4c, 0x5c, 0x7d, 0x83, 0x38, + 0xb9, 0x7a, 0x87, 0xe0, 0xe3, 0x01, 0x66, 0xdd, 0xaa, 0xbc, 0x41, 0x3c, 0x7f, 0x1b, 0x00, 0x00, + 0xff, 0xff, 0xb6, 0x28, 0x76, 0x66, 0x2a, 0x09, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -723,6 +816,8 @@ type MsgClient interface { Mint(ctx context.Context, in *MsgMint, opts ...grpc.CallOption) (*MsgMintResponse, error) Burn(ctx context.Context, in *MsgBurn, opts ...grpc.CallOption) (*MsgBurnResponse, error) SetDenomMetadata(ctx context.Context, in *MsgSetDenomMetadata, opts ...grpc.CallOption) (*MsgSetDenomMetadataResponse, error) + // burns a native token such as unibi + BurnNative(ctx context.Context, in *MsgBurnNative, opts ...grpc.CallOption) (*MsgBurnNativeResponse, error) } type msgClient struct { @@ -787,6 +882,15 @@ func (c *msgClient) SetDenomMetadata(ctx context.Context, in *MsgSetDenomMetadat return out, nil } +func (c *msgClient) BurnNative(ctx context.Context, in *MsgBurnNative, opts ...grpc.CallOption) (*MsgBurnNativeResponse, error) { + out := new(MsgBurnNativeResponse) + err := c.cc.Invoke(ctx, "/nibiru.tokenfactory.v1.Msg/BurnNative", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // CreateDenom: registers a token factory denom. @@ -798,6 +902,8 @@ type MsgServer interface { Mint(context.Context, *MsgMint) (*MsgMintResponse, error) Burn(context.Context, *MsgBurn) (*MsgBurnResponse, error) SetDenomMetadata(context.Context, *MsgSetDenomMetadata) (*MsgSetDenomMetadataResponse, error) + // burns a native token such as unibi + BurnNative(context.Context, *MsgBurnNative) (*MsgBurnNativeResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -822,6 +928,9 @@ func (*UnimplementedMsgServer) Burn(ctx context.Context, req *MsgBurn) (*MsgBurn func (*UnimplementedMsgServer) SetDenomMetadata(ctx context.Context, req *MsgSetDenomMetadata) (*MsgSetDenomMetadataResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method SetDenomMetadata not implemented") } +func (*UnimplementedMsgServer) BurnNative(ctx context.Context, req *MsgBurnNative) (*MsgBurnNativeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BurnNative not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -935,6 +1044,24 @@ func _Msg_SetDenomMetadata_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _Msg_BurnNative_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgBurnNative) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).BurnNative(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/nibiru.tokenfactory.v1.Msg/BurnNative", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).BurnNative(ctx, req.(*MsgBurnNative)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "nibiru.tokenfactory.v1.Msg", HandlerType: (*MsgServer)(nil), @@ -963,6 +1090,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "SetDenomMetadata", Handler: _Msg_SetDenomMetadata_Handler, }, + { + MethodName: "BurnNative", + Handler: _Msg_BurnNative_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "nibiru/tokenfactory/v1/tx.proto", @@ -1375,6 +1506,69 @@ func (m *MsgSetDenomMetadataResponse) MarshalToSizedBuffer(dAtA []byte) (int, er return len(dAtA) - i, nil } +func (m *MsgBurnNative) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurnNative) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurnNative) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgBurnNativeResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgBurnNativeResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgBurnNativeResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -1554,6 +1748,30 @@ func (m *MsgSetDenomMetadataResponse) Size() (n int) { return n } +func (m *MsgBurnNative) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Coin.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgBurnNativeResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -2708,6 +2926,171 @@ func (m *MsgSetDenomMetadataResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgBurnNative) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgBurnNative: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurnNative: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBurnNativeResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgBurnNativeResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBurnNativeResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/tokenfactory/types/tx_msgs.go b/x/tokenfactory/types/tx_msgs.go index fb87e9fa8..2cfa4099c 100644 --- a/x/tokenfactory/types/tx_msgs.go +++ b/x/tokenfactory/types/tx_msgs.go @@ -10,8 +10,13 @@ import ( // MsgCreateDenom var ( - _ sdk.Msg = &MsgCreateDenom{} _ legacytx.LegacyMsg = &MsgCreateDenom{} + _ legacytx.LegacyMsg = &MsgChangeAdmin{} + _ legacytx.LegacyMsg = &MsgUpdateModuleParams{} + _ legacytx.LegacyMsg = &MsgMint{} + _ legacytx.LegacyMsg = &MsgBurn{} + _ legacytx.LegacyMsg = &MsgSetDenomMetadata{} + _ legacytx.LegacyMsg = &MsgBurnNative{} ) // ValidateBasic performs stateless validation checks. Impl sdk.Msg. @@ -55,11 +60,6 @@ func (m MsgCreateDenom) GetSignBytes() []byte { // ---------------------------------------------------------------- // MsgChangeAdmin -var ( - _ sdk.Msg = &MsgChangeAdmin{} - _ legacytx.LegacyMsg = &MsgChangeAdmin{} -) - // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgChangeAdmin) ValidateBasic() error { _, err := sdk.AccAddressFromBech32(m.Sender) @@ -99,8 +99,6 @@ func (m MsgChangeAdmin) GetSignBytes() []byte { // ---------------------------------------------------------------- // MsgMint -var _ sdk.Msg = &MsgMint{} - // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgMint) ValidateBasic() error { _, err := sdk.AccAddressFromBech32(m.Sender) @@ -139,11 +137,22 @@ func validateCoin(coin sdk.Coin) error { return nil } +// Route: Impl legacytx.LegacyMsg. The mesage route must be alphanumeric or empty. +func (m MsgMint) Route() string { return RouterKey } + +// Type: Impl legacytx.LegacyMsg. Returns a human-readable string for the message, +// intended for utilization within tags +func (m MsgMint) Type() string { return "mint" } + +// GetSignBytes: Get the canonical byte representation of the Msg. Impl +// legacytx.LegacyMsg. +func (m MsgMint) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) +} + // ---------------------------------------------------------------- // MsgBurn -var _ sdk.Msg = &MsgBurn{} - // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgBurn) ValidateBasic() error { _, err := sdk.AccAddressFromBech32(m.Sender) @@ -175,11 +184,22 @@ func (m MsgBurn) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{sender} } +// Route: Impl legacytx.LegacyMsg. The mesage route must be alphanumeric or empty. +func (m MsgBurn) Route() string { return RouterKey } + +// Type: Impl legacytx.LegacyMsg. Returns a human-readable string for the message, +// intended for utilization within tags +func (m MsgBurn) Type() string { return "burn" } + +// GetSignBytes: Get the canonical byte representation of the Msg. Impl +// legacytx.LegacyMsg. +func (m MsgBurn) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) +} + // ---------------------------------------------------------------- // MsgUpdateModuleParams -var _ sdk.Msg = &MsgUpdateModuleParams{} - // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgUpdateModuleParams) ValidateBasic() error { if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { @@ -195,11 +215,22 @@ func (m MsgUpdateModuleParams) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{sender} } +// Route: Impl legacytx.LegacyMsg. The mesage route must be alphanumeric or empty. +func (m MsgUpdateModuleParams) Route() string { return RouterKey } + +// Type: Impl legacytx.LegacyMsg. Returns a human-readable string for the message, +// intended for utilization within tags +func (m MsgUpdateModuleParams) Type() string { return "update_module_params" } + +// GetSignBytes: Get the canonical byte representation of the Msg. Impl +// legacytx.LegacyMsg. +func (m MsgUpdateModuleParams) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) +} + // ---------------------------------------------------------------- // MsgSetDenomMetadata -var _ sdk.Msg = &MsgSetDenomMetadata{} - // ValidateBasic performs stateless validation checks. Impl sdk.Msg. func (m MsgSetDenomMetadata) ValidateBasic() error { _, err := sdk.AccAddressFromBech32(m.Sender) @@ -215,3 +246,53 @@ func (m MsgSetDenomMetadata) GetSigners() []sdk.AccAddress { sender, _ := sdk.AccAddressFromBech32(m.Sender) return []sdk.AccAddress{sender} } + +// Route: Impl legacytx.LegacyMsg. The mesage route must be alphanumeric or empty. +func (m MsgSetDenomMetadata) Route() string { return RouterKey } + +// Type: Impl legacytx.LegacyMsg. Returns a human-readable string for the message, +// intended for utilization within tags +func (m MsgSetDenomMetadata) Type() string { return "set_denom_metadata" } + +// GetSignBytes: Get the canonical byte representation of the Msg. Impl +// legacytx.LegacyMsg. +func (m MsgSetDenomMetadata) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) +} + +// ---------------------------------------------------------------- +// MsgBurnNative + +// ValidateBasic performs stateless validation checks. Impl sdk.Msg. +func (m MsgBurnNative) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(m.Sender) + if err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf( + "invalid sender (%s): %s", m.Sender, err) + } + + if err := validateCoin(m.Coin); err != nil { + return err + } + + return nil +} + +// GetSigners: Impl sdk.Msg. +func (m MsgBurnNative) GetSigners() []sdk.AccAddress { + sender, _ := sdk.AccAddressFromBech32(m.Sender) + return []sdk.AccAddress{sender} +} + +// Route: Impl legacytx.LegacyMsg. The mesage route must be alphanumeric or empty. +func (m MsgBurnNative) Route() string { return RouterKey } + +// Type: Impl legacytx.LegacyMsg. Returns a human-readable string for the message, +// intended for utilization within tags +func (m MsgBurnNative) Type() string { return "burn_native" } + +// GetSignBytes: Get the canonical byte representation of the Msg. Impl +// legacytx.LegacyMsg. +func (m MsgBurnNative) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&m)) +} From 1ba22a79e36e7ed77e2e4503e72bfbbe5c609aa8 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 3 Apr 2024 14:09:07 -0400 Subject: [PATCH 77/99] revert: remove x/inflation burn method --- app/keepers.go | 2 +- proto/nibiru/inflation/v1/tx.proto | 11 +- x/inflation/keeper/keeper.go | 10 - x/inflation/keeper/keeper_test.go | 71 ----- x/inflation/types/msgs.go | 41 --- x/inflation/types/tx.pb.go | 427 +++-------------------------- x/sudo/types/state.pb.go | 2 +- 7 files changed, 43 insertions(+), 521 deletions(-) delete mode 100644 x/inflation/keeper/keeper_test.go diff --git a/app/keepers.go b/app/keepers.go index c2d60e3d5..3d5734e82 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -763,7 +763,7 @@ func ModuleAccPerms() map[string][]string { return map[string][]string{ authtypes.FeeCollectorName: nil, distrtypes.ModuleName: nil, - inflationtypes.ModuleName: {authtypes.Minter, authtypes.Burner}, + inflationtypes.ModuleName: {authtypes.Minter}, stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking}, stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking}, govtypes.ModuleName: {authtypes.Burner}, diff --git a/proto/nibiru/inflation/v1/tx.proto b/proto/nibiru/inflation/v1/tx.proto index 36626a3f9..ce516b422 100644 --- a/proto/nibiru/inflation/v1/tx.proto +++ b/proto/nibiru/inflation/v1/tx.proto @@ -59,13 +59,4 @@ message MsgEditInflationParams { message MsgToggleInflationResponse {} -message MsgEditInflationParamsResponse {} - -// MsgBurn: allows burning of any token -message MsgBurn { - string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; - cosmos.base.v1beta1.Coin coin = 2 - [ (gogoproto.moretags) = "yaml:\"coin\"", (gogoproto.nullable) = false ]; -} - -message MsgBurnResponse {} \ No newline at end of file +message MsgEditInflationParamsResponse {} \ No newline at end of file diff --git a/x/inflation/keeper/keeper.go b/x/inflation/keeper/keeper.go index 43742b843..03327ac46 100644 --- a/x/inflation/keeper/keeper.go +++ b/x/inflation/keeper/keeper.go @@ -89,13 +89,3 @@ func NewKeeper( func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", "x/"+types.ModuleName) } - -func (k Keeper) Burn(ctx sdk.Context, coins sdk.Coins, sender sdk.AccAddress) error { - if err := k.bankKeeper.SendCoinsFromAccountToModule( - ctx, sender, types.ModuleName, coins, - ); err != nil { - return err - } - - return k.bankKeeper.BurnCoins(ctx, types.ModuleName, coins) -} diff --git a/x/inflation/keeper/keeper_test.go b/x/inflation/keeper/keeper_test.go deleted file mode 100644 index 391efe14f..000000000 --- a/x/inflation/keeper/keeper_test.go +++ /dev/null @@ -1,71 +0,0 @@ -package keeper_test - -import ( - "fmt" - "testing" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/require" - - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/inflation/types" -) - -func init() { - testapp.EnsureNibiruPrefix() -} - -func TestBurn(t *testing.T) { - testCases := []struct { - name string - sender sdk.AccAddress - mintCoin sdk.Coin - burnCoin sdk.Coin - expectedErr error - }{ - { - name: "pass", - sender: testutil.AccAddress(), - mintCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), - burnCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), - expectedErr: nil, - }, - { - name: "not enough coins", - sender: testutil.AccAddress(), - mintCoin: sdk.NewCoin("unibi", sdk.NewInt(100)), - burnCoin: sdk.NewCoin("unibi", sdk.NewInt(101)), - expectedErr: fmt.Errorf("spendable balance 100unibi is smaller than 101unibi: insufficient funds"), - }, - } - - for _, tc := range testCases { - t.Run(fmt.Sprintf("Case %s", tc.name), func(t *testing.T) { - nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() - - // mint and send money to the sender - require.NoError(t, - nibiruApp.BankKeeper.MintCoins( - ctx, types.ModuleName, sdk.NewCoins(tc.mintCoin))) - require.NoError(t, - nibiruApp.BankKeeper.SendCoinsFromModuleToAccount( - ctx, types.ModuleName, tc.sender, sdk.NewCoins(tc.mintCoin)), - ) - - supply := nibiruApp.BankKeeper.GetSupply(ctx, "unibi") - require.Equal(t, tc.mintCoin.Amount, supply.Amount) - - // Burn coins - err := nibiruApp.InflationKeeper.Burn(ctx, sdk.NewCoins(tc.burnCoin), tc.sender) - supply = nibiruApp.BankKeeper.GetSupply(ctx, "unibi") - if tc.expectedErr != nil { - require.EqualError(t, err, tc.expectedErr.Error()) - require.Equal(t, tc.mintCoin.Amount, supply.Amount) - } else { - require.NoError(t, err) - require.Equal(t, sdk.ZeroInt(), supply.Amount) - } - }) - } -} diff --git a/x/inflation/types/msgs.go b/x/inflation/types/msgs.go index 1cb387041..bae08b89d 100644 --- a/x/inflation/types/msgs.go +++ b/x/inflation/types/msgs.go @@ -11,14 +11,12 @@ import ( var ( _ legacytx.LegacyMsg = &MsgEditInflationParams{} _ legacytx.LegacyMsg = &MsgToggleInflation{} - _ legacytx.LegacyMsg = &MsgBurn{} ) // oracle message types const ( TypeMsgEditInflationParams = "edit_inflation_params" TypeMsgToggleInflation = "toggle_inflation" - TypeMsgBurn = "msg_burn" ) // Route implements legacytx.LegacyMsg @@ -105,42 +103,3 @@ func (m MsgToggleInflation) ValidateBasic() error { } return nil } - -// ------------------------------------------------- -// MsgBurn -// Route implements legacytx.LegacyMsg -func (msg MsgBurn) Route() string { return RouterKey } - -// Type implements legacytx.LegacyMsg -func (msg MsgBurn) Type() string { return TypeMsgBurn } - -// GetSignBytes implements legacytx.LegacyMsg -func (msg MsgBurn) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(&msg)) -} - -// GetSigners implements legacytx.LegacyMsg -func (msg MsgBurn) GetSigners() []sdk.AccAddress { - feeder, err := sdk.AccAddressFromBech32(msg.Sender) - if err != nil { - panic(err) - } - - return []sdk.AccAddress{feeder} -} - -func (m MsgBurn) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Sender); err != nil { - return err - } - - if err := m.Coin.Validate(); err != nil { - return err - } - - if m.Coin.Amount.IsZero() { - return fmt.Errorf("coin amount should not be zero") - } - - return nil -} diff --git a/x/inflation/types/tx.pb.go b/x/inflation/types/tx.pb.go index ab332dea7..59513eabe 100644 --- a/x/inflation/types/tx.pb.go +++ b/x/inflation/types/tx.pb.go @@ -6,8 +6,8 @@ package types import ( context "context" fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" @@ -185,150 +185,55 @@ func (m *MsgEditInflationParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgEditInflationParamsResponse proto.InternalMessageInfo -// MsgBurn: allows burning of any token -type MsgBurn struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` - Coin types.Coin `protobuf:"bytes,2,opt,name=coin,proto3" json:"coin" yaml:"coin"` -} - -func (m *MsgBurn) Reset() { *m = MsgBurn{} } -func (m *MsgBurn) String() string { return proto.CompactTextString(m) } -func (*MsgBurn) ProtoMessage() {} -func (*MsgBurn) Descriptor() ([]byte, []int) { - return fileDescriptor_9f6843f876608d76, []int{4} -} -func (m *MsgBurn) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBurn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBurn.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBurn) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBurn.Merge(m, src) -} -func (m *MsgBurn) XXX_Size() int { - return m.Size() -} -func (m *MsgBurn) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBurn.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBurn proto.InternalMessageInfo - -func (m *MsgBurn) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgBurn) GetCoin() types.Coin { - if m != nil { - return m.Coin - } - return types.Coin{} -} - -type MsgBurnResponse struct { -} - -func (m *MsgBurnResponse) Reset() { *m = MsgBurnResponse{} } -func (m *MsgBurnResponse) String() string { return proto.CompactTextString(m) } -func (*MsgBurnResponse) ProtoMessage() {} -func (*MsgBurnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_9f6843f876608d76, []int{5} -} -func (m *MsgBurnResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *MsgBurnResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_MsgBurnResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *MsgBurnResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MsgBurnResponse.Merge(m, src) -} -func (m *MsgBurnResponse) XXX_Size() int { - return m.Size() -} -func (m *MsgBurnResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MsgBurnResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MsgBurnResponse proto.InternalMessageInfo - func init() { proto.RegisterType((*MsgToggleInflation)(nil), "nibiru.inflation.v1.MsgToggleInflation") proto.RegisterType((*MsgEditInflationParams)(nil), "nibiru.inflation.v1.MsgEditInflationParams") proto.RegisterType((*MsgToggleInflationResponse)(nil), "nibiru.inflation.v1.MsgToggleInflationResponse") proto.RegisterType((*MsgEditInflationParamsResponse)(nil), "nibiru.inflation.v1.MsgEditInflationParamsResponse") - proto.RegisterType((*MsgBurn)(nil), "nibiru.inflation.v1.MsgBurn") - proto.RegisterType((*MsgBurnResponse)(nil), "nibiru.inflation.v1.MsgBurnResponse") } func init() { proto.RegisterFile("nibiru/inflation/v1/tx.proto", fileDescriptor_9f6843f876608d76) } var fileDescriptor_9f6843f876608d76 = []byte{ - // 660 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x31, 0x4f, 0xdb, 0x40, - 0x14, 0x8e, 0x21, 0x0d, 0x70, 0xa8, 0x85, 0x98, 0x16, 0xa5, 0x29, 0xb5, 0x23, 0x23, 0x95, 0x50, - 0x84, 0x4f, 0x81, 0x8d, 0xd1, 0x40, 0x25, 0x86, 0x54, 0x91, 0xd5, 0xa1, 0x45, 0xaa, 0xd0, 0x39, - 0x3e, 0xcc, 0xa9, 0xf6, 0x9d, 0x75, 0x77, 0x41, 0xc9, 0xda, 0xa9, 0x23, 0x52, 0xff, 0x00, 0x63, - 0x7f, 0x40, 0xff, 0x41, 0x17, 0x46, 0xa4, 0x2e, 0x55, 0x87, 0xa8, 0x82, 0x0e, 0x9d, 0xf9, 0x05, - 0x95, 0x7d, 0x8e, 0x89, 0x8a, 0x91, 0x0a, 0x83, 0x65, 0xdf, 0xbd, 0xef, 0x7d, 0xef, 0x7b, 0xe7, - 0xef, 0x1d, 0x58, 0xa2, 0xc4, 0x23, 0xbc, 0x07, 0x09, 0x3d, 0x0c, 0x91, 0x24, 0x8c, 0xc2, 0xe3, - 0x16, 0x94, 0x7d, 0x3b, 0xe6, 0x4c, 0x32, 0x7d, 0x41, 0x45, 0xed, 0x3c, 0x6a, 0x1f, 0xb7, 0xea, - 0x8f, 0x03, 0x16, 0xb0, 0x34, 0x0e, 0x93, 0x2f, 0x05, 0xad, 0x2f, 0x05, 0x8c, 0x05, 0x21, 0x86, - 0x28, 0x26, 0x10, 0x51, 0xca, 0x64, 0x8a, 0x17, 0x59, 0x74, 0xb9, 0xa8, 0xcc, 0x35, 0xab, 0x02, - 0x19, 0x5d, 0x26, 0x22, 0x26, 0xa0, 0x87, 0x04, 0x86, 0xc7, 0x2d, 0x0f, 0x4b, 0xd4, 0x82, 0x5d, - 0x46, 0xb2, 0xb8, 0x85, 0x80, 0xde, 0x16, 0xc1, 0x1b, 0x16, 0x04, 0x21, 0xde, 0x1b, 0xe5, 0xea, - 0x8b, 0xa0, 0x22, 0x30, 0xf5, 0x31, 0xaf, 0x69, 0x0d, 0xad, 0x39, 0xe3, 0x66, 0x2b, 0x7d, 0x15, - 0x54, 0x30, 0x45, 0x5e, 0x88, 0x6b, 0x13, 0x0d, 0xad, 0x39, 0xed, 0x54, 0xaf, 0x86, 0xe6, 0xc3, - 0x01, 0x8a, 0xc2, 0x2d, 0x4b, 0xed, 0x5b, 0x6e, 0x06, 0xd8, 0x9a, 0xfe, 0x74, 0x6a, 0x96, 0xfe, - 0x9c, 0x9a, 0x25, 0xeb, 0x6b, 0x19, 0x2c, 0xb6, 0x45, 0xb0, 0xeb, 0x13, 0x99, 0x57, 0xe8, 0x20, - 0x8e, 0x22, 0x71, 0x6b, 0x9d, 0x35, 0x50, 0xcd, 0x1b, 0x39, 0x50, 0x84, 0xbe, 0x2a, 0xe9, 0xce, - 0xe7, 0x81, 0x5d, 0xb5, 0xaf, 0xbf, 0x07, 0x7a, 0xcc, 0xc2, 0x01, 0x65, 0x11, 0x41, 0xe1, 0xc1, - 0x21, 0xea, 0x4a, 0xc6, 0x45, 0x6d, 0xb2, 0x31, 0xd9, 0x9c, 0x71, 0xec, 0xb3, 0xa1, 0xa9, 0xfd, - 0x1c, 0x9a, 0x2f, 0x02, 0x22, 0x8f, 0x7a, 0x9e, 0xdd, 0x65, 0x11, 0xcc, 0x4e, 0x44, 0xbd, 0xd6, - 0x85, 0xff, 0x01, 0xca, 0x41, 0x8c, 0x85, 0xbd, 0x83, 0xbb, 0x6e, 0xf5, 0x9a, 0xe9, 0x95, 0x22, - 0xd2, 0x03, 0xb0, 0x78, 0xad, 0xc5, 0x27, 0x42, 0x72, 0xe2, 0xf5, 0x92, 0x45, 0xad, 0xdc, 0xd0, - 0x9a, 0xb3, 0x1b, 0x2f, 0xed, 0x82, 0x1f, 0x6a, 0xe7, 0x9d, 0xee, 0x8c, 0x65, 0x38, 0xe5, 0x44, - 0x8e, 0xfb, 0x84, 0x14, 0x05, 0xf5, 0x7d, 0x50, 0xc5, 0x31, 0xeb, 0x1e, 0x89, 0x83, 0x18, 0xf3, - 0xe4, 0x21, 0xcc, 0xaf, 0x3d, 0x48, 0xce, 0xe5, 0x4e, 0x6d, 0xec, 0x51, 0xe9, 0xce, 0x29, 0xa2, - 0x0e, 0xe6, 0x9d, 0x94, 0x46, 0x7f, 0x0b, 0xe6, 0x15, 0xa1, 0x22, 0x1f, 0x60, 0xc4, 0x6b, 0x95, - 0x7b, 0x51, 0x3f, 0xca, 0x78, 0x3a, 0x98, 0xbf, 0xc3, 0x88, 0xeb, 0x6d, 0x00, 0x22, 0xd4, 0x1f, - 0xc9, 0x9d, 0xba, 0x17, 0xe7, 0x4c, 0x84, 0xfa, 0x4a, 0xe8, 0x98, 0x6d, 0x96, 0x40, 0xfd, 0xa6, - 0x33, 0x5d, 0x2c, 0x62, 0x46, 0x05, 0xb6, 0x1a, 0xc0, 0x28, 0xf6, 0x54, 0x8e, 0xe8, 0x83, 0xa9, - 0xb6, 0x08, 0x9c, 0x1e, 0xa7, 0x89, 0x6d, 0xc7, 0x6d, 0x36, 0x6e, 0x5b, 0xb5, 0x6f, 0xe5, 0xce, - 0x73, 0x40, 0x39, 0x99, 0x8e, 0xd4, 0x6c, 0xb3, 0x1b, 0x4f, 0x6d, 0xa5, 0xd7, 0x4e, 0xc6, 0xc7, - 0xce, 0xc6, 0xc7, 0xde, 0x66, 0x84, 0x3a, 0x0b, 0x67, 0x43, 0xb3, 0x74, 0x35, 0x34, 0x67, 0x15, - 0x4f, 0x92, 0x64, 0xb9, 0x69, 0xae, 0x55, 0x05, 0x73, 0x59, 0xe5, 0x91, 0x98, 0x8d, 0x6f, 0x13, - 0x60, 0xb2, 0x2d, 0x02, 0xfd, 0x44, 0x03, 0x73, 0xff, 0x0e, 0xdb, 0x4a, 0xa1, 0x81, 0x6e, 0xf6, - 0x5e, 0x87, 0xff, 0x09, 0xcc, 0x8f, 0x60, 0xf9, 0xe3, 0xf7, 0xdf, 0x9f, 0x27, 0x9e, 0x5b, 0xcf, - 0x60, 0xe1, 0x8d, 0x94, 0x66, 0xe9, 0x5f, 0x34, 0xb0, 0x50, 0x34, 0x9b, 0x6b, 0xb7, 0x55, 0x2b, - 0x00, 0xd7, 0x37, 0xef, 0x00, 0xce, 0xe5, 0xc1, 0x54, 0xde, 0xaa, 0xb5, 0x72, 0x53, 0x1e, 0xf6, - 0x89, 0x5c, 0xcf, 0x97, 0xeb, 0x71, 0x9a, 0xe8, 0xec, 0x9d, 0x5d, 0x18, 0xda, 0xf9, 0x85, 0xa1, - 0xfd, 0xba, 0x30, 0xb4, 0x93, 0x4b, 0xa3, 0x74, 0x7e, 0x69, 0x94, 0x7e, 0x5c, 0x1a, 0xa5, 0x7d, - 0x38, 0xe6, 0xb4, 0xd7, 0x29, 0xd9, 0xf6, 0x11, 0x22, 0x74, 0x44, 0xdc, 0x1f, 0xa3, 0x4e, 0x6d, - 0xe7, 0x55, 0xd2, 0xeb, 0x6f, 0xf3, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x43, 0x97, 0xb5, - 0xac, 0x05, 0x00, 0x00, + // 597 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x31, 0x6f, 0xd3, 0x4c, + 0x18, 0xc7, 0xe3, 0xb6, 0x6f, 0xde, 0xf6, 0x10, 0xb4, 0xb9, 0x42, 0x65, 0x85, 0xe0, 0x44, 0xae, + 0x44, 0x53, 0xaa, 0xf8, 0x94, 0x76, 0xeb, 0x18, 0x5a, 0xa4, 0x0c, 0x41, 0x91, 0xc5, 0x00, 0x95, + 0x50, 0x74, 0xb6, 0xaf, 0xce, 0x09, 0xdb, 0x67, 0xf9, 0x2e, 0x51, 0xb2, 0x32, 0x31, 0x56, 0xe2, + 0x0b, 0x74, 0xe4, 0x03, 0xf0, 0x0d, 0x58, 0x3a, 0x56, 0x62, 0x41, 0x0c, 0x11, 0x4a, 0x18, 0x98, + 0xf9, 0x04, 0x28, 0x3e, 0xc7, 0x89, 0x88, 0x2b, 0xd1, 0x0e, 0x51, 0x72, 0xf7, 0xfc, 0x9f, 0xdf, + 0xf3, 0xbf, 0x7b, 0x9e, 0x1c, 0x28, 0x05, 0xd4, 0xa2, 0x51, 0x0f, 0xd1, 0xe0, 0xdc, 0xc3, 0x82, + 0xb2, 0x00, 0xf5, 0xeb, 0x48, 0x0c, 0x8c, 0x30, 0x62, 0x82, 0xc1, 0x6d, 0x19, 0x35, 0xd2, 0xa8, + 0xd1, 0xaf, 0x17, 0x1f, 0xba, 0xcc, 0x65, 0x71, 0x1c, 0x4d, 0x7f, 0x49, 0x69, 0xb1, 0xe4, 0x32, + 0xe6, 0x7a, 0x04, 0xe1, 0x90, 0x22, 0x1c, 0x04, 0x4c, 0xc4, 0x7a, 0x9e, 0x44, 0x77, 0xb3, 0xca, + 0xcc, 0xa9, 0x52, 0xa4, 0xd9, 0x8c, 0xfb, 0x8c, 0x23, 0x0b, 0x73, 0x82, 0xfa, 0x75, 0x8b, 0x08, + 0x5c, 0x47, 0x36, 0xa3, 0x49, 0x5c, 0xc7, 0x00, 0xb6, 0xb8, 0xfb, 0x8a, 0xb9, 0xae, 0x47, 0x9a, + 0xb3, 0x5c, 0xb8, 0x03, 0xf2, 0x9c, 0x04, 0x0e, 0x89, 0x54, 0xa5, 0xa2, 0x54, 0x37, 0xcc, 0x64, + 0x05, 0xf7, 0x41, 0x9e, 0x04, 0xd8, 0xf2, 0x88, 0xba, 0x52, 0x51, 0xaa, 0xeb, 0x8d, 0xc2, 0xef, + 0x51, 0xf9, 0xfe, 0x10, 0xfb, 0xde, 0xb1, 0x2e, 0xf7, 0x75, 0x33, 0x11, 0x1c, 0xaf, 0x7f, 0xb8, + 0x2c, 0xe7, 0x7e, 0x5d, 0x96, 0x73, 0xfa, 0xe7, 0x35, 0xb0, 0xd3, 0xe2, 0xee, 0xa9, 0x43, 0x45, + 0x5a, 0xa1, 0x8d, 0x23, 0xec, 0xf3, 0x1b, 0xeb, 0x1c, 0x80, 0x42, 0x7a, 0x90, 0x8e, 0x04, 0x3a, + 0xb2, 0xa4, 0xb9, 0x95, 0x06, 0x4e, 0xe5, 0x3e, 0x7c, 0x0b, 0x60, 0xc8, 0xbc, 0x61, 0xc0, 0x7c, + 0x8a, 0xbd, 0xce, 0x39, 0xb6, 0x05, 0x8b, 0xb8, 0xba, 0x5a, 0x59, 0xad, 0x6e, 0x34, 0x8c, 0xab, + 0x51, 0x59, 0xf9, 0x3e, 0x2a, 0x3f, 0x75, 0xa9, 0xe8, 0xf6, 0x2c, 0xc3, 0x66, 0x3e, 0x4a, 0x6e, + 0x44, 0x7e, 0xd5, 0xb8, 0xf3, 0x0e, 0x89, 0x61, 0x48, 0xb8, 0x71, 0x42, 0x6c, 0xb3, 0x30, 0x27, + 0xbd, 0x90, 0x20, 0xe8, 0x82, 0x9d, 0xb9, 0x17, 0x87, 0x72, 0x11, 0x51, 0xab, 0x37, 0x5d, 0xa8, + 0x6b, 0x15, 0xa5, 0x7a, 0xef, 0xf0, 0x99, 0x91, 0xd1, 0x50, 0x23, 0x3d, 0xe9, 0xc9, 0x42, 0x46, + 0x63, 0x6d, 0x6a, 0xc7, 0x7c, 0x44, 0xb3, 0x82, 0xf0, 0x0c, 0x14, 0x48, 0xc8, 0xec, 0x2e, 0xef, + 0x84, 0x24, 0x9a, 0x7e, 0x28, 0x73, 0xd4, 0xff, 0xa6, 0xf7, 0x72, 0xab, 0x63, 0x34, 0x03, 0x61, + 0x6e, 0x4a, 0x50, 0x9b, 0x44, 0xed, 0x18, 0x03, 0x5f, 0x83, 0x2d, 0x09, 0x94, 0xf0, 0x21, 0xc1, + 0x91, 0x9a, 0xbf, 0x13, 0xfa, 0x41, 0xc2, 0x69, 0x93, 0xe8, 0x0d, 0xc1, 0x11, 0x6c, 0x01, 0xe0, + 0xe3, 0xc1, 0xcc, 0xee, 0xff, 0x77, 0x62, 0x6e, 0xf8, 0x78, 0x20, 0x8d, 0x2e, 0x8c, 0x4d, 0x09, + 0x14, 0x97, 0x27, 0xd3, 0x24, 0x3c, 0x64, 0x01, 0x27, 0x7a, 0x05, 0x68, 0xd9, 0x33, 0x35, 0x53, + 0x1c, 0x7e, 0x59, 0x01, 0xab, 0x2d, 0xee, 0xc2, 0x0b, 0x05, 0x6c, 0xfe, 0x3d, 0xdf, 0x7b, 0x99, + 0x3d, 0x5b, 0x2e, 0x57, 0x44, 0xff, 0x28, 0x4c, 0x7d, 0xed, 0xbe, 0xff, 0xfa, 0xf3, 0xe3, 0xca, + 0x13, 0xfd, 0x31, 0xca, 0x7c, 0x04, 0xe2, 0x2c, 0xf8, 0x49, 0x01, 0xdb, 0x59, 0x7f, 0x87, 0x83, + 0x9b, 0xaa, 0x65, 0x88, 0x8b, 0x47, 0xb7, 0x10, 0xa7, 0xf6, 0x50, 0x6c, 0x6f, 0x5f, 0xdf, 0x5b, + 0xb6, 0x47, 0x1c, 0x2a, 0x6a, 0xe9, 0xb2, 0x16, 0xc6, 0x89, 0x8d, 0xe6, 0xd5, 0x58, 0x53, 0xae, + 0xc7, 0x9a, 0xf2, 0x63, 0xac, 0x29, 0x17, 0x13, 0x2d, 0x77, 0x3d, 0xd1, 0x72, 0xdf, 0x26, 0x5a, + 0xee, 0x0c, 0x2d, 0x34, 0xf7, 0x65, 0x0c, 0x7b, 0xde, 0xc5, 0x34, 0x98, 0x81, 0x07, 0x0b, 0xe8, + 0xb8, 0xd3, 0x56, 0x3e, 0x7e, 0x71, 0x8e, 0xfe, 0x04, 0x00, 0x00, 0xff, 0xff, 0x28, 0x3a, 0x52, + 0x97, 0x1f, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -639,69 +544,6 @@ func (m *MsgEditInflationParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } -func (m *MsgBurn) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBurn) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBurn) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Coin.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgBurnResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgBurnResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgBurnResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - func encodeVarintTx(dAtA []byte, offset int, v uint64) int { offset -= sovTx(v) base := offset @@ -785,30 +627,6 @@ func (m *MsgEditInflationParamsResponse) Size() (n int) { return n } -func (m *MsgBurn) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Sender) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = m.Coin.Size() - n += 1 + l + sovTx(uint64(l)) - return n -} - -func (m *MsgBurnResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - func sovTx(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -1299,171 +1117,6 @@ func (m *MsgEditInflationParamsResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgBurn) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBurn: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBurn: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sender = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Coin", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Coin.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgBurnResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgBurnResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBurnResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func skipTx(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/sudo/types/state.pb.go b/x/sudo/types/state.pb.go index 033a1c4b9..99b71715a 100644 --- a/x/sudo/types/state.pb.go +++ b/x/sudo/types/state.pb.go @@ -63,7 +63,7 @@ func (m *Sudoers) XXX_DiscardUnknown() { var xxx_messageInfo_Sudoers proto.InternalMessageInfo -func (m *Sudoers) GetRootAddr() string { +func (m *Sudoers) GetRoot() string { if m != nil { return m.Root } From f34cc521766bc021d00d1d654ccb23c6bd9a3e99 Mon Sep 17 00:00:00 2001 From: Segfault <5221072+Segfaultd@users.noreply.github.com> Date: Tue, 23 Apr 2024 20:44:49 +0200 Subject: [PATCH 78/99] feat(ica): ICA Host / Controller integration (#1820) * ICA Host / Controller integration. Added upgrade constants. Added make format command * Fixed required message URLs * Code import fix * Fixed upgrade name * Fixed upgrade target * Changed version number * Update CHANGELOG.md --------- Co-authored-by: Jonathan Gimeno Co-authored-by: Kevin Yang <5478483+k-yang@users.noreply.github.com> --- CHANGELOG.md | 11 ++++++ app/keepers.go | 55 ++++++++++++++++++++++++-- app/upgrades.go | 2 + app/upgrades/v1_3_0/constants.go | 66 ++++++++++++++++++++++++++++++++ contrib/make/format.mk | 4 ++ 5 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 app/upgrades/v1_3_0/constants.go create mode 100644 contrib/make/format.mk diff --git a/CHANGELOG.md b/CHANGELOG.md index 453563d1a..6c3a08f0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-04-23 + +Nibiru v1.3.0 adds interchain accounts. + +* [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0)] +* [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.3.0)] + +### Features + +* [#1820](https://github.com/NibiruChain/nibiru/pull/1820) - feat: add interchain accounts + ## [v1.2.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.2.0) - 2024-03-28 Nibiru v1.2.0 adds a burn method to the x/inflation module that allows senders to burn tokens. diff --git a/app/keepers.go b/app/keepers.go index 3d5734e82..fb500b553 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -4,6 +4,13 @@ import ( "path/filepath" "strings" + ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" + icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" + icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" + icahost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host" + icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" + icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + wasmdapp "github.com/CosmWasm/wasmd/app" "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" @@ -76,6 +83,7 @@ import ( // --------------------------------------------------------------- // IBC imports + icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" ibcfee "github.com/cosmos/ibc-go/v7/modules/apps/29-fee" ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper" ibcfeetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types" @@ -150,11 +158,15 @@ type AppKeepers struct { ibcKeeper *ibckeeper.Keeper ibcFeeKeeper ibcfeekeeper.Keeper /* ibcTransferKeeper is for cross-chain fungible token transfers. */ - ibcTransferKeeper ibctransferkeeper.Keeper + ibcTransferKeeper ibctransferkeeper.Keeper + icaControllerKeeper icacontrollerkeeper.Keeper + icaHostKeeper icahostkeeper.Keeper // make scoped keepers public for test purposes - ScopedIBCKeeper capabilitykeeper.ScopedKeeper - ScopedTransferKeeper capabilitykeeper.ScopedKeeper + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper + ScopedICAHostKeeper capabilitykeeper.ScopedKeeper + ScopedTransferKeeper capabilitykeeper.ScopedKeeper // make IBC modules public for test purposes // these modules are never directly routed to by the IBC Router @@ -200,6 +212,8 @@ func initStoreKeys() ( ibctransfertypes.StoreKey, ibcfeetypes.StoreKey, ibcexported.StoreKey, + icahosttypes.StoreKey, + icacontrollertypes.StoreKey, // nibiru x/ keys oracletypes.StoreKey, @@ -245,6 +259,8 @@ func (app *NibiruApp) InitKeepers( memKeys[capabilitytypes.MemStoreKey], ) app.ScopedIBCKeeper = app.capabilityKeeper.ScopeToModule(ibcexported.ModuleName) + app.ScopedICAControllerKeeper = app.capabilityKeeper.ScopeToModule(icacontrollertypes.SubModuleName) + app.ScopedICAHostKeeper = app.capabilityKeeper.ScopeToModule(icahosttypes.SubModuleName) // scopedFeeMockKeeper := app.capabilityKeeper.ScopeToModule(MockFeePort) app.ScopedTransferKeeper = app.capabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName) @@ -396,6 +412,28 @@ func (app *NibiruApp) InitKeepers( app.ScopedTransferKeeper, ) + app.icaControllerKeeper = icacontrollerkeeper.NewKeeper( + appCodec, keys[icacontrollertypes.StoreKey], + app.GetSubspace(icacontrollertypes.SubModuleName), + app.ibcFeeKeeper, + app.ibcKeeper.ChannelKeeper, + &app.ibcKeeper.PortKeeper, + app.ScopedICAControllerKeeper, + app.MsgServiceRouter(), + ) + + app.icaHostKeeper = icahostkeeper.NewKeeper( + appCodec, + keys[icahosttypes.StoreKey], + app.GetSubspace(icahosttypes.SubModuleName), + app.ibcFeeKeeper, + app.ibcKeeper.ChannelKeeper, + &app.ibcKeeper.PortKeeper, + app.AccountKeeper, + app.ScopedICAHostKeeper, + app.MsgServiceRouter(), + ) + app.ScopedWasmKeeper = app.capabilityKeeper.ScopeToModule(wasmtypes.ModuleName) wasmDir := filepath.Join(homePath, "data") @@ -488,8 +526,11 @@ func (app *NibiruApp) InitKeepers( transferStack = ibctransfer.NewIBCModule(app.ibcTransferKeeper) transferStack = ibcfee.NewIBCMiddleware(transferStack, app.ibcFeeKeeper) + // Create the second stack for ICA + icaHostIBCModule := icahost.NewIBCModule(app.icaHostKeeper) + // Add transfer stack to IBC Router - ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack) + ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule).AddRoute(ibctransfertypes.ModuleName, transferStack) // Create Mock IBC Fee module stack for testing // SendPacket, since it is originating from the application to core IBC: @@ -576,6 +617,7 @@ func (app *NibiruApp) initAppModules( ibc.NewAppModule(app.ibcKeeper), ibctransfer.NewAppModule(app.ibcTransferKeeper), ibcfee.NewAppModule(app.ibcFeeKeeper), + ica.NewAppModule(&app.icaControllerKeeper, &app.icaHostKeeper), // wasm wasm.NewAppModule( @@ -644,6 +686,7 @@ func orderedModuleNames() []string { ibctransfertypes.ModuleName, ibcexported.ModuleName, ibcfeetypes.ModuleName, + icatypes.ModuleName, // -------------------------------------------------------------------- // CosmWasm @@ -746,6 +789,7 @@ func ModuleBasicManager() module.BasicManager { ibc.AppModuleBasic{}, ibctransfer.AppModuleBasic{}, ibctm.AppModuleBasic{}, + ica.AppModuleBasic{}, // native x/ oracle.AppModuleBasic{}, epochs.AppModuleBasic{}, @@ -770,6 +814,7 @@ func ModuleAccPerms() map[string][]string { oracletypes.ModuleName: {}, ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner}, ibcfeetypes.ModuleName: {}, + icatypes.ModuleName: {}, epochstypes.ModuleName: {}, sudotypes.ModuleName: {}, @@ -800,6 +845,8 @@ func initParamsKeeper( paramsKeeper.Subspace(ibctransfertypes.ModuleName) paramsKeeper.Subspace(ibcexported.ModuleName) paramsKeeper.Subspace(ibcfeetypes.ModuleName) + paramsKeeper.Subspace(icacontrollertypes.SubModuleName) + paramsKeeper.Subspace(icahosttypes.SubModuleName) // wasm params keepers paramsKeeper.Subspace(wasmtypes.ModuleName) paramsKeeper.Subspace(devgastypes.ModuleName) diff --git a/app/upgrades.go b/app/upgrades.go index 68afbc057..562d67186 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -12,6 +12,7 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades/v1_0_2" "github.com/NibiruChain/nibiru/app/upgrades/v1_1_0" "github.com/NibiruChain/nibiru/app/upgrades/v1_2_0" + "github.com/NibiruChain/nibiru/app/upgrades/v1_3_0" ) var Upgrades = []upgrades.Upgrade{ @@ -20,6 +21,7 @@ var Upgrades = []upgrades.Upgrade{ v1_0_3.Upgrade, v1_1_0.Upgrade, v1_2_0.Upgrade, + v1_3_0.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_3_0/constants.go b/app/upgrades/v1_3_0/constants.go new file mode 100644 index 000000000..4788dbdd6 --- /dev/null +++ b/app/upgrades/v1_3_0/constants.go @@ -0,0 +1,66 @@ +package v1_3_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/authz" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" + icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" + icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" + icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.3.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + // set the ICS27 consensus version so InitGenesis is not run + fromVM[icatypes.ModuleName] = mm.GetVersionMap()[icatypes.ModuleName] + + // create ICS27 Controller submodule params, controller module not enabled. + controllerParams := icacontrollertypes.Params{ + ControllerEnabled: true, + } + + // create ICS27 Host submodule params + hostParams := icahosttypes.Params{ + HostEnabled: true, + AllowMessages: []string{ + sdk.MsgTypeURL(&banktypes.MsgSend{}), + sdk.MsgTypeURL(&stakingtypes.MsgDelegate{}), + sdk.MsgTypeURL(&stakingtypes.MsgUndelegate{}), + sdk.MsgTypeURL(&stakingtypes.MsgBeginRedelegate{}), + sdk.MsgTypeURL(&distrtypes.MsgWithdrawDelegatorReward{}), + sdk.MsgTypeURL(&distrtypes.MsgSetWithdrawAddress{}), + sdk.MsgTypeURL(&distrtypes.MsgFundCommunityPool{}), + sdk.MsgTypeURL(&authz.MsgExec{}), + sdk.MsgTypeURL(&authz.MsgGrant{}), + sdk.MsgTypeURL(&authz.MsgRevoke{}), + sdk.MsgTypeURL(&ibctransfertypes.MsgTransfer{}), + }, + } + + // initialize ICS27 module + icamodule, correctTypecast := mm.Modules[icatypes.ModuleName].(ica.AppModule) + if !correctTypecast { + panic("mm.Modules[icatypes.ModuleName] is not of type ica.AppModule") + } + icamodule.InitModule(ctx, controllerParams, hostParams) + + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{ + Added: []string{icacontrollertypes.StoreKey, icahosttypes.StoreKey}, + }, +} diff --git a/contrib/make/format.mk b/contrib/make/format.mk new file mode 100644 index 000000000..49c2dfa5e --- /dev/null +++ b/contrib/make/format.mk @@ -0,0 +1,4 @@ +format: + @echo "--> Formating code and ordering imports" + @goimports -local github.com/NibiruChain -w . + @gofmt -w . \ No newline at end of file From 9efcccc9c1d8562fb6d561b09b366ce860f9dd85 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 1 May 2024 13:10:53 -0400 Subject: [PATCH 79/99] refactor(oracle): add oracle slashing events (#1859) * refactor(oracle): add oracle slashing events * Update CHANGELOG.md --- CHANGELOG.md | 6 +++++- app/keepers.go | 3 ++- x/oracle/keeper/keeper.go | 18 ++++++++++++------ x/oracle/keeper/slash.go | 9 ++++----- x/oracle/keeper/test_utils.go | 14 +++++++++++--- x/oracle/types/expected_keeper.go | 5 +++++ 6 files changed, 39 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c3a08f0a..1471ca349 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-04-23 +## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-05-01 Nibiru v1.3.0 adds interchain accounts. @@ -51,6 +51,10 @@ Nibiru v1.3.0 adds interchain accounts. * [#1820](https://github.com/NibiruChain/nibiru/pull/1820) - feat: add interchain accounts +### Improvements + +* [#1859](https://github.com/NibiruChain/nibiru/pull/1859) - refactor(oracle): add oracle slashing events + ## [v1.2.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.2.0) - 2024-03-28 Nibiru v1.2.0 adds a burn method to the x/inflation module that allows senders to burn tokens. diff --git a/app/keepers.go b/app/keepers.go index fb500b553..ab6b23766 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -356,7 +356,8 @@ func (app *NibiruApp) InitKeepers( // ---------------------------------- Nibiru Chain x/ keepers app.OracleKeeper = oraclekeeper.NewKeeper(appCodec, keys[oracletypes.StoreKey], - app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, distrtypes.ModuleName, + app.AccountKeeper, app.BankKeeper, app.DistrKeeper, app.stakingKeeper, app.slashingKeeper, + distrtypes.ModuleName, ) app.EpochsKeeper = epochskeeper.NewKeeper( diff --git a/x/oracle/keeper/keeper.go b/x/oracle/keeper/keeper.go index c8031720e..6bc13bf8f 100644 --- a/x/oracle/keeper/keeper.go +++ b/x/oracle/keeper/keeper.go @@ -23,10 +23,11 @@ type Keeper struct { cdc codec.BinaryCodec storeKey storetypes.StoreKey - AccountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistributionKeeper - StakingKeeper types.StakingKeeper + AccountKeeper types.AccountKeeper + bankKeeper types.BankKeeper + distrKeeper types.DistributionKeeper + StakingKeeper types.StakingKeeper + slashingKeeper types.SlashingKeeper distrModuleName string @@ -47,8 +48,12 @@ type Keeper struct { // NewKeeper constructs a new keeper for oracle func NewKeeper(cdc codec.BinaryCodec, storeKey storetypes.StoreKey, accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, distrKeeper types.DistributionKeeper, - stakingKeeper types.StakingKeeper, distrName string, + bankKeeper types.BankKeeper, + distrKeeper types.DistributionKeeper, + stakingKeeper types.StakingKeeper, + slashingKeeper types.SlashingKeeper, + + distrName string, ) Keeper { // ensure oracle module account is set if addr := accountKeeper.GetModuleAddress(types.ModuleName); addr == nil { @@ -62,6 +67,7 @@ func NewKeeper(cdc codec.BinaryCodec, storeKey storetypes.StoreKey, bankKeeper: bankKeeper, distrKeeper: distrKeeper, StakingKeeper: stakingKeeper, + slashingKeeper: slashingKeeper, distrModuleName: distrName, Params: collections.NewItem(storeKey, 11, collections.ProtoValueEncoder[types.Params](cdc)), ExchangeRates: collections.NewMap(storeKey, 1, asset.PairKeyEncoder, collections.ProtoValueEncoder[types.DatedPrice](cdc)), diff --git a/x/oracle/keeper/slash.go b/x/oracle/keeper/slash.go index a006fb8e6..d3de144f9 100644 --- a/x/oracle/keeper/slash.go +++ b/x/oracle/keeper/slash.go @@ -39,12 +39,11 @@ func (k Keeper) SlashAndResetMissCounters(ctx sdk.Context) { continue } - k.StakingKeeper.Slash( - ctx, consAddr, - distributionHeight, validator.GetConsensusPower(powerReduction), slashFraction, + k.slashingKeeper.Slash( + ctx, consAddr, slashFraction, validator.GetConsensusPower(powerReduction), distributionHeight, ) - k.Logger(ctx).Info("slash", "validator", consAddr.String(), "fraction", slashFraction.String()) - k.StakingKeeper.Jail(ctx, consAddr) + k.Logger(ctx).Info("oracle slash", "validator", consAddr.String(), "fraction", slashFraction.String()) + k.slashingKeeper.Jail(ctx, consAddr) } } diff --git a/x/oracle/keeper/test_utils.go b/x/oracle/keeper/test_utils.go index b92068f37..cc0b71761 100644 --- a/x/oracle/keeper/test_utils.go +++ b/x/oracle/keeper/test_utils.go @@ -2,11 +2,12 @@ package keeper import ( - sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" "testing" "time" + sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" + sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + "github.com/cosmos/cosmos-sdk/store" storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/testutil/sims" @@ -38,6 +39,8 @@ import ( distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" "github.com/cosmos/cosmos-sdk/x/params" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -137,9 +140,12 @@ func CreateTestFixture(t *testing.T) TestFixture { tKeyParams := sdk.NewTransientStoreKey(paramstypes.TStoreKey) keyOracle := sdk.NewKVStoreKey(types.StoreKey) keyStaking := sdk.NewKVStoreKey(stakingtypes.StoreKey) + keySlashing := sdk.NewKVStoreKey(slashingtypes.StoreKey) keyDistr := sdk.NewKVStoreKey(distrtypes.StoreKey) keySudo := sdk.NewKVStoreKey(sudotypes.StoreKey) + govModuleAddr := authtypes.NewModuleAddress(govtypes.ModuleName).String() + db := dbm.NewMemDB() ms := store.NewCommitMultiStore(db) ctx := sdk.NewContext(ms, tmproto.Header{Time: time.Now().UTC(), Height: 1}, false, log.NewNopLogger()) @@ -200,11 +206,12 @@ func CreateTestFixture(t *testing.T) TestFixture { bankKeeper, authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - stakingParams := stakingtypes.DefaultParams() stakingParams.BondDenom = denoms.NIBI stakingKeeper.SetParams(ctx, stakingParams) + slashingKeeper := slashingkeeper.NewKeeper(appCodec, legacyAmino, keySlashing, stakingKeeper, govModuleAddr) + distrKeeper := distrkeeper.NewKeeper( appCodec, keyDistr, @@ -253,6 +260,7 @@ func CreateTestFixture(t *testing.T) TestFixture { bankKeeper, distrKeeper, stakingKeeper, + slashingKeeper, distrtypes.ModuleName, ) diff --git a/x/oracle/types/expected_keeper.go b/x/oracle/types/expected_keeper.go index 4c47f8bd5..98ea85cb1 100644 --- a/x/oracle/types/expected_keeper.go +++ b/x/oracle/types/expected_keeper.go @@ -18,6 +18,11 @@ type StakingKeeper interface { PowerReduction(ctx sdk.Context) (res sdkmath.Int) } +type SlashingKeeper interface { + Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power int64, height int64) + Jail(sdk.Context, sdk.ConsAddress) +} + // DistributionKeeper is expected keeper for distribution module type DistributionKeeper interface { AllocateTokensToValidator(ctx sdk.Context, val stakingtypes.ValidatorI, tokens sdk.DecCoins) From 906f9c7fd5cc38b5d1b6308810bcc6facd96c647 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 6 May 2024 20:19:28 -0400 Subject: [PATCH 80/99] fix(ica): add controller stack (#1864) * fix(ica): add controller stack * chore: update changelog * fix: linter issues * Update CHANGELOG.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- CHANGELOG.md | 6 +++++- app/keepers.go | 21 +++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1471ca349..cae55ea85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,7 +40,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-05-01 +## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-05-07 Nibiru v1.3.0 adds interchain accounts. @@ -51,6 +51,10 @@ Nibiru v1.3.0 adds interchain accounts. * [#1820](https://github.com/NibiruChain/nibiru/pull/1820) - feat: add interchain accounts +### Bug Fixes + +* [#1864](https://github.com/NibiruChain/nibiru/pull/1864) - fix(ica): add ICA controller stack + ### Improvements * [#1859](https://github.com/NibiruChain/nibiru/pull/1859) - refactor(oracle): add oracle slashing events diff --git a/app/keepers.go b/app/keepers.go index ab6b23766..e2cbd6df9 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -5,6 +5,7 @@ import ( "strings" ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" + icacontroller "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller" icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" icahost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host" @@ -527,11 +528,24 @@ func (app *NibiruApp) InitKeepers( transferStack = ibctransfer.NewIBCModule(app.ibcTransferKeeper) transferStack = ibcfee.NewIBCMiddleware(transferStack, app.ibcFeeKeeper) - // Create the second stack for ICA - icaHostIBCModule := icahost.NewIBCModule(app.icaHostKeeper) + // Create Interchain Accounts Stack + // SendPacket, since it is originating from the application to core IBC: + // icaAuthModuleKeeper.SendTx -> icaController.SendPacket -> channel.SendPacket + var icaControllerStack porttypes.IBCModule + // integration point for custom authentication modules + // see https://medium.com/the-interchain-foundation/ibc-go-v6-changes-to-interchain-accounts-and-how-it-impacts-your-chain-806c185300d7 + var noAuthzModule porttypes.IBCModule + icaControllerStack = icacontroller.NewIBCMiddleware(noAuthzModule, app.icaControllerKeeper) + + // RecvPacket, message that originates from core IBC and goes down to app, the flow is: + // channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket + icaHostStack := icahost.NewIBCModule(app.icaHostKeeper) // Add transfer stack to IBC Router - ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule).AddRoute(ibctransfertypes.ModuleName, transferStack) + ibcRouter. + AddRoute(icahosttypes.SubModuleName, icaHostStack). + AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). + AddRoute(ibctransfertypes.ModuleName, transferStack) // Create Mock IBC Fee module stack for testing // SendPacket, since it is originating from the application to core IBC: @@ -557,7 +571,6 @@ func (app *NibiruApp) InitKeepers( govRouter. AddRoute(govtypes.RouterKey, govv1beta1types.ProposalHandler). AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.paramsKeeper)). - // AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)). AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(&app.upgradeKeeper)). AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(app.ibcKeeper.ClientKeeper)) From 1b109f0a868c9401000695c4d80fb122925f3c6a Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 3 Jun 2024 21:37:09 -0500 Subject: [PATCH 81/99] feat(wasm)!: increase contract size limit to 3MB (#1906) * feat(wasm): increase contract size limit to 3MB * chore: update changelog --- app/app.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/app.go b/app/app.go index 10f9d6480..e10e1ca3d 100644 --- a/app/app.go +++ b/app/app.go @@ -125,6 +125,14 @@ func GetWasmOpts(nibiru NibiruApp, appOpts servertypes.AppOptions) []wasmkeeper. return wasmOpts } +// overrideWasmVariables overrides the wasm variables to: +// - allow for larger wasm files +func overrideWasmVariables() { + // Override Wasm size limitation from WASMD. + wasmtypes.MaxWasmSize = 3 * 1024 * 1024 // 3MB + wasmtypes.MaxProposalWasmSize = wasmtypes.MaxWasmSize +} + // NewNibiruApp returns a reference to an initialized NibiruApp. func NewNibiruApp( logger log.Logger, @@ -135,6 +143,7 @@ func NewNibiruApp( appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *NibiruApp { + overrideWasmVariables() appCodec := encodingConfig.Marshaler legacyAmino := encodingConfig.Amino interfaceRegistry := encodingConfig.InterfaceRegistry From e286af066a7a1f417ac4a6180506e2427462bed8 Mon Sep 17 00:00:00 2001 From: Helder Moreira Date: Tue, 5 Mar 2024 22:54:47 +0000 Subject: [PATCH 82/99] feat: add pebbledb support (#1818) --- .goreleaser.yml | 2 ++ contrib/make/build.mk | 2 +- go.mod | 7 +++++-- go.sum | 16 ++++++++++++---- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 2c18897a1..07206abc6 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -40,6 +40,7 @@ builds: - ledger - static - rocksdb + - pebbledb - static_wasm - grocksdb_no_link @@ -79,6 +80,7 @@ builds: - ledger - static - rocksdb + - pebbledb - muslc universal_binaries: diff --git a/contrib/make/build.mk b/contrib/make/build.mk index 57409755c..27cc3e167 100644 --- a/contrib/make/build.mk +++ b/contrib/make/build.mk @@ -39,7 +39,7 @@ TEMPDIR ?= $(CURDIR)/temp export GO111MODULE = on # process build tags -build_tags = netgo osusergo ledger static rocksdb +build_tags = netgo osusergo ledger static rocksdb pebbledb ifeq ($(OS_NAME),darwin) build_tags += static_wasm grocksdb_no_link else diff --git a/go.mod b/go.mod index e23375b04..b0222f850 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/NibiruChain/collections v0.4.0 github.com/armon/go-metrics v0.4.1 github.com/cometbft/cometbft v0.37.4 - github.com/cometbft/cometbft-db v0.9.1 + github.com/cometbft/cometbft-db v0.11.0 github.com/cosmos/cosmos-proto v1.0.0-beta.4 github.com/cosmos/cosmos-sdk v0.47.10 github.com/cosmos/go-bip39 v1.0.0 @@ -52,6 +52,7 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/DataDog/zstd v1.5.2 // indirect github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect @@ -62,9 +63,11 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect - github.com/cockroachdb/errors v1.10.0 // indirect + github.com/cockroachdb/errors v1.11.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect diff --git a/go.sum b/go.sum index 4561cf8b0..656b36fd3 100644 --- a/go.sum +++ b/go.sum @@ -231,6 +231,8 @@ github.com/CosmWasm/wasmvm v1.5.0/go.mod h1:fXB+m2gyh4v9839zlIXdMZGeLAxqUdYdFQqY github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.0/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MakeNowJust/heredoc/v2 v2.0.1 h1:rlCHh70XXXv7toz95ajQWOWQnN4WNLt0TdpZYIR/J6A= github.com/MakeNowJust/heredoc/v2 v2.0.1/go.mod h1:6/2Abh5s+hc3g9nbWLe9ObDIOhaRrqsyY9MWy+4JdRM= @@ -371,20 +373,26 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/errors v1.10.0 h1:lfxS8zZz1+OjtV4MtNWgboi/W5tyLEB6VQZBXN+0VUU= -github.com/cockroachdb/errors v1.10.0/go.mod h1:lknhIsEVQ9Ss/qKDBQS/UqFSvPQjOwNq2qyKAxtHRqE= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= +github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= +github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/kryptology v1.8.0/go.mod h1:RYXOAPdzOGUe3qlSFkMGn58i3xUA8hmxYHksuq+8ciI= github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZr9ZvoCcA= github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= github.com/cometbft/cometbft v0.37.4 h1:xyvvEqlyfK8MgNIIKVJaMsuIp03wxOcFmVkT26+Ikpg= github.com/cometbft/cometbft v0.37.4/go.mod h1:Cmg5Hp4sNpapm7j+x0xRyt2g0juQfmB752ous+pA0G8= -github.com/cometbft/cometbft-db v0.9.1 h1:MIhVX5ja5bXNHF8EYrThkG9F7r9kSfv8BX4LWaxWJ4M= -github.com/cometbft/cometbft-db v0.9.1/go.mod h1:iliyWaoV0mRwBJoizElCwwRA9Tf7jZJOURcRZF9m60U= +github.com/cometbft/cometbft-db v0.11.0 h1:M3Lscmpogx5NTbb1EGyGDaFRdsoLWrUWimFEyf7jej8= +github.com/cometbft/cometbft-db v0.11.0/go.mod h1:GDPJAC/iFHNjmZZPN8V8C1yr/eyityhi2W1hz2MGKSc= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= From 7cb89938e187861c4b4b2ccc441f2152fbce025d Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:33:59 -0500 Subject: [PATCH 83/99] chore: make default db backend PebbleDB --- cmd/nibid/cmd/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/nibid/cmd/init.go b/cmd/nibid/cmd/init.go index 534ee07c5..cc8295bcf 100644 --- a/cmd/nibid/cmd/init.go +++ b/cmd/nibid/cmd/init.go @@ -53,7 +53,7 @@ func customTendermintConfig() *tmcfg.Config { cfg.Consensus.TimeoutPrecommitDelta = ms(500) cfg.Consensus.TimeoutCommit = ms(1_000) - cfg.DBBackend = string(db.RocksDBBackend) + cfg.DBBackend = string(db.PebbleDBBackend) return cfg } From e0245820b8479effbec447ffa40e4f4cbe84ed6a Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:59:34 -0500 Subject: [PATCH 84/99] chore: update changelog --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cae55ea85..9eedef05b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.4.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.4.0) - 2024-06-04 + +Nibiru v1.4.0 adds PebbleDB support and increases the wasm contract size limit to 3MB. + +* [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.4.0)] +* [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.4.0)] + +### State Machine Breaking + +* [#1906](https://github.com/NibiruChain/nibiru/pull/1906) - feat(wasm): increase contract size limit to 3MB + +### Features + +* [#1818](https://github.com/NibiruChain/nibiru/pull/1818) - feat: add pebbledb support +* [#1908](https://github.com/NibiruChain/nibiru/pull/1908) - chore: make pebbledb the default db backend + ## [v1.3.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.3.0) - 2024-05-07 Nibiru v1.3.0 adds interchain accounts. From 9ff225a9859731e9547966dbc7c41f23e00d6b36 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:08:43 -0500 Subject: [PATCH 85/99] chore: add v1.4.0 upgrade handler --- app/upgrades.go | 2 ++ app/upgrades/v1_4_0/constants.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 app/upgrades/v1_4_0/constants.go diff --git a/app/upgrades.go b/app/upgrades.go index 562d67186..5b53d1f95 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -13,6 +13,7 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades/v1_1_0" "github.com/NibiruChain/nibiru/app/upgrades/v1_2_0" "github.com/NibiruChain/nibiru/app/upgrades/v1_3_0" + "github.com/NibiruChain/nibiru/app/upgrades/v1_4_0" ) var Upgrades = []upgrades.Upgrade{ @@ -22,6 +23,7 @@ var Upgrades = []upgrades.Upgrade{ v1_1_0.Upgrade, v1_2_0.Upgrade, v1_3_0.Upgrade, + v1_4_0.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_4_0/constants.go b/app/upgrades/v1_4_0/constants.go new file mode 100644 index 000000000..5043704eb --- /dev/null +++ b/app/upgrades/v1_4_0/constants.go @@ -0,0 +1,24 @@ +package v1_4_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.4.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{ + Added: []string{}, + }, +} From 0ed9d8a8a41e8089f1e905f351e7f997350c5c8d Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:29:03 -0400 Subject: [PATCH 86/99] feat(ibc): add wasm stack to ibc router (#1931) * feat(ibc): add wasm stack to ibc router * Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ app/keepers.go | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9eedef05b..7334d7ccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Features + +* [#1931](https://github.com/NibiruChain/nibiru/pull/1931) - feat(ibc): add `wasm` route to IBC router + ## [v1.4.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.4.0) - 2024-06-04 Nibiru v1.4.0 adds PebbleDB support and increases the wasm contract size limit to 3MB. diff --git a/app/keepers.go b/app/keepers.go index e2cbd6df9..0a2d028c1 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -541,11 +541,16 @@ func (app *NibiruApp) InitKeepers( // channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket icaHostStack := icahost.NewIBCModule(app.icaHostKeeper) + var wasmStack porttypes.IBCModule + wasmStack = wasm.NewIBCHandler(app.WasmKeeper, app.ibcKeeper.ChannelKeeper, app.ibcFeeKeeper) + wasmStack = ibcfee.NewIBCMiddleware(wasmStack, app.ibcFeeKeeper) + // Add transfer stack to IBC Router ibcRouter. AddRoute(icahosttypes.SubModuleName, icaHostStack). AddRoute(icacontrollertypes.SubModuleName, icaControllerStack). - AddRoute(ibctransfertypes.ModuleName, transferStack) + AddRoute(ibctransfertypes.ModuleName, transferStack). + AddRoute(wasmtypes.ModuleName, wasmStack) // Create Mock IBC Fee module stack for testing // SendPacket, since it is originating from the application to core IBC: From b6c95a80e41bd4cff94a14d92043da8d01826924 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:49:23 -0400 Subject: [PATCH 87/99] feat: add v1.5.0 upgrade handler --- app/upgrades.go | 2 ++ app/upgrades/v1_5_0/constants.go | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 app/upgrades/v1_5_0/constants.go diff --git a/app/upgrades.go b/app/upgrades.go index 5b53d1f95..ceda529e8 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -14,6 +14,7 @@ import ( "github.com/NibiruChain/nibiru/app/upgrades/v1_2_0" "github.com/NibiruChain/nibiru/app/upgrades/v1_3_0" "github.com/NibiruChain/nibiru/app/upgrades/v1_4_0" + "github.com/NibiruChain/nibiru/app/upgrades/v1_5_0" ) var Upgrades = []upgrades.Upgrade{ @@ -24,6 +25,7 @@ var Upgrades = []upgrades.Upgrade{ v1_2_0.Upgrade, v1_3_0.Upgrade, v1_4_0.Upgrade, + v1_5_0.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v1_5_0/constants.go b/app/upgrades/v1_5_0/constants.go new file mode 100644 index 000000000..34ec94308 --- /dev/null +++ b/app/upgrades/v1_5_0/constants.go @@ -0,0 +1,22 @@ +package v1_5_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/app/upgrades" +) + +const UpgradeName = "v1.5.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{}, +} From a5279d1c3e2a907d21f7840d86c0dd49c747029f Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Fri, 21 Jun 2024 08:50:21 -0400 Subject: [PATCH 88/99] chore: update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7334d7ccb..1c2a3207f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## [v1.5.0](https://github.com/NibiruChain/nibiru/releases/tag/v1.5.0) - 2024-06-21 + +Nibiru v1.5.0 enables IBC CosmWasm smart contracts. + +* [[Release Link](https://github.com/NibiruChain/nibiru/releases/tag/v1.5.0)] +* [[Commits](https://github.com/NibiruChain/nibiru/commits/v1.5.0)] + ### Features * [#1931](https://github.com/NibiruChain/nibiru/pull/1931) - feat(ibc): add `wasm` route to IBC router From 7e6ad5d654a251a3acedfd535d586e487c848d42 Mon Sep 17 00:00:00 2001 From: Oleg Nikonychev Date: Thu, 15 Aug 2024 19:04:51 +0400 Subject: [PATCH 89/99] feat: add pebbledb support --- .goreleaser.yml | 2 +- contrib/docker/goreleaser.Dockerfile | 8 ++++---- contrib/make/build.mk | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.goreleaser.yml b/.goreleaser.yml index 07206abc6..fde09a1e3 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -84,4 +84,4 @@ builds: - muslc universal_binaries: - - id: darwin \ No newline at end of file + - id: darwin diff --git a/contrib/docker/goreleaser.Dockerfile b/contrib/docker/goreleaser.Dockerfile index 2b1e9b7d1..8d9c5432f 100644 --- a/contrib/docker/goreleaser.Dockerfile +++ b/contrib/docker/goreleaser.Dockerfile @@ -1,7 +1,7 @@ -FROM golang:1.19 AS builder +FROM golang:1.21 AS builder WORKDIR /root -COPY dist/ /root/ +COPY ./dist/ /root/ ARG TARGETARCH RUN if [ "${TARGETARCH}" = "arm64" ]; then \ @@ -10,11 +10,11 @@ RUN if [ "${TARGETARCH}" = "arm64" ]; then \ cp linux_linux_amd64_v1/nibid /root/nibid; \ fi -FROM alpine +FROM alpine:latest WORKDIR /root RUN apk --no-cache add ca-certificates COPY --from=builder /root/nibid /usr/local/bin/nibid ENTRYPOINT ["nibid"] -CMD [ "start" ] \ No newline at end of file +CMD [ "start" ] diff --git a/contrib/make/build.mk b/contrib/make/build.mk index 27cc3e167..8a4c27d58 100644 --- a/contrib/make/build.mk +++ b/contrib/make/build.mk @@ -142,4 +142,4 @@ go.sum: go.mod @echo "--> Ensure dependencies have not been modified" @go mod verify -.PHONY: build install \ No newline at end of file +.PHONY: build install From 01dbb577a15b38bbf958dbf5f0c6b7ad0fa265bb Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:23:47 -0700 Subject: [PATCH 90/99] chore: remove wasmbinding folder and nibiru/v1 dependency --- app/upgrades/v1_0_1/constants.go | 2 +- app/upgrades/v1_0_2/constants.go | 2 +- app/upgrades/v1_0_3/constants.go | 2 +- app/upgrades/v1_5_0/constants.go | 2 +- go.mod | 10 +- go.sum | 9 +- wasmbinding/stargate_query.go | 150 ---------------------------- wasmbinding/stargate_query_test.go | 114 --------------------- x/oracle/client/cli/tx.go | 2 +- x/oracle/keeper/edit_params_test.go | 10 +- x/oracle/module.go | 2 +- 11 files changed, 15 insertions(+), 290 deletions(-) delete mode 100644 wasmbinding/stargate_query.go delete mode 100644 wasmbinding/stargate_query_test.go diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_1/constants.go index 79444f0b5..1548161da 100644 --- a/app/upgrades/v1_0_1/constants.go +++ b/app/upgrades/v1_0_1/constants.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/NibiruChain/nibiru/app/upgrades" + "github.com/NibiruChain/nibiru/v2/app/upgrades" ) const UpgradeName = "v1.0.1" diff --git a/app/upgrades/v1_0_2/constants.go b/app/upgrades/v1_0_2/constants.go index 8b878729c..5333497fc 100644 --- a/app/upgrades/v1_0_2/constants.go +++ b/app/upgrades/v1_0_2/constants.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/NibiruChain/nibiru/app/upgrades" + "github.com/NibiruChain/nibiru/v2/app/upgrades" ) const UpgradeName = "v1.0.2" diff --git a/app/upgrades/v1_0_3/constants.go b/app/upgrades/v1_0_3/constants.go index 3ec54ae30..6c413a015 100644 --- a/app/upgrades/v1_0_3/constants.go +++ b/app/upgrades/v1_0_3/constants.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/NibiruChain/nibiru/app/upgrades" + v2/app/upgrades" ) const UpgradeName = "v1.0.3" diff --git a/app/upgrades/v1_5_0/constants.go b/app/upgrades/v1_5_0/constants.go index 34ec94308..71e4aa827 100644 --- a/app/upgrades/v1_5_0/constants.go +++ b/app/upgrades/v1_5_0/constants.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - "github.com/NibiruChain/nibiru/app/upgrades" + "github.com/NibiruChain/nibiru/v2/app/upgrades" ) const UpgradeName = "v1.5.0" diff --git a/go.mod b/go.mod index 8455f937c..3476119b5 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( cosmossdk.io/errors v1.0.1 cosmossdk.io/math v1.3.0 cosmossdk.io/simapp v0.0.0-20230608160436-666c345ad23d - github.com/MakeNowJust/heredoc/v2 v2.0.1 // indirect + github.com/MakeNowJust/heredoc/v2 v2.0.1 github.com/armon/go-metrics v0.4.1 github.com/btcsuite/btcd v0.24.0 github.com/btcsuite/btcd/btcutil v1.1.5 @@ -57,7 +57,6 @@ require ( require ( cosmossdk.io/collections v0.4.0 cosmossdk.io/tools/rosetta v0.2.1 - github.com/NibiruChain/nibiru v1.5.0 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/gorilla/websocket v1.5.0 github.com/rs/cors v1.8.3 @@ -88,7 +87,6 @@ require ( github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect - github.com/bytedance/sonic v1.9.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -125,15 +123,14 @@ require ( github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/getsentry/sentry-go v0.23.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect github.com/go-stack/stack v1.8.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang/glog v1.2.0 // indirect @@ -168,7 +165,6 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/klauspost/compress v1.17.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.7 // indirect @@ -215,7 +211,6 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/tklauser/numcpus v0.2.2 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect github.com/ulikunitz/xz v0.5.11 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect @@ -228,7 +223,6 @@ require ( go.opentelemetry.io/otel/trace v1.21.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.21.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.6.0 // indirect diff --git a/go.sum b/go.sum index af9eab71b..f60663cd1 100644 --- a/go.sum +++ b/go.sum @@ -239,8 +239,6 @@ github.com/NibiruChain/collections v0.5.0 h1:33pXpVTe1PK/tfdZlAJF1JF7AdzGNARG+iL github.com/NibiruChain/collections v0.5.0/go.mod h1:43L6yjuF0BMre/mw4gqn/kUOZz1c2Y3huZ/RQfBFrOQ= github.com/NibiruChain/go-ethereum v1.10.27-nibiru h1:o6lRFt57izoYwzN5cG8tnnBtJcaO3X7MjjN7PGGNCFg= github.com/NibiruChain/go-ethereum v1.10.27-nibiru/go.mod h1:kvvL3nDceUcB+1qGUBAsVf5dW23RBR77fqxgx2PGNrQ= -github.com/NibiruChain/nibiru v1.5.0 h1:UBela68Tld6y0TV4CnmDlKDIqAnf6Fmqtkv7Y8KFgmI= -github.com/NibiruChain/nibiru v1.5.0/go.mod h1:iDBI9W5DDlvAx8tjeOE4ccE1fIJ0CuN/E3mOEOKJKW8= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -340,7 +338,6 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= @@ -359,7 +356,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -892,8 +888,8 @@ github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -1251,6 +1247,7 @@ github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:s github.com/tyler-smith/go-bip39 v1.0.2/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= @@ -1328,7 +1325,6 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1590,7 +1586,6 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/wasmbinding/stargate_query.go b/wasmbinding/stargate_query.go deleted file mode 100644 index 059f777cf..000000000 --- a/wasmbinding/stargate_query.go +++ /dev/null @@ -1,150 +0,0 @@ -package wasmbinding - -import ( - wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" - - devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" - epochs "github.com/NibiruChain/nibiru/x/epochs/types" - oracle "github.com/NibiruChain/nibiru/x/oracle/types" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" - tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" - - auth "github.com/cosmos/cosmos-sdk/x/auth/types" - bank "github.com/cosmos/cosmos-sdk/x/bank/types" - gov "github.com/cosmos/cosmos-sdk/x/gov/types/v1" - - ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - ibcclienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ibcconnectiontypes "github.com/cosmos/ibc-go/v7/modules/core/03-connection/types" -) - -/* -WasmAcceptedStargateQueries: Specifies which `QueryRequest::Stargate` types -can be sent to the application. - -### On Stargate Queries: - -A Stargate query is encoded the same way as abci_query, with path and protobuf -encoded request data. The format is defined in -[ADR-21](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md). -- The response is protobuf encoded data directly without a JSON response wrapper. -The caller is responsible for compiling the proper protobuf definitions for both -requests and responses. - - ```rust - enum QueryRequest { - Stargate { - /// this is the fully qualified service path used for routing, - /// eg. custom/cosmos_sdk.x.bank.v1.Query/QueryBalance - path: String, - /// this is the expected protobuf message type (not any), binary encoded - data: Binary, - }, - // ... - } - ``` - -### Relationship with Protobuf Message: - -A protobuf message with type URL "/cosmos.bank.v1beta1.QueryBalanceResponse" -communicates a lot of information. From this type URL, we know: - - The protobuf message has package "cosmos.bank.v1beta1" - - The protobuf message has name "QueryBalanceResponse" - -That is, a type URL is of the form "/[PB_MSG.PACKAGE]/[PB_MSG.NAME]" - -The `QueryRequest::Stargate.path` is defined based on method name of the gRPC -service description, not the type URL. In this example: - - The service name is "cosmos.bank.v1beta1.Query" - - The method name for this request on that service is "Balance" - -This results in the expected `Stargate.path` of "/[SERVICE_NAME]/[METHOD]". -By convention, the gRPC query service corresponding to a package is always -"[PB_MSG.PACKAGE].Query". - -Given only the `PB_MSG.PACKAGE` and the `PB_MSG.NAME` of either the query -request or response, we should know the `QueryRequest::Stargate.path` -deterministically. -*/ -func WasmAcceptedStargateQueries() wasmkeeper.AcceptedStargateQueries { - return wasmkeeper.AcceptedStargateQueries{ - // ibc - "/ibc.core.client.v1.Query/ClientState": &ibcclienttypes.QueryClientStateResponse{}, - "/ibc.core.client.v1.Query/ConsensusState": &ibcclienttypes.QueryConsensusStateResponse{}, - "/ibc.core.connection.v1.Query/Connection": &ibcconnectiontypes.QueryConnectionResponse{}, - "/ibc.core.connection.v1.Query/Connections": &ibcconnectiontypes.QueryConnectionsResponse{}, - "/ibc.core.connection.v1.Query/ClientConnections": &ibcconnectiontypes.QueryClientConnectionsResponse{}, - "/ibc.core.connection.v1.Query/ConnectionConsensusState": &ibcconnectiontypes.QueryConnectionConsensusStateResponse{}, - "/ibc.core.connection.v1.Query/ConnectionParams": &ibcconnectiontypes.QueryConnectionParamsResponse{}, - - // ibc transfer - "/ibc.applications.transfer.v1.Query/DenomTrace": &ibctransfertypes.QueryDenomTraceResponse{}, - "/ibc.applications.transfer.v1.Query/Params": &ibctransfertypes.QueryParamsResponse{}, - "/ibc.applications.transfer.v1.Query/DenomHash": &ibctransfertypes.QueryDenomHashResponse{}, - "/ibc.applications.transfer.v1.Query/EscrowAddress": &ibctransfertypes.QueryEscrowAddressResponse{}, - "/ibc.applications.transfer.v1.Query/TotalEscrowForDenom": &ibctransfertypes.QueryTotalEscrowForDenomResponse{}, - - // cosmos auth - "/cosmos.auth.v1beta1.Query/Account": new(auth.QueryAccountResponse), - "/cosmos.auth.v1beta1.Query/Params": new(auth.QueryParamsResponse), - - // cosmos bank - "/cosmos.bank.v1beta1.Query/Balance": new(bank.QueryBalanceResponse), - "/cosmos.bank.v1beta1.Query/DenomMetadata": new(bank.QueryDenomMetadataResponse), - "/cosmos.bank.v1beta1.Query/Params": new(bank.QueryParamsResponse), - "/cosmos.bank.v1beta1.Query/SupplyOf": new(bank.QuerySupplyOfResponse), - "/cosmos.bank.v1beta1.Query/AllBalances": new(bank.QueryAllBalancesResponse), - - // cosmos gov - "/cosmos.gov.v1.Query/Proposal": new(gov.QueryProposalResponse), - "/cosmos.gov.v1.Query/Params": new(gov.QueryParamsResponse), - "/cosmos.gov.v1.Query/Vote": new(gov.QueryVoteResponse), - - // nibiru tokenfactory - "/nibiru.tokenfactory.v1.Query/Denoms": new(tokenfactory.QueryDenomsResponse), - "/nibiru.tokenfactory.v1.Query/Params": new(tokenfactory.QueryParamsResponse), - "/nibiru.tokenfactory.v1.Query/DenomInfo": new(tokenfactory.QueryDenomInfoResponse), - - // nibiru epochs - "/nibiru.epochs.v1.Query/EpochInfos": new(epochs.QueryEpochInfosResponse), - "/nibiru.epochs.v1.Query/CurrentEpoch": new(epochs.QueryCurrentEpochResponse), - - // TODO: for post v1 - // nibiru inflation - // "/nibiru.inflation.v1.Query/Period": new(inflation.QueryPeriodResponse), - // "/nibiru.inflation.v1.Query/EpochMintProvision": new(inflation.QueryEpochMintProvisionResponse), - // "/nibiru.inflation.v1.Query/SkippedEpochs": new(inflation.QuerySkippedEpochsResponse), - // "/nibiru.inflation.v1.Query/CirculatingSupply": new(inflation.QueryCirculatingSupplyResponse), - // "/nibiru.inflation.v1.Query/InflationRate": new(inflation.QueryInflationRateResponse), - // "/nibiru.inflation.v1.Query/Params": new(inflation.QueryParamsResponse), - - // nibiru oracle - "/nibiru.oracle.v1.Query/ExchangeRate": new(oracle.QueryExchangeRateResponse), - "/nibiru.oracle.v1.Query/ExchangeRateTwap": new(oracle.QueryExchangeRateResponse), - "/nibiru.oracle.v1.Query/ExchangeRates": new(oracle.QueryExchangeRatesResponse), - "/nibiru.oracle.v1.Query/Actives": new(oracle.QueryActivesResponse), - "/nibiru.oracle.v1.Query/VoteTargets": new(oracle.QueryVoteTargetsResponse), - "/nibiru.oracle.v1.Query/FeederDelegation": new(oracle.QueryFeederDelegationResponse), - "/nibiru.oracle.v1.Query/MissCounter": new(oracle.QueryMissCounterResponse), - "/nibiru.oracle.v1.Query/AggregatePrevote": new(oracle.QueryAggregatePrevoteResponse), - "/nibiru.oracle.v1.Query/AggregatePrevotes": new(oracle.QueryAggregatePrevotesResponse), - "/nibiru.oracle.v1.Query/AggregateVote": new(oracle.QueryAggregateVoteResponse), - "/nibiru.oracle.v1.Query/AggregateVotes": new(oracle.QueryAggregateVotesResponse), - "/nibiru.oracle.v1.Query/Params": new(oracle.QueryParamsResponse), - - // nibiru sudo - "/nibiru.sudo.v1.Query/QuerySudoers": new(sudotypes.QuerySudoersResponse), - - // nibiru devgas - "/nibiru.devgas.v1.Query/FeeShares": new(devgas.QueryFeeSharesResponse), - "/nibiru.devgas.v1.Query/FeeShare": new(devgas.QueryFeeShareResponse), - "/nibiru.devgas.v1.Query/Params": new(devgas.QueryParamsResponse), - "/nibiru.devgas.v1.Query/FeeSharesByWithdrawer": new(devgas.QueryFeeSharesByWithdrawerResponse), - - // TODO: for post v1 - // nibiru.perp - - // TODO: for post v1 - // nibiru.spot - } -} diff --git a/wasmbinding/stargate_query_test.go b/wasmbinding/stargate_query_test.go deleted file mode 100644 index 3a06723f3..000000000 --- a/wasmbinding/stargate_query_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package wasmbinding_test - -import ( - "fmt" - "strings" - "testing" - - "github.com/cosmos/gogoproto/proto" - "github.com/stretchr/testify/assert" - "google.golang.org/grpc" - - "github.com/NibiruChain/nibiru/wasmbinding" - - "github.com/NibiruChain/nibiru/x/common/set" - - devgas "github.com/NibiruChain/nibiru/x/devgas/v1/types" - epochs "github.com/NibiruChain/nibiru/x/epochs/types" - oracle "github.com/NibiruChain/nibiru/x/oracle/types" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" - tokenfactory "github.com/NibiruChain/nibiru/x/tokenfactory/types" -) - -/* -TestWasmAcceptedStargateQueries: Verifies that the query paths registered in -the Wasm keeper's StargateQuerier are the official method names in the gRPC -query service of each path's respective module. - -> ℹ️ "All stargate query paths must be actual GRPC query service methods" - -Please see the function doc comment for WasmAcceptedStargateQueries in -stargate_query.go to understand in detail what invariants this test checks -for. - -Given only the `PB_MSG.PACKAGE` and the `PB_MSG.NAME` of either the query -request or response, we should know the `QueryRequest::Stargate.path` -deterministically. -*/ -func TestWasmAcceptedStargateQueries(t *testing.T) { - t.Log("stargateQueryPaths: Add nibiru query paths from GRPC service descriptions") - queryServiceDescriptions := []grpc.ServiceDesc{ - epochs.GrpcQueryServiceDesc(), - devgas.GrpcQueryServiceDesc(), - oracle.GrpcQueryServiceDesc(), - sudotypes.GrpcQueryServiceDesc(), - tokenfactory.GrpcQueryServiceDesc(), - } - stargateQueryPaths := set.New[string]() - for _, serviceDesc := range queryServiceDescriptions { - for _, queryMethod := range serviceDesc.Methods { - stargateQueryPaths.Add( - fmt.Sprintf("/%v/%v", serviceDesc.ServiceName, queryMethod.MethodName), - ) - } - } - - t.Log("stargateQueryPaths: Add cosmos and ibc query paths") - // The GRPC service descriptions aren't exported as copies from the - // Cosmos-SDK and remain private vars. Maybe we could ask the maintainers to - // export them in the future. - for queryPath := range wasmbinding.WasmAcceptedStargateQueries() { - stargateQueryPaths.Add(queryPath) - } - - // It's not required for the response type and the method description of the - // stargate query's gRPC path to match up exactly as expected. The exception - // to this convention is when our response type isn't stripped of its - // "Response" suffix and "Query" prefix is not the same as the method name. - // This happens when "QueryAAARequest" does not return a "QueryAAAResponse". - exceptionPaths := set.New[string]("/nibiru.oracle.v1.QueryExchangeRateResponse") - - gotQueryPaths := []string{} - for queryPath, protobufResponse := range wasmbinding.WasmAcceptedStargateQueries() { - gotQueryPaths = append(gotQueryPaths, queryPath) - - // Show that the underlying protobuf name and query paths coincide. - pbQueryResponseTypeUrl := "/" + proto.MessageName(protobufResponse) - isExceptionPath := exceptionPaths.Has(pbQueryResponseTypeUrl) - splitResponse := strings.Split(pbQueryResponseTypeUrl, "Response") - assert.Lenf(t, splitResponse, 2, "typeUrl: %v", - splitResponse, pbQueryResponseTypeUrl) - - // Get proto message "package" from the response type - typeUrlMinusSuffix := splitResponse[0] - typeUrlPartsFromProtoMsg := strings.Split(typeUrlMinusSuffix, ".") - lenOfParts := len(typeUrlPartsFromProtoMsg) - assert.GreaterOrEqual(t, lenOfParts, 4, typeUrlPartsFromProtoMsg) - protoMessagePackage := typeUrlPartsFromProtoMsg[:lenOfParts-1] - - // Get proto message "package" from the query path - typeUrlPartsFromQueryPath := strings.Split(queryPath, ".") - assert.GreaterOrEqual(t, len(typeUrlPartsFromQueryPath), 4, typeUrlPartsFromQueryPath) - queryPathProtoPackage := typeUrlPartsFromQueryPath[:lenOfParts-1] - - // Verify that the packages match - assert.Equalf(t, queryPathProtoPackage, protoMessagePackage, - "package names inconsistent:\nfrom query path: %v\nfrom protobuf object: %v", - queryPath, pbQueryResponseTypeUrl, - ) - - // Verify that the method names match too. - if isExceptionPath { - continue - } - methodNameFromPb := strings.TrimLeft(typeUrlPartsFromProtoMsg[3], "Query") - methodNameFromPath := strings.TrimLeft(typeUrlPartsFromQueryPath[3], "Query/") - assert.Equalf(t, methodNameFromPb, methodNameFromPath, - "method names inconsistent:\nfrom query path: %v\nfrom protobuf object: %v", - queryPath, pbQueryResponseTypeUrl, - ) - } - - t.Log("All stargate query paths must be actual GRPC query service methods") - assert.ElementsMatch(t, stargateQueryPaths.ToSlice(), gotQueryPaths) -} diff --git a/x/oracle/client/cli/tx.go b/x/oracle/client/cli/tx.go index 9fe906aaf..50d26b944 100644 --- a/x/oracle/client/cli/tx.go +++ b/x/oracle/client/cli/tx.go @@ -5,7 +5,7 @@ import ( "strings" "time" - "github.com/NibiruChain/nibiru/x/common/asset" + "github.com/NibiruChain/nibiru/v2/x/common/asset" "github.com/pkg/errors" diff --git a/x/oracle/keeper/edit_params_test.go b/x/oracle/keeper/edit_params_test.go index d197a97cc..2e2bf702a 100644 --- a/x/oracle/keeper/edit_params_test.go +++ b/x/oracle/keeper/edit_params_test.go @@ -6,11 +6,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" - "github.com/NibiruChain/nibiru/x/common/testutil" - "github.com/NibiruChain/nibiru/x/common/testutil/testapp" - "github.com/NibiruChain/nibiru/x/oracle/keeper" - "github.com/NibiruChain/nibiru/x/oracle/types" - sudotypes "github.com/NibiruChain/nibiru/x/sudo/types" + "github.com/NibiruChain/nibiru/v2/x/common/testutil" + "github.com/NibiruChain/nibiru/v2/x/common/testutil/testapp" + "github.com/NibiruChain/nibiru/v2/x/oracle/keeper" + "github.com/NibiruChain/nibiru/v2/x/oracle/types" + sudotypes "github.com/NibiruChain/nibiru/v2/x/sudo/types" ) func TestMsgServer_EditOracleParams(t *testing.T) { diff --git a/x/oracle/module.go b/x/oracle/module.go index fe5bf45c9..cf1bc1a05 100644 --- a/x/oracle/module.go +++ b/x/oracle/module.go @@ -5,7 +5,7 @@ import ( "encoding/json" "fmt" - sudokeeper "github.com/NibiruChain/nibiru/x/sudo/keeper" + sudokeeper "github.com/NibiruChain/nibiru/v2/x/sudo/keeper" "github.com/gorilla/mux" "github.com/grpc-ecosystem/grpc-gateway/runtime" From f436b6677b377d2dacfcc85e689a3e72506258cc Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:47:10 -0700 Subject: [PATCH 91/99] fix: remove extra overrideWasmVariables --- app/app.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/app.go b/app/app.go index 315549f91..6df59b14c 100644 --- a/app/app.go +++ b/app/app.go @@ -131,14 +131,6 @@ func overrideWasmVariables() { wasmtypes.MaxProposalWasmSize = wasmtypes.MaxWasmSize } -// overrideWasmVariables overrides the wasm variables to: -// - allow for larger wasm files -func overrideWasmVariables() { - // Override Wasm size limitation from WASMD. - wasmtypes.MaxWasmSize = 3 * 1024 * 1024 // 3MB - wasmtypes.MaxProposalWasmSize = wasmtypes.MaxWasmSize -} - // NewNibiruApp returns a reference to an initialized NibiruApp. func NewNibiruApp( logger log.Logger, From 2b8cb36bec6c56fb44da89857ed4f1859b64a282 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:47:20 -0700 Subject: [PATCH 92/99] fix: upgrades --- app/upgrades.go | 7 +++++++ app/upgrades/v1_0_3/constants.go | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/upgrades.go b/app/upgrades.go index 769936f84..bbd5475c6 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -6,13 +6,20 @@ import ( upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" "github.com/NibiruChain/nibiru/v2/app/upgrades" + "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_0_1" + "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_0_2" + "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_0_3" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_1_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_2_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_3_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_4_0" + "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_5_0" ) var Upgrades = []upgrades.Upgrade{ + v1_0_1.Upgrade, + v1_0_2.Upgrade, + v1_0_3.Upgrade, v1_1_0.Upgrade, v1_2_0.Upgrade, v1_3_0.Upgrade, diff --git a/app/upgrades/v1_0_3/constants.go b/app/upgrades/v1_0_3/constants.go index 6c413a015..acec556b6 100644 --- a/app/upgrades/v1_0_3/constants.go +++ b/app/upgrades/v1_0_3/constants.go @@ -6,7 +6,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - v2/app/upgrades" + "github.com/NibiruChain/nibiru/v2/app/upgrades" ) const UpgradeName = "v1.0.3" From da76c39479d81c4957694a44ae78e39bfb5459de Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:47:26 -0700 Subject: [PATCH 93/99] fix: oracle keeper --- app/keepers.go | 2 +- proto/nibiru/oracle/v1/tx.proto | 103 +- x/oracle/keeper/msg_server.go | 44 +- x/oracle/keeper/params_test.go | 1 + x/oracle/keeper/sudo.go | 100 -- x/oracle/keeper/sudo_test.go | 95 -- x/oracle/keeper/test_utils.go | 4 +- x/oracle/keeper/update_exchange_rates_test.go | 2 +- x/oracle/types/tx.pb.go | 896 +++++++++++------- x/oracle/types/tx.pb.gw.go | 2 +- 10 files changed, 657 insertions(+), 592 deletions(-) delete mode 100644 x/oracle/keeper/sudo.go delete mode 100644 x/oracle/keeper/sudo_test.go diff --git a/app/keepers.go b/app/keepers.go index 6695a6194..9dd350536 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -617,7 +617,7 @@ func (app *NibiruApp) initAppModules( authzmodule.NewAppModule(appCodec, app.authzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), // Nibiru modules - oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper), + oracle.NewAppModule(appCodec, app.OracleKeeper, app.AccountKeeper, app.BankKeeper, app.SudoKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, *app.StakingKeeper), sudo.NewAppModule(appCodec, app.SudoKeeper), diff --git a/proto/nibiru/oracle/v1/tx.proto b/proto/nibiru/oracle/v1/tx.proto index 4baa5402e..8fa0175e0 100644 --- a/proto/nibiru/oracle/v1/tx.proto +++ b/proto/nibiru/oracle/v1/tx.proto @@ -3,6 +3,7 @@ package nibiru.oracle.v1; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "google/protobuf/duration.proto"; import "nibiru/oracle/v1/oracle.proto"; option go_package = "github.com/NibiruChain/nibiru/v2/x/oracle/types"; @@ -33,7 +34,7 @@ service Msg { rpc EditOracleParams(MsgEditOracleParams) returns (MsgEditOracleParamsResponse) { - option (google.api.http).post = "/nibiru/oracle/edit-oracle-params"; + option (google.api.http).post = "/nibiru/oracle/params"; } } @@ -91,64 +92,100 @@ message MsgDelegateFeedConsent { // type. message MsgDelegateFeedConsentResponse {} -// MsgEditOracleParams: gRPC tx message for updating the x/oracle module params -// [SUDO] Only callable by sudoers. message MsgEditOracleParams { - string sender = 1; + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string sender = 1 [ (gogoproto.moretags) = "yaml:\"sender\"" ]; + + OracleParamsMsg params = 2 [ (gogoproto.moretags) = "yaml:\"params\"" ]; +} - string vote_period = 2 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", +message MsgEditOracleParamsResponse {} + +message OracleParamsMsg { + option (gogoproto.equal) = true; + option (gogoproto.goproto_stringer) = true; + + // VotePeriod defines the number of blocks during which voting takes place. + uint64 vote_period = 1 [ + (gogoproto.moretags) = "yaml:\"vote_period\"", (gogoproto.nullable) = true ]; - // vote_threshold: [cosmossdk.io/math.LegacyDec] TODO: - string vote_threshold = 3 [ + // VoteThreshold specifies the minimum proportion of votes that must be + // received for a ballot to pass. + string vote_threshold = 2 [ + (gogoproto.moretags) = "yaml:\"vote_threshold\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; - - // reward_band: [cosmossdk.io/math.LegacyDec] TODO: - string reward_band = 4 [ + // RewardBand defines a maxium divergence that a price vote can have from the + // weighted median in the ballot. If a vote lies within the valid range + // defined by: + // μ := weightedMedian, + // validRange := μ ± (μ * rewardBand / 2), + // then rewards are added to the validator performance. + // Note that if the reward band is smaller than 1 standard + // deviation, the band is taken to be 1 standard deviation.a price + string reward_band = 3 [ + (gogoproto.moretags) = "yaml:\"reward_band\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; - - repeated string whitelist = 5 [ (gogoproto.nullable) = true ]; - - // slash_fraction: [cosmossdk.io/math.LegacyDec] TODO: - string slash_fraction = 6 [ + // The set of whitelisted markets, or asset pairs, for the module. + // Ex. '["unibi:uusd","ubtc:uusd"]' + repeated string whitelist = 4 [ + (gogoproto.moretags) = "yaml:\"whitelist\"", + (gogoproto.customtype) = "github.com/NibiruChain/nibiru/v2/x/common/asset.Pair", + (gogoproto.nullable) = true + ]; + // SlashFraction returns the proportion of an oracle's stake that gets + // slashed in the event of slashing. `SlashFraction` specifies the exact + // penalty for failing a voting period. + string slash_fraction = 5 [ + (gogoproto.moretags) = "yaml:\"slash_fraction\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; - - string slash_window = 7 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + // SlashWindow returns the number of voting periods that specify a + // "slash window". After each slash window, all oracles that have missed more + // than the penalty threshold are slashed. Missing the penalty threshold is + // synonymous with submitting fewer valid votes than `MinValidPerWindow`. + uint64 slash_window = 6 [ + (gogoproto.moretags) = "yaml:\"slash_window\"", (gogoproto.nullable) = true ]; - - // min_valid_per_window: [cosmossdk.io/math.LegacyDec] TODO: - string min_valid_per_window = 8 [ + string min_valid_per_window = 7 [ + (gogoproto.moretags) = "yaml:\"min_valid_per_window\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; - string twap_lookback_window = 9 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", - (gogoproto.nullable) = true + // Amount of time to look back for TWAP calculations + google.protobuf.Duration twap_lookback_window = 8 [ + (gogoproto.nullable) = true, + (gogoproto.stdduration) = true, + (gogoproto.jsontag) = "twap_lookback_window,omitempty", + (gogoproto.moretags) = "yaml:\"twap_lookback_window\"" ]; - string min_voters = 10 [ - (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", + // The minimum number of voters (i.e. oracle validators) per pair for it to be + // considered a passing ballot. Recommended at least 4. + uint64 min_voters = 9 [ + (gogoproto.moretags) = "yaml:\"min_voters\"", (gogoproto.nullable) = true ]; - // VoteThreshold: [cosmossdk.io/math.LegacyDec] TODO: - string validator_fee_ratio = 11 [ + // The validator fee ratio that is given to validators every epoch. + string validator_fee_ratio = 10 [ + (gogoproto.moretags) = "yaml:\"validator_fee_ratio\"", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = true ]; -} -// MsgEditOracleParamsResponse defines the Msg/EditOracleParams response -// type. -message MsgEditOracleParamsResponse { nibiru.oracle.v1.Params new_params = 1; } + uint64 expiration_blocks = 11 [ + (gogoproto.moretags) = "yaml:\"expiration_blocks\"", + (gogoproto.nullable) = true + ]; +} \ No newline at end of file diff --git a/x/oracle/keeper/msg_server.go b/x/oracle/keeper/msg_server.go index 056340772..7e91bafaf 100644 --- a/x/oracle/keeper/msg_server.go +++ b/x/oracle/keeper/msg_server.go @@ -2,24 +2,27 @@ package keeper import ( "context" - - "github.com/cosmos/cosmos-sdk/types/errors" + "fmt" sdkerrors "cosmossdk.io/errors" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/errors" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/NibiruChain/nibiru/v2/x/oracle/types" + sudokeeper "github.com/NibiruChain/nibiru/v2/x/sudo/keeper" + sudotypes "github.com/NibiruChain/nibiru/v2/x/sudo/types" ) type msgServer struct { Keeper + SudoKeeper sudokeeper.Keeper } // NewMsgServerImpl returns an implementation of the oracle MsgServer interface // for the provided Keeper. -func NewMsgServerImpl(keeper Keeper) types.MsgServer { - return &msgServer{Keeper: keeper} +func NewMsgServerImpl(keeper Keeper, sudoKeeper sudokeeper.Keeper) types.MsgServer { + return &msgServer{Keeper: keeper, SudoKeeper: sudoKeeper} } func (ms msgServer) AggregateExchangeRatePrevote( @@ -170,18 +173,27 @@ func (ms msgServer) DelegateFeedConsent( // EditOracleParams: gRPC tx msg for editing the oracle module params. // [SUDO] Only callable by sudoers. -func (ms msgServer) EditOracleParams( - goCtx context.Context, msg *types.MsgEditOracleParams, -) (resp *types.MsgEditOracleParamsResponse, err error) { +func (ms msgServer) EditOracleParams(goCtx context.Context, msg *types.MsgEditOracleParams) (*types.MsgEditOracleParamsResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) - // Stateless field validation is already performed in msg.ValidateBasic() - // before the current scope is reached. - sender, _ := sdk.AccAddressFromBech32(msg.Sender) - newParams, err := ms.Sudo().EditOracleParams( - ctx, *msg, sender, - ) - resp = &types.MsgEditOracleParamsResponse{ - NewParams: &newParams, + + sender, err := sdk.AccAddressFromBech32(msg.Sender) + if err != nil { + return nil, fmt.Errorf("invalid address") + } + + err = ms.SudoKeeper.CheckPermissions(sender, ctx) + if err != nil { + return nil, sudotypes.ErrUnauthorized + } + + params, err := ms.Keeper.Params.Get(ctx) + if err != nil { + return nil, fmt.Errorf("get oracle params error: %s", err.Error()) } - return resp, err + + mergedParams := mergeOracleParams(msg, params) + + ms.Keeper.UpdateParams(ctx, mergedParams) + + return &types.MsgEditOracleParamsResponse{}, nil } diff --git a/x/oracle/keeper/params_test.go b/x/oracle/keeper/params_test.go index 5dbb0535e..5b31887c2 100644 --- a/x/oracle/keeper/params_test.go +++ b/x/oracle/keeper/params_test.go @@ -5,6 +5,7 @@ import ( "time" "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" "github.com/NibiruChain/nibiru/v2/x/common/asset" diff --git a/x/oracle/keeper/sudo.go b/x/oracle/keeper/sudo.go deleted file mode 100644 index 8af7dbf09..000000000 --- a/x/oracle/keeper/sudo.go +++ /dev/null @@ -1,100 +0,0 @@ -package keeper - -import ( - "fmt" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/NibiruChain/nibiru/v2/x/common/asset" - oracletypes "github.com/NibiruChain/nibiru/v2/x/oracle/types" -) - -// Sudo extends the Keeper with sudo functions. See sudo.go. Sudo is syntactic -// sugar to separate admin calls off from the other Keeper methods. -// -// These Sudo functions should: -// 1. Not be called in other methods in the x/perp module. -// 2. Only be callable by the x/sudo root or sudo contracts. -// -// The intention behind "Keeper.Sudo()" is to make it more obvious to the -// developer that an unsafe function is being used when it's called. -func (k Keeper) Sudo() sudoExtension { return sudoExtension{k} } - -type sudoExtension struct{ Keeper } - -// ------------------------------------------------------------------ -// Admin.EditOracleParams - -func (k sudoExtension) EditOracleParams( - ctx sdk.Context, newParams oracletypes.MsgEditOracleParams, - sender sdk.AccAddress, -) (paramsAfter oracletypes.Params, err error) { - if err := k.sudoKeeper.CheckPermissions(sender, ctx); err != nil { - return paramsAfter, err - } - - params, err := k.Params.Get(ctx) - if err != nil { - return paramsAfter, fmt.Errorf("%w: failed to read oracle params", err) - } - - paramsAfter = MergeOracleParams(newParams, params) - k.UpdateParams(ctx, paramsAfter) - return paramsAfter, paramsAfter.Validate() -} - -// MergeOracleParams: Takes the given oracle params and merges them into the -// existing partial params, keeping any existing values that are not set in the -// partial. -func MergeOracleParams( - partial oracletypes.MsgEditOracleParams, - oracleParams oracletypes.Params, -) oracletypes.Params { - if partial.VotePeriod != nil { - oracleParams.VotePeriod = partial.VotePeriod.Uint64() - } - - if partial.VoteThreshold != nil { - oracleParams.VoteThreshold = *partial.VoteThreshold - } - - if partial.RewardBand != nil { - oracleParams.RewardBand = *partial.RewardBand - } - - if partial.Whitelist != nil { - whitelist := make([]asset.Pair, len(partial.Whitelist)) - for i, pair := range partial.Whitelist { - whitelist[i] = asset.MustNewPair(pair) - } - - oracleParams.Whitelist = whitelist - } - - if partial.SlashFraction != nil { - oracleParams.SlashFraction = *partial.SlashFraction - } - - if partial.SlashWindow != nil { - oracleParams.SlashWindow = partial.SlashWindow.Uint64() - } - - if partial.MinValidPerWindow != nil { - oracleParams.MinValidPerWindow = *partial.MinValidPerWindow - } - - if partial.TwapLookbackWindow != nil { - oracleParams.TwapLookbackWindow = time.Duration(partial.TwapLookbackWindow.Int64()) - } - - if partial.MinVoters != nil { - oracleParams.MinVoters = partial.MinVoters.Uint64() - } - - if partial.ValidatorFeeRatio != nil { - oracleParams.ValidatorFeeRatio = *partial.ValidatorFeeRatio - } - - return oracleParams -} diff --git a/x/oracle/keeper/sudo_test.go b/x/oracle/keeper/sudo_test.go deleted file mode 100644 index f52d7f427..000000000 --- a/x/oracle/keeper/sudo_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/NibiruChain/nibiru/v2/x/common/testutil" - "github.com/NibiruChain/nibiru/v2/x/common/testutil/testapp" - oraclekeeper "github.com/NibiruChain/nibiru/v2/x/oracle/keeper" - oracletypes "github.com/NibiruChain/nibiru/v2/x/oracle/types" -) - -// TestSuiteOracleSudo tests sudo-only functions in the oracle module. -func TestSuiteOracleSudo(t *testing.T) { - suite.Run(t, new(SuiteOracleSudo)) -} - -type SuiteOracleSudo struct { - suite.Suite -} - -// TestEditOracleParams tests the business logic for -// "oraclekeeper.Keeper.Sudo().EditOracleParams" -func (s *SuiteOracleSudo) TestEditOracleParams() { - nibiru, ctx := testapp.NewNibiruTestAppAndContext() - - // Change to all non-defaults to test EditOracleParams as a setter . - votePeriod := math.NewInt(1_234) - voteThreshold := math.LegacyMustNewDecFromStr("0.4") - rewardBand := math.LegacyMustNewDecFromStr("0.5") - whitelist := []string{"aave:usdc", "sol:usdc"} - slashFraction := math.LegacyMustNewDecFromStr("0.5") - slashWindow := math.NewInt(2_000) - minValidPerWindow := math.LegacyMustNewDecFromStr("0.5") - twapLookbackWindow := math.NewInt(int64(time.Second * 30)) - minVoters := math.NewInt(2) - validatorFeeRatio := math.LegacyMustNewDecFromStr("0.7") - msgEditParams := oracletypes.MsgEditOracleParams{ - VotePeriod: &votePeriod, - VoteThreshold: &voteThreshold, - RewardBand: &rewardBand, - Whitelist: whitelist, - SlashFraction: &slashFraction, - SlashWindow: &slashWindow, - MinValidPerWindow: &minValidPerWindow, - TwapLookbackWindow: &twapLookbackWindow, - MinVoters: &minVoters, - ValidatorFeeRatio: &validatorFeeRatio, - } - - s.T().Log("Params before MUST NOT be equal to default") - defaultParams := oracletypes.DefaultParams() - currParams, err := nibiru.OracleKeeper.Params.Get(ctx) - s.NoError(err) - s.Equal(currParams, defaultParams, - "Current params should be eqaul to defaults") - partialParams := msgEditParams - fullParams := oraclekeeper.MergeOracleParams(partialParams, defaultParams) - s.NotEqual(defaultParams, fullParams, - "new params after merge should not be defaults") - - invalidSender := testutil.AccAddress() - oracleMsgServer := oraclekeeper.NewMsgServerImpl(nibiru.OracleKeeper) - goCtx := sdk.WrapSDKContext(ctx) - msgEditParams.Sender = invalidSender.String() - _, err = oracleMsgServer.EditOracleParams( - goCtx, &msgEditParams, - ) - s.Error(err) - - s.T().Log("Params after MUST be equal to new ones with partialParams") - okSender := testapp.DefaultSudoRoot() - msgEditParams.Sender = okSender.String() - resp, err := oracleMsgServer.EditOracleParams( - goCtx, &msgEditParams, - ) - s.Require().NoError(err) - s.EqualValues(resp.NewParams.String(), fullParams.String()) - - s.T().Log("Changing to invalid params MUST fail") - slashWindow = math.NewInt(1_233) // slashWindow < vote period is not allowed. - msgEditParams = oracletypes.MsgEditOracleParams{ - Sender: okSender.String(), - SlashWindow: &slashWindow, - } - _, err = oracleMsgServer.EditOracleParams( - goCtx, &msgEditParams, - ) - s.Require().Error(err) - s.ErrorContains(err, "oracle parameter SlashWindow must be greater") -} diff --git a/x/oracle/keeper/test_utils.go b/x/oracle/keeper/test_utils.go index 692b52623..3944bb962 100644 --- a/x/oracle/keeper/test_utils.go +++ b/x/oracle/keeper/test_utils.go @@ -129,7 +129,7 @@ type TestFixture struct { OracleKeeper Keeper StakingKeeper stakingkeeper.Keeper DistrKeeper distrkeeper.Keeper - SudoKeeper types.SudoKeeper + SudoKeeper sudokeeper.Keeper } // CreateTestFixture nolint @@ -326,7 +326,7 @@ func Setup(t *testing.T) (TestFixture, types.MsgServer) { params, _ = fixture.OracleKeeper.Params.Get(fixture.Ctx) - h := NewMsgServerImpl(fixture.OracleKeeper) + h := NewMsgServerImpl(fixture.OracleKeeper, fixture.SudoKeeper) sh := stakingkeeper.NewMsgServerImpl(&fixture.StakingKeeper) // Validator created diff --git a/x/oracle/keeper/update_exchange_rates_test.go b/x/oracle/keeper/update_exchange_rates_test.go index 9c3ed2c95..77f10ce39 100644 --- a/x/oracle/keeper/update_exchange_rates_test.go +++ b/x/oracle/keeper/update_exchange_rates_test.go @@ -135,7 +135,7 @@ func TestOracleTally(t *testing.T) { votes := types.ExchangeRateVotes{} rates, valAddrs, stakingKeeper := types.GenerateRandomTestCase() fixture.OracleKeeper.StakingKeeper = stakingKeeper - h := NewMsgServerImpl(fixture.OracleKeeper) + h := NewMsgServerImpl(fixture.OracleKeeper, fixture.SudoKeeper) for i, rate := range rates { decExchangeRate := sdkmath.LegacyNewDecWithPrec(int64(rate*math.Pow10(OracleDecPrecision)), int64(OracleDecPrecision)) diff --git a/x/oracle/types/tx.pb.go b/x/oracle/types/tx.pb.go index 9c33a0e7f..aac5d9c01 100644 --- a/x/oracle/types/tx.pb.go +++ b/x/oracle/types/tx.pb.go @@ -6,23 +6,28 @@ package types import ( context "context" fmt "fmt" + github_com_NibiruChain_nibiru_v2_x_common_asset "github.com/NibiruChain/nibiru/v2/x/common/asset" github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/gogoproto/gogoproto" grpc1 "github.com/cosmos/gogoproto/grpc" proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" + _ "google.golang.org/protobuf/types/known/durationpb" io "io" math "math" math_bits "math/bits" + time "time" ) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal var _ = fmt.Errorf var _ = math.Inf +var _ = time.Kitchen // This is a compile-time assertion to ensure that this generated file // is compatible with the proto package it is being compiled against. @@ -277,25 +282,9 @@ func (m *MsgDelegateFeedConsentResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgDelegateFeedConsentResponse proto.InternalMessageInfo -// MsgEditOracleParams: gRPC tx message for updating the x/oracle module params -// [SUDO] Only callable by sudoers. type MsgEditOracleParams struct { - Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` - VotePeriod *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,2,opt,name=vote_period,json=votePeriod,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"vote_period,omitempty"` - // vote_threshold: [cosmossdk.io/math.LegacyDec] TODO: - VoteThreshold *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=vote_threshold,json=voteThreshold,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"vote_threshold,omitempty"` - // reward_band: [cosmossdk.io/math.LegacyDec] TODO: - RewardBand *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=reward_band,json=rewardBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"reward_band,omitempty"` - Whitelist []string `protobuf:"bytes,5,rep,name=whitelist,proto3" json:"whitelist,omitempty"` - // slash_fraction: [cosmossdk.io/math.LegacyDec] TODO: - SlashFraction *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,6,opt,name=slash_fraction,json=slashFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"slash_fraction,omitempty"` - SlashWindow *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,7,opt,name=slash_window,json=slashWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"slash_window,omitempty"` - // min_valid_per_window: [cosmossdk.io/math.LegacyDec] TODO: - MinValidPerWindow *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,8,opt,name=min_valid_per_window,json=minValidPerWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_valid_per_window,omitempty"` - TwapLookbackWindow *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,9,opt,name=twap_lookback_window,json=twapLookbackWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"twap_lookback_window,omitempty"` - MinVoters *github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,10,opt,name=min_voters,json=minVoters,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_voters,omitempty"` - // VoteThreshold: [cosmossdk.io/math.LegacyDec] TODO: - ValidatorFeeRatio *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,11,opt,name=validator_fee_ratio,json=validatorFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"validator_fee_ratio,omitempty"` + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty" yaml:"sender"` + Params *OracleParamsMsg `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty" yaml:"params"` } func (m *MsgEditOracleParams) Reset() { *m = MsgEditOracleParams{} } @@ -331,24 +320,7 @@ func (m *MsgEditOracleParams) XXX_DiscardUnknown() { var xxx_messageInfo_MsgEditOracleParams proto.InternalMessageInfo -func (m *MsgEditOracleParams) GetSender() string { - if m != nil { - return m.Sender - } - return "" -} - -func (m *MsgEditOracleParams) GetWhitelist() []string { - if m != nil { - return m.Whitelist - } - return nil -} - -// MsgEditOracleParamsResponse defines the Msg/EditOracleParams response -// type. type MsgEditOracleParamsResponse struct { - NewParams *Params `protobuf:"bytes,1,opt,name=new_params,json=newParams,proto3" json:"new_params,omitempty"` } func (m *MsgEditOracleParamsResponse) Reset() { *m = MsgEditOracleParamsResponse{} } @@ -384,13 +356,112 @@ func (m *MsgEditOracleParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgEditOracleParamsResponse proto.InternalMessageInfo -func (m *MsgEditOracleParamsResponse) GetNewParams() *Params { +type OracleParamsMsg struct { + // VotePeriod defines the number of blocks during which voting takes place. + VotePeriod uint64 `protobuf:"varint,1,opt,name=vote_period,json=votePeriod,proto3" json:"vote_period,omitempty" yaml:"vote_period"` + // VoteThreshold specifies the minimum proportion of votes that must be + // received for a ballot to pass. + VoteThreshold *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,2,opt,name=vote_threshold,json=voteThreshold,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"vote_threshold,omitempty" yaml:"vote_threshold"` + // RewardBand defines a maxium divergence that a price vote can have from the + // weighted median in the ballot. If a vote lies within the valid range + // defined by: + // μ := weightedMedian, + // validRange := μ ± (μ * rewardBand / 2), + // then rewards are added to the validator performance. + // Note that if the reward band is smaller than 1 standard + // deviation, the band is taken to be 1 standard deviation.a price + RewardBand *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,3,opt,name=reward_band,json=rewardBand,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"reward_band,omitempty" yaml:"reward_band"` + // The set of whitelisted markets, or asset pairs, for the module. + // Ex. '["unibi:uusd","ubtc:uusd"]' + Whitelist []github_com_NibiruChain_nibiru_v2_x_common_asset.Pair `protobuf:"bytes,4,rep,name=whitelist,proto3,customtype=github.com/NibiruChain/nibiru/v2/x/common/asset.Pair" json:"whitelist,omitempty" yaml:"whitelist"` + // SlashFraction returns the proportion of an oracle's stake that gets + // slashed in the event of slashing. `SlashFraction` specifies the exact + // penalty for failing a voting period. + SlashFraction *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,5,opt,name=slash_fraction,json=slashFraction,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"slash_fraction,omitempty" yaml:"slash_fraction"` + // SlashWindow returns the number of voting periods that specify a + // "slash window". After each slash window, all oracles that have missed more + // than the penalty threshold are slashed. Missing the penalty threshold is + // synonymous with submitting fewer valid votes than `MinValidPerWindow`. + SlashWindow uint64 `protobuf:"varint,6,opt,name=slash_window,json=slashWindow,proto3" json:"slash_window,omitempty" yaml:"slash_window"` + MinValidPerWindow *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,7,opt,name=min_valid_per_window,json=minValidPerWindow,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"min_valid_per_window,omitempty" yaml:"min_valid_per_window"` + // Amount of time to look back for TWAP calculations + TwapLookbackWindow *time.Duration `protobuf:"bytes,8,opt,name=twap_lookback_window,json=twapLookbackWindow,proto3,stdduration" json:"twap_lookback_window,omitempty" yaml:"twap_lookback_window"` + // The minimum number of voters (i.e. oracle validators) per pair for it to be + // considered a passing ballot. Recommended at least 4. + MinVoters uint64 `protobuf:"varint,9,opt,name=min_voters,json=minVoters,proto3" json:"min_voters,omitempty" yaml:"min_voters"` + // The validator fee ratio that is given to validators every epoch. + ValidatorFeeRatio *github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,10,opt,name=validator_fee_ratio,json=validatorFeeRatio,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"validator_fee_ratio,omitempty" yaml:"validator_fee_ratio"` + ExpirationBlocks uint64 `protobuf:"varint,11,opt,name=expiration_blocks,json=expirationBlocks,proto3" json:"expiration_blocks,omitempty" yaml:"expiration_blocks"` +} + +func (m *OracleParamsMsg) Reset() { *m = OracleParamsMsg{} } +func (m *OracleParamsMsg) String() string { return proto.CompactTextString(m) } +func (*OracleParamsMsg) ProtoMessage() {} +func (*OracleParamsMsg) Descriptor() ([]byte, []int) { + return fileDescriptor_11e362c65eb610f4, []int{8} +} +func (m *OracleParamsMsg) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *OracleParamsMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_OracleParamsMsg.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *OracleParamsMsg) XXX_Merge(src proto.Message) { + xxx_messageInfo_OracleParamsMsg.Merge(m, src) +} +func (m *OracleParamsMsg) XXX_Size() int { + return m.Size() +} +func (m *OracleParamsMsg) XXX_DiscardUnknown() { + xxx_messageInfo_OracleParamsMsg.DiscardUnknown(m) +} + +var xxx_messageInfo_OracleParamsMsg proto.InternalMessageInfo + +func (m *OracleParamsMsg) GetVotePeriod() uint64 { if m != nil { - return m.NewParams + return m.VotePeriod + } + return 0 +} + +func (m *OracleParamsMsg) GetSlashWindow() uint64 { + if m != nil { + return m.SlashWindow + } + return 0 +} + +func (m *OracleParamsMsg) GetTwapLookbackWindow() *time.Duration { + if m != nil { + return m.TwapLookbackWindow } return nil } +func (m *OracleParamsMsg) GetMinVoters() uint64 { + if m != nil { + return m.MinVoters + } + return 0 +} + +func (m *OracleParamsMsg) GetExpirationBlocks() uint64 { + if m != nil { + return m.ExpirationBlocks + } + return 0 +} + func init() { proto.RegisterType((*MsgAggregateExchangeRatePrevote)(nil), "nibiru.oracle.v1.MsgAggregateExchangeRatePrevote") proto.RegisterType((*MsgAggregateExchangeRatePrevoteResponse)(nil), "nibiru.oracle.v1.MsgAggregateExchangeRatePrevoteResponse") @@ -400,70 +471,168 @@ func init() { proto.RegisterType((*MsgDelegateFeedConsentResponse)(nil), "nibiru.oracle.v1.MsgDelegateFeedConsentResponse") proto.RegisterType((*MsgEditOracleParams)(nil), "nibiru.oracle.v1.MsgEditOracleParams") proto.RegisterType((*MsgEditOracleParamsResponse)(nil), "nibiru.oracle.v1.MsgEditOracleParamsResponse") + proto.RegisterType((*OracleParamsMsg)(nil), "nibiru.oracle.v1.OracleParamsMsg") } func init() { proto.RegisterFile("nibiru/oracle/v1/tx.proto", fileDescriptor_11e362c65eb610f4) } var fileDescriptor_11e362c65eb610f4 = []byte{ - // 917 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x96, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0xc7, 0xe3, 0x26, 0x5d, 0xb2, 0xb3, 0xa4, 0x4d, 0xbd, 0x69, 0xe4, 0x6c, 0x83, 0x1d, 0x5c, - 0x08, 0xc9, 0x61, 0x6d, 0x12, 0x24, 0x10, 0x3d, 0x41, 0xda, 0x46, 0xaa, 0xc4, 0xd2, 0x60, 0x41, - 0x90, 0x38, 0x60, 0x66, 0xd7, 0x2f, 0xb6, 0x15, 0xaf, 0xc7, 0x9a, 0x99, 0xee, 0xa6, 0x57, 0xc4, - 0x01, 0x6e, 0x48, 0x3d, 0x71, 0xcb, 0x07, 0x40, 0xe2, 0x6b, 0xf4, 0x58, 0x89, 0x0b, 0xe2, 0xb0, - 0x42, 0x09, 0x42, 0x9c, 0x38, 0xec, 0x27, 0x40, 0x33, 0x1e, 0xbb, 0xdb, 0xcd, 0xb6, 0xcd, 0xee, - 0x29, 0xce, 0xbc, 0xff, 0xfc, 0xde, 0xff, 0x3d, 0x7b, 0xde, 0x2c, 0x5a, 0x4b, 0xe3, 0x76, 0x4c, - 0x1f, 0xb9, 0x84, 0xe2, 0x4e, 0x02, 0x6e, 0x6f, 0xc7, 0xe5, 0x27, 0x4e, 0x46, 0x09, 0x27, 0xfa, - 0x72, 0x1e, 0x72, 0xf2, 0x90, 0xd3, 0xdb, 0x69, 0xac, 0x84, 0x24, 0x24, 0x32, 0xe8, 0x8a, 0xa7, - 0x5c, 0xd7, 0x58, 0x0f, 0x09, 0x09, 0x13, 0x70, 0x71, 0x16, 0xbb, 0x38, 0x4d, 0x09, 0xc7, 0x3c, - 0x26, 0x29, 0x53, 0xd1, 0xb7, 0x2e, 0x24, 0x50, 0x3c, 0x19, 0xb6, 0x7f, 0xd3, 0x90, 0xd5, 0x62, - 0xe1, 0xa7, 0x61, 0x48, 0x21, 0xc4, 0x1c, 0xee, 0x9f, 0x74, 0x22, 0x9c, 0x86, 0xe0, 0x61, 0x0e, - 0x07, 0x14, 0x7a, 0x84, 0x83, 0x7e, 0x1b, 0x2d, 0x44, 0x98, 0x45, 0x86, 0xb6, 0xa1, 0x6d, 0x55, - 0xf7, 0xae, 0x0f, 0x07, 0x56, 0xed, 0x31, 0xee, 0x26, 0x77, 0x6c, 0xb1, 0x6a, 0x7b, 0x32, 0xa8, - 0x6f, 0xa3, 0xca, 0x11, 0x40, 0x00, 0xd4, 0xb8, 0x22, 0x65, 0x37, 0x86, 0x03, 0x6b, 0x29, 0x97, - 0xe5, 0xeb, 0xb6, 0xa7, 0x04, 0xfa, 0x2e, 0xaa, 0xf6, 0x70, 0x12, 0x07, 0x98, 0x13, 0x6a, 0xcc, - 0x4b, 0xf5, 0xca, 0x70, 0x60, 0x2d, 0xe7, 0xea, 0x32, 0x64, 0x7b, 0xcf, 0x65, 0x77, 0x16, 0x7f, - 0x3c, 0xb5, 0xe6, 0xfe, 0x3d, 0xb5, 0xe6, 0xec, 0x6d, 0xf4, 0xde, 0x6b, 0x0c, 0x7b, 0xc0, 0x32, - 0x92, 0x32, 0xb0, 0xff, 0xd3, 0xd0, 0xfa, 0xcb, 0xb4, 0x87, 0xaa, 0x32, 0x86, 0x13, 0x7e, 0xb1, - 0x32, 0xb1, 0x6a, 0x7b, 0x32, 0xa8, 0x7f, 0x82, 0xae, 0x81, 0xda, 0xe8, 0x53, 0xcc, 0x81, 0xa9, - 0x0a, 0xd7, 0x86, 0x03, 0xeb, 0x66, 0x2e, 0x7f, 0x31, 0x6e, 0x7b, 0x4b, 0x30, 0x92, 0x89, 0x8d, - 0xf4, 0x66, 0x7e, 0xaa, 0xde, 0x2c, 0x4c, 0xdb, 0x9b, 0x4d, 0xf4, 0xce, 0xab, 0xea, 0x2d, 0x1b, - 0xf3, 0x83, 0x86, 0x56, 0x5b, 0x2c, 0xbc, 0x07, 0x89, 0xd4, 0xed, 0x03, 0x04, 0x77, 0x45, 0x20, - 0xe5, 0xba, 0x8b, 0x16, 0x49, 0x06, 0x54, 0xe6, 0xcf, 0xdb, 0x52, 0x1f, 0x0e, 0xac, 0xeb, 0x79, - 0xfe, 0x22, 0x62, 0x7b, 0xa5, 0x48, 0x6c, 0x08, 0x14, 0x47, 0x35, 0x66, 0x64, 0x43, 0x11, 0xb1, - 0xbd, 0x52, 0x34, 0x62, 0x77, 0x03, 0x99, 0x93, 0x5d, 0x94, 0x46, 0xff, 0xa9, 0xa0, 0x7a, 0x8b, - 0x85, 0xf7, 0x83, 0x98, 0x3f, 0x94, 0x9f, 0xed, 0x01, 0xa6, 0xb8, 0xcb, 0xf4, 0x55, 0x54, 0x61, - 0x90, 0x8a, 0x8e, 0x4a, 0x8f, 0x9e, 0xfa, 0x4f, 0x7f, 0x88, 0x6a, 0xe2, 0x0b, 0xf0, 0x33, 0xa0, - 0x31, 0x09, 0x94, 0x1f, 0xe7, 0xe9, 0xc0, 0xd2, 0xfe, 0x1c, 0x58, 0x9b, 0x61, 0xcc, 0xa3, 0x47, - 0x6d, 0xa7, 0x43, 0xba, 0x6e, 0x87, 0xb0, 0x2e, 0x61, 0xea, 0x4f, 0x93, 0x05, 0xc7, 0x2e, 0x7f, - 0x9c, 0x01, 0x73, 0x1e, 0xa4, 0xdc, 0x43, 0x02, 0x71, 0x20, 0x09, 0xfa, 0x57, 0xe8, 0x9a, 0x04, - 0xf2, 0x88, 0x02, 0x8b, 0x48, 0x12, 0xa8, 0x57, 0x38, 0x0d, 0xf3, 0x1e, 0x74, 0xbc, 0x25, 0x41, - 0xf9, 0xb2, 0x80, 0x08, 0x9f, 0x14, 0xfa, 0x98, 0x06, 0x7e, 0x1b, 0xa7, 0x81, 0x7a, 0xd1, 0xd3, - 0x32, 0x51, 0x8e, 0xd8, 0xc3, 0x69, 0xa0, 0xdb, 0xa8, 0xda, 0x8f, 0x62, 0x0e, 0x49, 0xcc, 0xb8, - 0x71, 0x75, 0x63, 0x7e, 0xab, 0xba, 0xb7, 0x20, 0x70, 0xde, 0xf3, 0x65, 0x51, 0x0b, 0x4b, 0x30, - 0x8b, 0xfc, 0x23, 0x8a, 0x3b, 0x62, 0x46, 0x18, 0x95, 0xd9, 0x6a, 0x91, 0x94, 0x7d, 0x05, 0xd1, - 0xbf, 0x40, 0x6f, 0xe6, 0xd8, 0x7e, 0x9c, 0x06, 0xa4, 0x6f, 0xbc, 0x31, 0x53, 0xd3, 0x6b, 0x92, - 0xf1, 0xb5, 0x44, 0xe8, 0x3e, 0x5a, 0xe9, 0xc6, 0xa9, 0x2f, 0x3f, 0x71, 0xf1, 0x2e, 0x0b, 0xf4, - 0xe2, 0x4c, 0x7e, 0x6f, 0x74, 0xe3, 0xf4, 0x50, 0xa0, 0x0e, 0x80, 0xaa, 0x04, 0xdf, 0xa1, 0x15, - 0xde, 0xc7, 0x99, 0x9f, 0x10, 0x72, 0xdc, 0xc6, 0x9d, 0xe3, 0x22, 0x41, 0x75, 0x26, 0xef, 0xba, - 0x60, 0x7d, 0xa6, 0x50, 0x2a, 0x43, 0x0b, 0x21, 0x59, 0x02, 0xe1, 0x40, 0x99, 0x81, 0x66, 0xe2, - 0x56, 0x85, 0x71, 0x09, 0xd0, 0xbf, 0x45, 0xf5, 0xf2, 0xc0, 0xfb, 0x47, 0x20, 0x27, 0x4d, 0x4c, - 0x8c, 0xda, 0x6c, 0x0d, 0x29, 0x51, 0xfb, 0x20, 0x86, 0x43, 0x4c, 0xec, 0x43, 0x74, 0x6b, 0xc2, - 0x39, 0x2b, 0xce, 0xa1, 0xfe, 0x11, 0x42, 0x29, 0xf4, 0xfd, 0x4c, 0xae, 0xca, 0x33, 0x57, 0xdb, - 0x35, 0x9c, 0xf1, 0x0b, 0xca, 0x51, 0xbb, 0xaa, 0x29, 0xf4, 0xf3, 0xc7, 0xdd, 0x9f, 0xae, 0xa2, - 0xf9, 0x16, 0x0b, 0xf5, 0x5f, 0x35, 0xb4, 0xfe, 0xca, 0x4b, 0x66, 0xe7, 0x22, 0xed, 0x35, 0x63, - 0xbe, 0xf1, 0xf1, 0xd4, 0x5b, 0xca, 0xb9, 0x62, 0x7e, 0xff, 0xfb, 0xdf, 0x4f, 0xae, 0x18, 0xf6, - 0xaa, 0xfb, 0xe2, 0xf5, 0x98, 0x29, 0x37, 0xa7, 0x1a, 0x5a, 0x7b, 0xf9, 0xb5, 0xe1, 0x5c, 0x3e, - 0xb1, 0xd0, 0x37, 0x3e, 0x9c, 0x4e, 0x5f, 0xba, 0xbc, 0x25, 0x5d, 0xde, 0xb4, 0xeb, 0x63, 0x2e, - 0xa5, 0xc5, 0x5f, 0x34, 0x54, 0x9f, 0x34, 0xc0, 0xb7, 0x26, 0x26, 0x9b, 0xa0, 0x6c, 0xbc, 0x7f, - 0x59, 0x65, 0x69, 0x68, 0x53, 0x1a, 0xda, 0xb0, 0xcd, 0x31, 0x43, 0xf9, 0xe5, 0xd5, 0x2c, 0x46, - 0xbc, 0xfe, 0x44, 0x43, 0xcb, 0x17, 0x66, 0xf6, 0xbb, 0x13, 0xd3, 0x8d, 0xcb, 0x1a, 0xcd, 0x4b, - 0xc9, 0x4a, 0x4b, 0xdb, 0xd2, 0xd2, 0x6d, 0xfb, 0xed, 0x31, 0x4b, 0x10, 0xc4, 0xbc, 0x99, 0x3f, - 0x37, 0xf3, 0xcf, 0x76, 0xef, 0xc1, 0xd3, 0x33, 0x53, 0x7b, 0x76, 0x66, 0x6a, 0x7f, 0x9d, 0x99, - 0xda, 0xcf, 0xe7, 0xe6, 0xdc, 0xb3, 0x73, 0x73, 0xee, 0x8f, 0x73, 0x73, 0xee, 0x1b, 0x77, 0xe4, - 0xe0, 0x7c, 0x2e, 0x31, 0x77, 0x23, 0x1c, 0xa7, 0x05, 0xb2, 0xb7, 0xeb, 0x9e, 0x14, 0x5c, 0x79, - 0x8a, 0xda, 0x15, 0xf9, 0xeb, 0xe9, 0x83, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x15, 0xe1, - 0xb0, 0xbf, 0x09, 0x00, 0x00, + // 1100 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x41, 0x6b, 0x24, 0x45, + 0x14, 0x4e, 0x6f, 0x62, 0xcc, 0xd4, 0x98, 0xdd, 0xa4, 0x27, 0x59, 0x3b, 0x93, 0xa4, 0x3b, 0x96, + 0x1a, 0xb3, 0x60, 0xba, 0x4d, 0x14, 0xd1, 0x08, 0xa2, 0xb3, 0xd9, 0xc8, 0x42, 0x46, 0x87, 0x42, + 0x56, 0xf0, 0x32, 0xd4, 0x4c, 0x57, 0x7a, 0x9a, 0x74, 0x77, 0x35, 0x5d, 0x95, 0x4c, 0x02, 0xe2, + 0x41, 0x04, 0x3d, 0x0a, 0x82, 0xc4, 0xdb, 0xfc, 0x00, 0xc1, 0xbf, 0xb1, 0xc7, 0x05, 0x2f, 0xe2, + 0x61, 0x94, 0xc4, 0xc3, 0xe2, 0x41, 0x61, 0xee, 0x82, 0x54, 0x75, 0x4d, 0x4f, 0x67, 0x32, 0xbb, + 0x9b, 0xc1, 0xd3, 0x4c, 0xbd, 0xef, 0xab, 0xf7, 0xbe, 0xf7, 0xaa, 0xea, 0xbd, 0x06, 0x4b, 0x91, + 0xdf, 0xf0, 0x93, 0x23, 0x87, 0x26, 0xb8, 0x19, 0x10, 0xe7, 0x78, 0xcb, 0xe1, 0x27, 0x76, 0x9c, + 0x50, 0x4e, 0xf5, 0xb9, 0x14, 0xb2, 0x53, 0xc8, 0x3e, 0xde, 0x2a, 0x2f, 0x78, 0xd4, 0xa3, 0x12, + 0x74, 0xc4, 0xbf, 0x94, 0x57, 0x5e, 0xf1, 0x28, 0xf5, 0x02, 0xe2, 0xe0, 0xd8, 0x77, 0x70, 0x14, + 0x51, 0x8e, 0xb9, 0x4f, 0x23, 0xa6, 0x50, 0x53, 0xa1, 0x72, 0xd5, 0x38, 0x3a, 0x70, 0xdc, 0xa3, + 0x44, 0x12, 0x14, 0xbe, 0x7a, 0x45, 0x80, 0x8a, 0x27, 0x61, 0xf8, 0xb3, 0x06, 0xac, 0x2a, 0xf3, + 0x3e, 0xf4, 0xbc, 0x84, 0x78, 0x98, 0x93, 0x7b, 0x27, 0xcd, 0x16, 0x8e, 0x3c, 0x82, 0x30, 0x27, + 0xb5, 0x84, 0x1c, 0x53, 0x4e, 0xf4, 0x97, 0xc1, 0x54, 0x0b, 0xb3, 0x96, 0xa1, 0xad, 0x69, 0x1b, + 0x85, 0xca, 0xad, 0x5e, 0xd7, 0x2a, 0x9e, 0xe2, 0x30, 0xd8, 0x81, 0xc2, 0x0a, 0x91, 0x04, 0xf5, + 0x3b, 0x60, 0xfa, 0x80, 0x10, 0x97, 0x24, 0xc6, 0x0d, 0x49, 0x9b, 0xef, 0x75, 0xad, 0xd9, 0x94, + 0x96, 0xda, 0x21, 0x52, 0x04, 0x7d, 0x1b, 0x14, 0x8e, 0x71, 0xe0, 0xbb, 0x98, 0xd3, 0xc4, 0x98, + 0x94, 0xec, 0x85, 0x5e, 0xd7, 0x9a, 0x4b, 0xd9, 0x19, 0x04, 0xd1, 0x80, 0xb6, 0x33, 0xf3, 0x6d, + 0xc7, 0x9a, 0x78, 0xdc, 0xb1, 0x26, 0xe0, 0x1d, 0xf0, 0xda, 0x33, 0x04, 0x23, 0xc2, 0x62, 0x1a, + 0x31, 0x02, 0xff, 0xd6, 0xc0, 0xca, 0x93, 0xb8, 0x0f, 0x54, 0x66, 0x0c, 0x07, 0xfc, 0x6a, 0x66, + 0xc2, 0x0a, 0x91, 0x04, 0xf5, 0x0f, 0xc0, 0x4d, 0xa2, 0x36, 0xd6, 0x13, 0xcc, 0x09, 0x53, 0x19, + 0x2e, 0xf5, 0xba, 0xd6, 0x62, 0x4a, 0xbf, 0x8c, 0x43, 0x34, 0x4b, 0x72, 0x91, 0x58, 0xae, 0x36, + 0x93, 0x63, 0xd5, 0x66, 0x6a, 0xdc, 0xda, 0xac, 0x83, 0x57, 0x9e, 0x96, 0x6f, 0x56, 0x98, 0xaf, + 0x35, 0x70, 0xbb, 0xca, 0xbc, 0x5d, 0x12, 0x48, 0xde, 0x1e, 0x21, 0xee, 0x5d, 0x01, 0x44, 0x5c, + 0x77, 0xc0, 0x0c, 0x8d, 0x49, 0x22, 0xe3, 0xa7, 0x65, 0x29, 0xf5, 0xba, 0xd6, 0xad, 0x34, 0x7e, + 0x1f, 0x81, 0x28, 0x23, 0x89, 0x0d, 0xae, 0xf2, 0xa3, 0x0a, 0x93, 0xdb, 0xd0, 0x47, 0x20, 0xca, + 0x48, 0x39, 0xb9, 0x6b, 0xc0, 0x1c, 0xad, 0x22, 0x13, 0x7a, 0xa6, 0x81, 0x52, 0x95, 0x79, 0xf7, + 0x5c, 0x9f, 0x7f, 0x22, 0xaf, 0x6d, 0x0d, 0x27, 0x38, 0x94, 0x15, 0x65, 0x24, 0x12, 0x15, 0xd5, + 0x86, 0x2b, 0x9a, 0xda, 0x21, 0x52, 0x04, 0x7d, 0x1f, 0x4c, 0xc7, 0x72, 0x93, 0x54, 0x57, 0xdc, + 0x7e, 0xc9, 0x1e, 0x7e, 0x77, 0x76, 0xde, 0x75, 0x95, 0x79, 0x79, 0x6f, 0xe9, 0x56, 0x88, 0x94, + 0x8f, 0x9c, 0xf8, 0x55, 0xb0, 0x3c, 0x42, 0x59, 0xa6, 0xfc, 0x9f, 0x19, 0x70, 0x6b, 0xc8, 0xaf, + 0xfe, 0x1e, 0x28, 0x8a, 0xfb, 0x59, 0x8f, 0x49, 0xe2, 0x53, 0x57, 0x4a, 0x9f, 0xaa, 0x94, 0x1f, + 0x76, 0x2d, 0xad, 0xd7, 0xb5, 0x74, 0x75, 0xc4, 0x03, 0x02, 0x44, 0x40, 0xac, 0x6a, 0x72, 0xa1, + 0x47, 0xe0, 0xa6, 0xc4, 0x78, 0x2b, 0x21, 0xac, 0x45, 0x03, 0x57, 0x55, 0xfb, 0x23, 0xb1, 0xff, + 0xb7, 0xae, 0xb5, 0xee, 0xf9, 0xbc, 0x75, 0xd4, 0xb0, 0x9b, 0x34, 0x74, 0x9a, 0x94, 0x85, 0x94, + 0xa9, 0x9f, 0x4d, 0xe6, 0x1e, 0x3a, 0xfc, 0x34, 0x26, 0xcc, 0xde, 0x25, 0xcd, 0xc1, 0xa5, 0xbd, + 0xec, 0x0d, 0xa2, 0x59, 0x61, 0xf8, 0xb4, 0xbf, 0xd6, 0x09, 0x28, 0x26, 0xa4, 0x8d, 0x13, 0xb7, + 0xde, 0xc0, 0x91, 0xab, 0x6e, 0xee, 0xee, 0xd8, 0xc1, 0x54, 0x5a, 0x39, 0x57, 0x10, 0x81, 0x74, + 0x55, 0xc1, 0x91, 0x48, 0xab, 0xd0, 0x6e, 0xf9, 0x9c, 0x04, 0x3e, 0xe3, 0xc6, 0xd4, 0xda, 0xe4, + 0x46, 0xa1, 0x52, 0x53, 0x41, 0xde, 0xca, 0x05, 0xf9, 0x58, 0x9e, 0xd9, 0xdd, 0x16, 0xf6, 0x23, + 0x47, 0x75, 0xb4, 0xe3, 0x6d, 0xe7, 0xc4, 0x69, 0xd2, 0x30, 0xa4, 0x91, 0x83, 0x19, 0x23, 0xdc, + 0xae, 0x61, 0x3f, 0x19, 0x3c, 0x96, 0xcc, 0x2d, 0x44, 0x83, 0x10, 0xa2, 0x8c, 0x2c, 0xc0, 0xac, + 0x55, 0x3f, 0x48, 0x70, 0x53, 0xf4, 0x49, 0xe3, 0xb9, 0xff, 0x57, 0xc6, 0xcb, 0xde, 0x20, 0x9a, + 0x95, 0x86, 0x3d, 0xb5, 0xd6, 0xdf, 0x07, 0x2f, 0xa4, 0x8c, 0xb6, 0x1f, 0xb9, 0xb4, 0x6d, 0x4c, + 0xcb, 0x43, 0x5f, 0x56, 0x87, 0x5e, 0xca, 0xfb, 0x48, 0x19, 0x10, 0x15, 0xe5, 0xf2, 0x33, 0xb9, + 0xd2, 0xbf, 0x04, 0x0b, 0xa1, 0x1f, 0xd5, 0xe5, 0x6b, 0x17, 0xf7, 0xa2, 0xef, 0xe7, 0x79, 0xa9, + 0xba, 0x3a, 0xb6, 0xea, 0xe5, 0x34, 0xe2, 0x28, 0x9f, 0x10, 0xcd, 0x87, 0x7e, 0xf4, 0x40, 0x58, + 0x6b, 0x24, 0x51, 0xf1, 0x7f, 0xd0, 0xc0, 0x02, 0x6f, 0xe3, 0xb8, 0x1e, 0x50, 0x7a, 0xd8, 0xc0, + 0xcd, 0xc3, 0xbe, 0x80, 0x19, 0xf9, 0x9a, 0x96, 0xec, 0x74, 0xfe, 0xd8, 0xfd, 0xf9, 0x63, 0xef, + 0xaa, 0xf9, 0x53, 0xb9, 0x2f, 0xb4, 0xfd, 0xd5, 0xb5, 0xcc, 0x51, 0xdb, 0x5f, 0xa7, 0xa1, 0xcf, + 0x49, 0x18, 0xf3, 0xd3, 0x81, 0xa6, 0x51, 0x3c, 0x78, 0xf6, 0xbb, 0xa5, 0x21, 0x5d, 0x40, 0xfb, + 0x0a, 0x51, 0xc2, 0xde, 0x01, 0x40, 0x26, 0x41, 0x39, 0x49, 0x98, 0x51, 0x90, 0x65, 0x5d, 0x52, + 0x65, 0x9d, 0xcf, 0x25, 0x29, 0x71, 0x88, 0x0a, 0x22, 0x35, 0xf9, 0x5f, 0xff, 0x02, 0x94, 0xb2, + 0xe6, 0x59, 0x3f, 0x20, 0xb2, 0x6b, 0xfb, 0xd4, 0x00, 0xb2, 0xa2, 0xfb, 0x63, 0x57, 0xb4, 0x3c, + 0xd4, 0x9b, 0x07, 0x2e, 0x21, 0x9a, 0xcf, 0xac, 0x7b, 0x44, 0xb4, 0x61, 0x9f, 0xea, 0x55, 0x30, + 0x4f, 0x4e, 0x62, 0x3f, 0x2d, 0x52, 0xbd, 0x11, 0xd0, 0xe6, 0x21, 0x33, 0x8a, 0x52, 0xfe, 0x9a, + 0x92, 0x6f, 0xf4, 0xa7, 0xca, 0x10, 0x0d, 0xa2, 0xb9, 0x81, 0xad, 0x22, 0x4d, 0x3b, 0x33, 0x67, + 0x1d, 0x4b, 0x7b, 0xdc, 0xb1, 0xb4, 0xed, 0x7f, 0xa7, 0xc0, 0xa4, 0xe8, 0x32, 0x3f, 0x69, 0x60, + 0xe5, 0xa9, 0xf3, 0x7c, 0xeb, 0x6a, 0x07, 0x7c, 0xc6, 0x44, 0x2d, 0xbf, 0x3b, 0xf6, 0x96, 0xac, + 0x11, 0x9a, 0x5f, 0xfd, 0xf2, 0xe7, 0xf7, 0x37, 0x0c, 0x78, 0xdb, 0xb9, 0xfc, 0x25, 0x12, 0x2b, + 0x35, 0x1d, 0x0d, 0x2c, 0x3d, 0x79, 0x42, 0xdb, 0xd7, 0x0f, 0x2c, 0xf8, 0xe5, 0xb7, 0xc7, 0xe3, + 0x67, 0x2a, 0x97, 0xa5, 0xca, 0x45, 0x58, 0x1a, 0x52, 0x29, 0x25, 0xfe, 0xa8, 0x81, 0xd2, 0xa8, + 0x59, 0xb9, 0x31, 0x32, 0xd8, 0x08, 0x66, 0xf9, 0x8d, 0xeb, 0x32, 0x33, 0x41, 0xeb, 0x52, 0xd0, + 0x1a, 0x34, 0x87, 0x04, 0xa5, 0xdf, 0x09, 0x9b, 0xfd, 0x69, 0xaa, 0x7f, 0xa3, 0x81, 0xb9, 0x2b, + 0xe3, 0xf1, 0xd5, 0x91, 0xe1, 0x86, 0x69, 0xe5, 0xcd, 0x6b, 0xd1, 0x32, 0x49, 0xab, 0x52, 0xd2, + 0x8b, 0x70, 0x71, 0xf8, 0x24, 0x25, 0xad, 0x72, 0xff, 0xe1, 0xb9, 0xa9, 0x3d, 0x3a, 0x37, 0xb5, + 0x3f, 0xce, 0x4d, 0xed, 0xbb, 0x0b, 0x73, 0xe2, 0xd1, 0x85, 0x39, 0xf1, 0xeb, 0x85, 0x39, 0xf1, + 0xb9, 0x73, 0x8d, 0x46, 0xae, 0x7c, 0xc9, 0x87, 0xd5, 0x98, 0x96, 0xdd, 0xe4, 0xcd, 0xff, 0x02, + 0x00, 0x00, 0xff, 0xff, 0x23, 0xfe, 0x97, 0x7a, 0x3e, 0x0b, 0x00, 0x00, +} + +func (this *OracleParamsMsg) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*OracleParamsMsg) + if !ok { + that2, ok := that.(OracleParamsMsg) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.VotePeriod != that1.VotePeriod { + return false + } + if that1.VoteThreshold == nil { + if this.VoteThreshold != nil { + return false + } + } else if !this.VoteThreshold.Equal(*that1.VoteThreshold) { + return false + } + if that1.RewardBand == nil { + if this.RewardBand != nil { + return false + } + } else if !this.RewardBand.Equal(*that1.RewardBand) { + return false + } + if len(this.Whitelist) != len(that1.Whitelist) { + return false + } + for i := range this.Whitelist { + if !this.Whitelist[i].Equal(that1.Whitelist[i]) { + return false + } + } + if that1.SlashFraction == nil { + if this.SlashFraction != nil { + return false + } + } else if !this.SlashFraction.Equal(*that1.SlashFraction) { + return false + } + if this.SlashWindow != that1.SlashWindow { + return false + } + if that1.MinValidPerWindow == nil { + if this.MinValidPerWindow != nil { + return false + } + } else if !this.MinValidPerWindow.Equal(*that1.MinValidPerWindow) { + return false + } + if this.TwapLookbackWindow != nil && that1.TwapLookbackWindow != nil { + if *this.TwapLookbackWindow != *that1.TwapLookbackWindow { + return false + } + } else if this.TwapLookbackWindow != nil { + return false + } else if that1.TwapLookbackWindow != nil { + return false + } + if this.MinVoters != that1.MinVoters { + return false + } + if that1.ValidatorFeeRatio == nil { + if this.ValidatorFeeRatio != nil { + return false + } + } else if !this.ValidatorFeeRatio.Equal(*that1.ValidatorFeeRatio) { + return false + } + if this.ExpirationBlocks != that1.ExpirationBlocks { + return false + } + return true } // Reference imports to suppress errors if they are not otherwise used. @@ -889,23 +1058,81 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.ValidatorFeeRatio != nil { + if m.Params != nil { { - size := m.ValidatorFeeRatio.Size() - i -= size - if _, err := m.ValidatorFeeRatio.MarshalTo(dAtA[i:]); err != nil { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { return 0, err } + i -= size i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x5a + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgEditOracleParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgEditOracleParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgEditOracleParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *OracleParamsMsg) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *OracleParamsMsg) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OracleParamsMsg) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExpirationBlocks != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.ExpirationBlocks)) + i-- + dAtA[i] = 0x58 } - if m.MinVoters != nil { + if m.ValidatorFeeRatio != nil { { - size := m.MinVoters.Size() + size := m.ValidatorFeeRatio.Size() i -= size - if _, err := m.MinVoters.MarshalTo(dAtA[i:]); err != nil { + if _, err := m.ValidatorFeeRatio.MarshalTo(dAtA[i:]); err != nil { return 0, err } i = encodeVarintTx(dAtA, i, uint64(size)) @@ -913,17 +1140,20 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x52 } + if m.MinVoters != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.MinVoters)) + i-- + dAtA[i] = 0x48 + } if m.TwapLookbackWindow != nil { - { - size := m.TwapLookbackWindow.Size() - i -= size - if _, err := m.TwapLookbackWindow.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(*m.TwapLookbackWindow, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(*m.TwapLookbackWindow):]) + if err2 != nil { + return 0, err2 } + i -= n2 + i = encodeVarintTx(dAtA, i, uint64(n2)) i-- - dAtA[i] = 0x4a + dAtA[i] = 0x42 } if m.MinValidPerWindow != nil { { @@ -935,19 +1165,12 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x42 + dAtA[i] = 0x3a } - if m.SlashWindow != nil { - { - size := m.SlashWindow.Size() - i -= size - if _, err := m.SlashWindow.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } + if m.SlashWindow != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.SlashWindow)) i-- - dAtA[i] = 0x3a + dAtA[i] = 0x30 } if m.SlashFraction != nil { { @@ -959,15 +1182,20 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 + dAtA[i] = 0x2a } if len(m.Whitelist) > 0 { for iNdEx := len(m.Whitelist) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Whitelist[iNdEx]) - copy(dAtA[i:], m.Whitelist[iNdEx]) - i = encodeVarintTx(dAtA, i, uint64(len(m.Whitelist[iNdEx]))) + { + size := m.Whitelist[iNdEx].Size() + i -= size + if _, err := m.Whitelist[iNdEx].MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTx(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } } if m.RewardBand != nil { @@ -980,7 +1208,7 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x22 + dAtA[i] = 0x1a } if m.VoteThreshold != nil { { @@ -992,61 +1220,12 @@ func (m *MsgEditOracleParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintTx(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - if m.VotePeriod != nil { - { - size := m.VotePeriod.Size() - i -= size - if _, err := m.VotePeriod.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 } - if len(m.Sender) > 0 { - i -= len(m.Sender) - copy(dAtA[i:], m.Sender) - i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + if m.VotePeriod != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.VotePeriod)) i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *MsgEditOracleParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *MsgEditOracleParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *MsgEditOracleParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.NewParams != nil { - { - size, err := m.NewParams.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTx(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } @@ -1162,10 +1341,31 @@ func (m *MsgEditOracleParams) Size() (n int) { if l > 0 { n += 1 + l + sovTx(uint64(l)) } - if m.VotePeriod != nil { - l = m.VotePeriod.Size() + if m.Params != nil { + l = m.Params.Size() n += 1 + l + sovTx(uint64(l)) } + return n +} + +func (m *MsgEditOracleParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *OracleParamsMsg) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.VotePeriod != 0 { + n += 1 + sovTx(uint64(m.VotePeriod)) + } if m.VoteThreshold != nil { l = m.VoteThreshold.Size() n += 1 + l + sovTx(uint64(l)) @@ -1175,8 +1375,8 @@ func (m *MsgEditOracleParams) Size() (n int) { n += 1 + l + sovTx(uint64(l)) } if len(m.Whitelist) > 0 { - for _, s := range m.Whitelist { - l = len(s) + for _, e := range m.Whitelist { + l = e.Size() n += 1 + l + sovTx(uint64(l)) } } @@ -1184,38 +1384,26 @@ func (m *MsgEditOracleParams) Size() (n int) { l = m.SlashFraction.Size() n += 1 + l + sovTx(uint64(l)) } - if m.SlashWindow != nil { - l = m.SlashWindow.Size() - n += 1 + l + sovTx(uint64(l)) + if m.SlashWindow != 0 { + n += 1 + sovTx(uint64(m.SlashWindow)) } if m.MinValidPerWindow != nil { l = m.MinValidPerWindow.Size() n += 1 + l + sovTx(uint64(l)) } if m.TwapLookbackWindow != nil { - l = m.TwapLookbackWindow.Size() + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(*m.TwapLookbackWindow) n += 1 + l + sovTx(uint64(l)) } - if m.MinVoters != nil { - l = m.MinVoters.Size() - n += 1 + l + sovTx(uint64(l)) + if m.MinVoters != 0 { + n += 1 + sovTx(uint64(m.MinVoters)) } if m.ValidatorFeeRatio != nil { l = m.ValidatorFeeRatio.Size() n += 1 + l + sovTx(uint64(l)) } - return n -} - -func (m *MsgEditOracleParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.NewParams != nil { - l = m.NewParams.Size() - n += 1 + l + sovTx(uint64(l)) + if m.ExpirationBlocks != 0 { + n += 1 + sovTx(uint64(m.ExpirationBlocks)) } return n } @@ -1877,9 +2065,9 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VotePeriod", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1889,29 +2077,148 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - var v github_com_cosmos_cosmos_sdk_types.Int - m.VotePeriod = &v - if err := m.VotePeriod.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Params == nil { + m.Params = &OracleParamsMsg{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditOracleParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgEditOracleParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditOracleParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OracleParamsMsg) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OracleParamsMsg: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OracleParamsMsg: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field VotePeriod", wireType) + } + m.VotePeriod = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.VotePeriod |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field VoteThreshold", wireType) } @@ -1947,7 +2254,7 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field RewardBand", wireType) } @@ -1983,7 +2290,7 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Whitelist", wireType) } @@ -2013,9 +2320,13 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Whitelist = append(m.Whitelist, string(dAtA[iNdEx:postIndex])) + var v github_com_NibiruChain_nibiru_v2_x_common_asset.Pair + m.Whitelist = append(m.Whitelist, v) + if err := m.Whitelist[len(m.Whitelist)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field SlashFraction", wireType) } @@ -2051,11 +2362,11 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 7: - if wireType != 2 { + case 6: + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field SlashWindow", wireType) } - var stringLen uint64 + m.SlashWindow = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2065,29 +2376,12 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.SlashWindow |= uint64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.SlashWindow = &v - if err := m.SlashWindow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: + case 7: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MinValidPerWindow", wireType) } @@ -2123,11 +2417,11 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 9: + case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TwapLookbackWindow", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2137,33 +2431,33 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - var v github_com_cosmos_cosmos_sdk_types.Int - m.TwapLookbackWindow = &v - if err := m.TwapLookbackWindow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.TwapLookbackWindow == nil { + m.TwapLookbackWindow = new(time.Duration) + } + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(m.TwapLookbackWindow, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 10: - if wireType != 2 { + case 9: + if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field MinVoters", wireType) } - var stringLen uint64 + m.MinVoters = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2173,29 +2467,12 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.MinVoters |= uint64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MinVoters = &v - if err := m.MinVoters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 11: + case 10: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ValidatorFeeRatio", wireType) } @@ -2231,61 +2508,11 @@ func (m *MsgEditOracleParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTx(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTx - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *MsgEditOracleParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgEditOracleParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgEditOracleParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewParams", wireType) + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpirationBlocks", wireType) } - var msglen int + m.ExpirationBlocks = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2295,28 +2522,11 @@ func (m *MsgEditOracleParamsResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.ExpirationBlocks |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.NewParams == nil { - m.NewParams = &Params{} - } - if err := m.NewParams.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) diff --git a/x/oracle/types/tx.pb.gw.go b/x/oracle/types/tx.pb.gw.go index 5c9ddb424..46515660b 100644 --- a/x/oracle/types/tx.pb.gw.go +++ b/x/oracle/types/tx.pb.gw.go @@ -406,7 +406,7 @@ var ( pattern_Msg_DelegateFeedConsent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "feeder-delegate"}, "", runtime.AssumeColonVerbOpt(false))) - pattern_Msg_EditOracleParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "edit-oracle-params"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Msg_EditOracleParams_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"nibiru", "oracle", "params"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( From c74baa0345f38b64f8e55f8027a6cf0c3c1a3cdb Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 14:21:23 -0700 Subject: [PATCH 94/99] fix: epochs tests --- x/epochs/genesis_test.go | 14 +++++++++++--- x/epochs/keeper/keeper_test.go | 15 ++++++++------- x/epochs/types/epochinfo_test.go | 9 +++++++++ x/epochs/types/genesis.go | 9 --------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/x/epochs/genesis_test.go b/x/epochs/genesis_test.go index d35c31db9..f861f3ea7 100644 --- a/x/epochs/genesis_test.go +++ b/x/epochs/genesis_test.go @@ -26,7 +26,7 @@ func TestEpochsExportGenesis(t *testing.T) { ctx := testapp.NewContext(app).WithBlockTime(chainStartTime) genesis := epochs.ExportGenesis(ctx, app.EpochsKeeper) - require.Len(t, genesis.Epochs, 3) + require.Len(t, genesis.Epochs, 4) errMsg := fmt.Sprintf("app.EpochsKeeper.AllEpochInfos(ctx): %v\n", app.EpochsKeeper.AllEpochInfos(ctx)) require.Equal(t, genesis.Epochs[0].Identifier, "30 min") @@ -45,13 +45,21 @@ func TestEpochsExportGenesis(t *testing.T) { require.Equal(t, genesis.Epochs[1].CurrentEpochStartTime, chainStartTime, errMsg) require.Equal(t, genesis.Epochs[1].EpochCountingStarted, false) - require.Equal(t, genesis.Epochs[2].Identifier, "week") + require.Equal(t, genesis.Epochs[2].Identifier, "month") require.Equal(t, genesis.Epochs[2].StartTime, chainStartTime, errMsg) - require.Equal(t, genesis.Epochs[2].Duration, time.Hour*24*7) + require.Equal(t, genesis.Epochs[2].Duration, time.Hour*24*30) require.Equal(t, genesis.Epochs[2].CurrentEpoch, uint64(0)) require.Equal(t, genesis.Epochs[2].CurrentEpochStartHeight, int64(0)) require.Equal(t, genesis.Epochs[2].CurrentEpochStartTime, chainStartTime, errMsg) require.Equal(t, genesis.Epochs[2].EpochCountingStarted, false) + + require.Equal(t, genesis.Epochs[3].Identifier, "week") + require.Equal(t, genesis.Epochs[3].StartTime, chainStartTime, errMsg) + require.Equal(t, genesis.Epochs[3].Duration, time.Hour*24*7) + require.Equal(t, genesis.Epochs[3].CurrentEpoch, uint64(0)) + require.Equal(t, genesis.Epochs[3].CurrentEpochStartHeight, int64(0)) + require.Equal(t, genesis.Epochs[3].CurrentEpochStartTime, chainStartTime, errMsg) + require.Equal(t, genesis.Epochs[3].EpochCountingStarted, false) } func TestEpochsInitGenesis(t *testing.T) { diff --git a/x/epochs/keeper/keeper_test.go b/x/epochs/keeper/keeper_test.go index 7fa8120d2..43c9b38bf 100644 --- a/x/epochs/keeper/keeper_test.go +++ b/x/epochs/keeper/keeper_test.go @@ -14,9 +14,9 @@ func TestUpsertEpochInfo_HappyPath(t *testing.T) { nibiruApp, ctx := testapp.NewNibiruTestAppAndContext() epochInfo := types.EpochInfo{ - Identifier: "monthly", + Identifier: "bi-monthly", StartTime: time.Time{}, - Duration: time.Hour * 24 * 30, + Duration: time.Hour * 24 * 30 * 2, CurrentEpoch: 0, CurrentEpochStartHeight: 0, CurrentEpochStartTime: time.Time{}, @@ -25,18 +25,19 @@ func TestUpsertEpochInfo_HappyPath(t *testing.T) { nibiruApp.EpochsKeeper.Epochs.Insert(ctx, epochInfo.Identifier, epochInfo) - epochInfoSaved, err := nibiruApp.EpochsKeeper.GetEpochInfo(ctx, "monthly") + epochInfoSaved, err := nibiruApp.EpochsKeeper.GetEpochInfo(ctx, "bi-monthly") require.NoError(t, err) require.Equal(t, epochInfo, epochInfoSaved) allEpochs := nibiruApp.EpochsKeeper.AllEpochInfos(ctx) - require.Len(t, allEpochs, 4) + require.Len(t, allEpochs, 5) // Epochs are ordered in alphabetical order require.Equal(t, "30 min", allEpochs[0].Identifier) - require.Equal(t, "day", allEpochs[1].Identifier) - require.Equal(t, "monthly", allEpochs[2].Identifier) - require.Equal(t, "week", allEpochs[3].Identifier) + require.Equal(t, "bi-monthly", allEpochs[1].Identifier) + require.Equal(t, "day", allEpochs[2].Identifier) + require.Equal(t, "month", allEpochs[3].Identifier) + require.Equal(t, "week", allEpochs[4].Identifier) } func TestEpochExists(t *testing.T) { diff --git a/x/epochs/types/epochinfo_test.go b/x/epochs/types/epochinfo_test.go index f6e5d3d6f..a3624337a 100644 --- a/x/epochs/types/epochinfo_test.go +++ b/x/epochs/types/epochinfo_test.go @@ -38,6 +38,15 @@ func TestDefaultGenesis(t *testing.T) { CurrentEpochStartTime: time.Time{}, EpochCountingStarted: false, }, + { + Identifier: MonthEpochID, + StartTime: time.Time{}, + Duration: 30 * 24 * time.Hour, + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, } // Ensure that genState and expectedEpochs are the same diff --git a/x/epochs/types/genesis.go b/x/epochs/types/genesis.go index 846f88768..903485fb6 100644 --- a/x/epochs/types/genesis.go +++ b/x/epochs/types/genesis.go @@ -35,15 +35,6 @@ func DefaultGenesisFromTime(startTime time.Time) *GenesisState { CurrentEpochStartTime: startTime, EpochCountingStarted: false, }, - { - Identifier: DayEpochID, - StartTime: startTime, - Duration: 24 * time.Hour, - CurrentEpoch: 0, - CurrentEpochStartHeight: 0, - CurrentEpochStartTime: startTime, - EpochCountingStarted: false, - }, { Identifier: WeekEpochID, StartTime: startTime, From 3e276328acfc46694feffb02c004b85436fdb8fc Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:17:13 -0700 Subject: [PATCH 95/99] feat: add v2.0.0 upgrade handler --- app/upgrades.go | 2 ++ app/upgrades/v2_0_0/constants.go | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 app/upgrades/v2_0_0/constants.go diff --git a/app/upgrades.go b/app/upgrades.go index bbd5475c6..9cc83f588 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -14,6 +14,7 @@ import ( "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_3_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_4_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_5_0" + "github.com/NibiruChain/nibiru/v2/app/upgrades/v2_0_0" ) var Upgrades = []upgrades.Upgrade{ @@ -25,6 +26,7 @@ var Upgrades = []upgrades.Upgrade{ v1_3_0.Upgrade, v1_4_0.Upgrade, v1_5_0.Upgrade, + v2_0_0.Upgrade, } func (app *NibiruApp) setupUpgrades() { diff --git a/app/upgrades/v2_0_0/constants.go b/app/upgrades/v2_0_0/constants.go new file mode 100644 index 000000000..cc4c5eaf2 --- /dev/null +++ b/app/upgrades/v2_0_0/constants.go @@ -0,0 +1,25 @@ +package v2_0_0 + +import ( + "github.com/cosmos/cosmos-sdk/store/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + + "github.com/NibiruChain/nibiru/v2/app/upgrades" + evmtypes "github.com/NibiruChain/nibiru/v2/x/evm" +) + +const UpgradeName = "v2.0.0" + +var Upgrade = upgrades.Upgrade{ + UpgradeName: UpgradeName, + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + return mm.RunMigrations(ctx, cfg, fromVM) + } + }, + StoreUpgrades: types.StoreUpgrades{ + Added: []string{evmtypes.ModuleName}, + }, +} From a9fa05e05b1ccd98f391933f29f10da165ba1b86 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:50:04 -0700 Subject: [PATCH 96/99] linter --- app/app.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/app.go b/app/app.go index 1205d3c77..2eb116bff 100644 --- a/app/app.go +++ b/app/app.go @@ -10,9 +10,6 @@ import ( wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - "github.com/NibiruChain/nibiru/v2/app/ante" - "github.com/NibiruChain/nibiru/v2/app/wasmext" - "github.com/NibiruChain/nibiru/v2/x/evm/precompile" dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" @@ -47,6 +44,10 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/rakyll/statik/fs" "github.com/spf13/cast" + + "github.com/NibiruChain/nibiru/v2/app/ante" + "github.com/NibiruChain/nibiru/v2/app/wasmext" + "github.com/NibiruChain/nibiru/v2/x/evm/precompile" ) const ( From 98c3517f1699f710ca97417990edb7362f941c89 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 5 Nov 2024 10:26:50 -0800 Subject: [PATCH 97/99] fix: upgrade handlers had wrong function type --- app/upgrades/v1_0_1/constants.go | 3 ++- app/upgrades/v1_0_2/constants.go | 3 ++- app/upgrades/v1_0_3/constants.go | 3 ++- app/upgrades/v1_5_0/constants.go | 3 ++- app/upgrades/v2_0_0/constants.go | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_1/constants.go index 1548161da..16ba7d6ff 100644 --- a/app/upgrades/v1_0_1/constants.go +++ b/app/upgrades/v1_0_1/constants.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +15,7 @@ const UpgradeName = "v1.0.1" // pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_0_2/constants.go b/app/upgrades/v1_0_2/constants.go index 5333497fc..e27784241 100644 --- a/app/upgrades/v1_0_2/constants.go +++ b/app/upgrades/v1_0_2/constants.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +15,7 @@ const UpgradeName = "v1.0.2" // a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_0_3/constants.go b/app/upgrades/v1_0_3/constants.go index acec556b6..96b2e9606 100644 --- a/app/upgrades/v1_0_3/constants.go +++ b/app/upgrades/v1_0_3/constants.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +15,7 @@ const UpgradeName = "v1.0.3" // a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_5_0/constants.go b/app/upgrades/v1_5_0/constants.go index 71e4aa827..fb15d6809 100644 --- a/app/upgrades/v1_5_0/constants.go +++ b/app/upgrades/v1_5_0/constants.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -13,7 +14,7 @@ const UpgradeName = "v1.5.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v2_0_0/constants.go b/app/upgrades/v2_0_0/constants.go index cc4c5eaf2..c5a223948 100644 --- a/app/upgrades/v2_0_0/constants.go +++ b/app/upgrades/v2_0_0/constants.go @@ -5,6 +5,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" evmtypes "github.com/NibiruChain/nibiru/v2/x/evm" @@ -14,7 +15,7 @@ const UpgradeName = "v2.0.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } From 7b2037a7967499703cab15e86e2b1e55968663c7 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:17:59 -0800 Subject: [PATCH 98/99] Revert "feat: enable wasm light clients on IBC (08-wasm) (#2068)" This reverts commit ee5e29fc403616aa4e0019864858960d66cb8ab8. --- CHANGELOG.md | 7 +++++- app/app.go | 14 ----------- app/keepers.go | 34 +++----------------------- app/keepers/all_keepers.go | 2 -- app/upgrades.go | 2 +- app/upgrades/types.go | 4 +-- app/upgrades/v1_0_1/constants.go | 3 +-- app/upgrades/v1_0_2/constants.go | 3 +-- app/upgrades/v1_0_3/constants.go | 3 +-- app/upgrades/v1_1_0/constants.go | 3 +-- app/upgrades/v1_2_0/constants.go | 3 +-- app/upgrades/v1_3_0/constants.go | 3 +-- app/upgrades/v1_4_0/constants.go | 3 +-- app/upgrades/v1_5_0/constants.go | 3 +-- app/upgrades/v2_0_0/constants.go | 3 +-- app/upgrades/v2_1_0/constants.go | 42 -------------------------------- cmd/nibid/cmd/init.go | 9 ------- go.mod | 3 +-- go.sum | 6 ++--- 19 files changed, 24 insertions(+), 126 deletions(-) delete mode 100644 app/upgrades/v2_1_0/constants.go diff --git a/CHANGELOG.md b/CHANGELOG.md index f4e5fa640..44d185ab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,6 @@ Zenith](https://code4rena.com/zenith) Audit, running from 2024-10-07 until period. This section describes code changes that occured after that audit in preparation for a second audit starting in November 2024. -- [#2068](https://github.com/NibiruChain/nibiru/pull/2068) - feat: enable wasm light clients on IBC (08-wasm) - [#2074](https://github.com/NibiruChain/nibiru/pull/2074) - fix(evm-keeper): better utilize ERC20 metadata during FunToken creation. The bank metadata for a new FunToken mapping ties a connection between the Bank Coin's `DenomUnit` and the ERC20 contract metadata like the name, decimals, and symbol. This change brings parity between EVM wallets, such as MetaMask, and Interchain wallets like Keplr and Leap. - [#2076](https://github.com/NibiruChain/nibiru/pull/2076) - fix(evm-gas-fees): Use effective gas price in RefundGas and make sure that units are properly @@ -98,6 +97,12 @@ depend on x/bank, such as the EVM and Wasm modules. - [#2098](https://github.com/NibiruChain/nibiru/pull/2098) - test(evm): statedb tests for race conditions within funtoken precompile - [#2100](https://github.com/NibiruChain/nibiru/pull/2100) - refactor: cleanup statedb and precompile sections +- [#2098](https://github.com/NibiruChain/nibiru/pull/2098) - test(evm): statedb tests for race conditions within funtoken precompile +- [#2090](https://github.com/NibiruChain/nibiru/pull/2090) - fix(evm): Account +for (1) ERC20 transfers with tokens that return false success values instead of +throwing an error and (2) ERC20 transfers with other operations that don't bring +about the expected resulting balance for the transfer recipient. +- [#2092](https://github.com/NibiruChain/nibiru/pull/2092) - feat(evm): add validation for wasm multi message execution - [#2101](https://github.com/NibiruChain/nibiru/pull/2101) - fix(evm): tx receipt proper marshalling - [#2105](https://github.com/NibiruChain/nibiru/pull/2105) - test(evm): precompile call with revert diff --git a/app/app.go b/app/app.go index f212cc07e..9aa9cf73e 100644 --- a/app/app.go +++ b/app/app.go @@ -13,9 +13,7 @@ import ( dbm "github.com/cometbft/cometbft-db" abci "github.com/cometbft/cometbft/abci/types" "github.com/cometbft/cometbft/libs/log" - cmtos "github.com/cometbft/cometbft/libs/os" tmos "github.com/cometbft/cometbft/libs/os" - cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" _ "github.com/cosmos/cosmos-sdk/client/docs/statik" @@ -39,7 +37,6 @@ import ( capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" "github.com/cosmos/cosmos-sdk/x/crisis" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" - ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" ibctesting "github.com/cosmos/ibc-go/v7/testing" "github.com/cosmos/ibc-go/v7/testing/types" @@ -238,10 +235,6 @@ func NewNibiruApp( app.CommitMultiStore(), &app.WasmKeeper, ), - ibcwasmkeeper.NewWasmSnapshotter( - app.CommitMultiStore(), - &app.WasmClientKeeper, - ), ); err != nil { panic("failed to add wasm snapshot extension.") } @@ -252,13 +245,6 @@ func NewNibiruApp( tmos.Exit(err.Error()) } - ctx := app.BaseApp.NewUncachedContext(true, cmtproto.Header{}) - - // Initialize pinned codes in wasmvm as they are not persisted there - if err := ibcwasmkeeper.InitializePinnedCodes(ctx, app.appCodec); err != nil { - cmtos.Exit(fmt.Sprintf("failed to initialize pinned codes %s", err)) - } - /* Applications that wish to enforce statically created ScopedKeepers should call `Seal` after creating their scoped modules in `NewApp` with `capabilityKeeper.ScopeToModule`. diff --git a/app/keepers.go b/app/keepers.go index 51263d320..81575a18b 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -4,8 +4,6 @@ import ( "path/filepath" "strings" - ibcwasm "github.com/cosmos/ibc-go/modules/light-clients/08-wasm" - ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" icacontroller "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller" icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" @@ -18,7 +16,6 @@ import ( "github.com/CosmWasm/wasmd/x/wasm" wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" - wasmvm "github.com/CosmWasm/wasmvm" _ "github.com/cosmos/cosmos-sdk/client/docs/statik" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec" @@ -87,7 +84,6 @@ import ( // --------------------------------------------------------------- // IBC imports - ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" ibcfee "github.com/cosmos/ibc-go/v7/modules/apps/29-fee" ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper" @@ -125,7 +121,7 @@ import ( "github.com/NibiruChain/nibiru/v2/x/inflation" inflationkeeper "github.com/NibiruChain/nibiru/v2/x/inflation/keeper" inflationtypes "github.com/NibiruChain/nibiru/v2/x/inflation/types" - "github.com/NibiruChain/nibiru/v2/x/oracle" + oracle "github.com/NibiruChain/nibiru/v2/x/oracle" oraclekeeper "github.com/NibiruChain/nibiru/v2/x/oracle/keeper" oracletypes "github.com/NibiruChain/nibiru/v2/x/oracle/types" @@ -133,13 +129,11 @@ import ( "github.com/NibiruChain/nibiru/v2/x/sudo/keeper" sudotypes "github.com/NibiruChain/nibiru/v2/x/sudo/types" - "github.com/NibiruChain/nibiru/v2/x/tokenfactory" + tokenfactory "github.com/NibiruChain/nibiru/v2/x/tokenfactory" tokenfactorykeeper "github.com/NibiruChain/nibiru/v2/x/tokenfactory/keeper" tokenfactorytypes "github.com/NibiruChain/nibiru/v2/x/tokenfactory/types" ) -const wasmVmContractMemoryLimit = 32 - type AppKeepers struct { keepers.PublicKeepers privateKeepers @@ -198,7 +192,6 @@ func initStoreKeys() ( ibcexported.StoreKey, icahosttypes.StoreKey, icacontrollertypes.StoreKey, - ibcwasmtypes.StoreKey, // nibiru x/ keys oracletypes.StoreKey, @@ -259,7 +252,7 @@ func (app *NibiruApp) InitKeepers( // seal capability keeper after scoping modules // app.capabilityKeeper.Seal() - // TODO: chore(upgrade): Potential breaking change on AccountKeeper due + // TODO: chore(upgrade): Potential breaking change on AccountKeeper dur // to ProtoBaseAccount replacement. app.AccountKeeper = authkeeper.NewAccountKeeper( appCodec, @@ -460,13 +453,6 @@ func (app *NibiruApp) InitKeepers( // For example, if there are bindings for the x/inflation module, then the app // passed to GetWasmOpts must already have a non-nil InflationKeeper. supportedFeatures := strings.Join(wasmdapp.AllCapabilities(), ",") - - // Create wasm VM outside keeper so it can be re-used in client keeper - wasmVM, err := wasmvm.NewVM(filepath.Join(wasmDir, "wasm"), supportedFeatures, wasmVmContractMemoryLimit, wasmConfig.ContractDebugMode, wasmConfig.MemoryCacheSize) - if err != nil { - panic(err) - } - app.WasmKeeper = wasmkeeper.NewKeeper( appCodec, keys[wasmtypes.StoreKey], @@ -485,16 +471,7 @@ func (app *NibiruApp) InitKeepers( wasmConfig, supportedFeatures, govModuleAddr, - append(GetWasmOpts(*app, appOpts), wasmkeeper.WithWasmEngine(wasmVM))..., - ) - - app.WasmClientKeeper = ibcwasmkeeper.NewKeeperWithVM( - appCodec, - keys[ibcwasmtypes.StoreKey], - app.ibcKeeper.ClientKeeper, - authtypes.NewModuleAddress(govtypes.ModuleName).String(), - wasmVM, - app.GRPCQueryRouter(), + GetWasmOpts(*app, appOpts)..., ) // DevGas uses WasmKeeper @@ -658,7 +635,6 @@ func (app *NibiruApp) initAppModules( ibctransfer.NewAppModule(app.ibcTransferKeeper), ibcfee.NewAppModule(app.ibcFeeKeeper), ica.NewAppModule(&app.icaControllerKeeper, &app.icaHostKeeper), - ibcwasm.NewAppModule(app.WasmClientKeeper), evmmodule.NewAppModule(app.EvmKeeper, app.AccountKeeper), @@ -730,7 +706,6 @@ func orderedModuleNames() []string { ibcexported.ModuleName, ibcfeetypes.ModuleName, icatypes.ModuleName, - ibcwasmtypes.ModuleName, // -------------------------------------------------------------------- evm.ModuleName, @@ -837,7 +812,6 @@ func ModuleBasicManager() module.BasicManager { ibctransfer.AppModuleBasic{}, ibctm.AppModuleBasic{}, ica.AppModuleBasic{}, - ibcwasm.AppModuleBasic{}, // native x/ evmmodule.AppModuleBasic{}, oracle.AppModuleBasic{}, diff --git a/app/keepers/all_keepers.go b/app/keepers/all_keepers.go index 0ebc82afd..4692905c7 100644 --- a/app/keepers/all_keepers.go +++ b/app/keepers/all_keepers.go @@ -10,7 +10,6 @@ import ( distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - ibcwasmkeeper "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/keeper" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" @@ -69,5 +68,4 @@ type PublicKeepers struct { // WASM keepers WasmKeeper wasmkeeper.Keeper ScopedWasmKeeper capabilitykeeper.ScopedKeeper - WasmClientKeeper ibcwasmkeeper.Keeper } diff --git a/app/upgrades.go b/app/upgrades.go index 454a3e61b..48727aab9 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -38,7 +38,7 @@ func (app *NibiruApp) setupUpgrades() { func (app *NibiruApp) setUpgradeHandlers() { for _, u := range Upgrades { - app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.ModuleManager, app.configurator, app.ibcKeeper.ClientKeeper)) + app.upgradeKeeper.SetUpgradeHandler(u.UpgradeName, u.CreateUpgradeHandler(app.ModuleManager, app.configurator)) } } diff --git a/app/upgrades/types.go b/app/upgrades/types.go index 88dd83c13..a2cdde4b5 100644 --- a/app/upgrades/types.go +++ b/app/upgrades/types.go @@ -4,14 +4,12 @@ import ( store "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/upgrade/types" - - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" ) type Upgrade struct { UpgradeName string - CreateUpgradeHandler func(*module.Manager, module.Configurator, clientkeeper.Keeper) types.UpgradeHandler + CreateUpgradeHandler func(*module.Manager, module.Configurator) types.UpgradeHandler StoreUpgrades store.StoreUpgrades } diff --git a/app/upgrades/v1_0_1/constants.go b/app/upgrades/v1_0_1/constants.go index 16ba7d6ff..1548161da 100644 --- a/app/upgrades/v1_0_1/constants.go +++ b/app/upgrades/v1_0_1/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -15,7 +14,7 @@ const UpgradeName = "v1.0.1" // pretty much a no-op store upgrade to test the upgrade process and include the newer version of rocksdb var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_0_2/constants.go b/app/upgrades/v1_0_2/constants.go index e27784241..5333497fc 100644 --- a/app/upgrades/v1_0_2/constants.go +++ b/app/upgrades/v1_0_2/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -15,7 +14,7 @@ const UpgradeName = "v1.0.2" // a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_0_3/constants.go b/app/upgrades/v1_0_3/constants.go index 96b2e9606..acec556b6 100644 --- a/app/upgrades/v1_0_3/constants.go +++ b/app/upgrades/v1_0_3/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -15,7 +14,7 @@ const UpgradeName = "v1.0.3" // a no-op store upgrade to test the upgrade process and include the newer version cosmos-sdk var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_1_0/constants.go b/app/upgrades/v1_1_0/constants.go index bd119eb7a..4fdebdf6c 100644 --- a/app/upgrades/v1_1_0/constants.go +++ b/app/upgrades/v1_1_0/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" inflationtypes "github.com/NibiruChain/nibiru/v2/x/inflation/types" @@ -15,7 +14,7 @@ const UpgradeName = "v1.1.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_2_0/constants.go b/app/upgrades/v1_2_0/constants.go index 0805d4b66..63718c21d 100644 --- a/app/upgrades/v1_2_0/constants.go +++ b/app/upgrades/v1_2_0/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +13,7 @@ const UpgradeName = "v1.2.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_3_0/constants.go b/app/upgrades/v1_3_0/constants.go index 263817ac0..320bdae7c 100644 --- a/app/upgrades/v1_3_0/constants.go +++ b/app/upgrades/v1_3_0/constants.go @@ -14,7 +14,6 @@ import ( icahosttypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -23,7 +22,7 @@ const UpgradeName = "v1.3.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { // set the ICS27 consensus version so InitGenesis is not run fromVM[icatypes.ModuleName] = mm.GetVersionMap()[icatypes.ModuleName] diff --git a/app/upgrades/v1_4_0/constants.go b/app/upgrades/v1_4_0/constants.go index 28d53df22..fbfa766ea 100644 --- a/app/upgrades/v1_4_0/constants.go +++ b/app/upgrades/v1_4_0/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +13,7 @@ const UpgradeName = "v1.4.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v1_5_0/constants.go b/app/upgrades/v1_5_0/constants.go index fb15d6809..71e4aa827 100644 --- a/app/upgrades/v1_5_0/constants.go +++ b/app/upgrades/v1_5_0/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" ) @@ -14,7 +13,7 @@ const UpgradeName = "v1.5.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v2_0_0/constants.go b/app/upgrades/v2_0_0/constants.go index c5a223948..cc4c5eaf2 100644 --- a/app/upgrades/v2_0_0/constants.go +++ b/app/upgrades/v2_0_0/constants.go @@ -5,7 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" "github.com/NibiruChain/nibiru/v2/app/upgrades" evmtypes "github.com/NibiruChain/nibiru/v2/x/evm" @@ -15,7 +14,7 @@ const UpgradeName = "v2.0.0" var Upgrade = upgrades.Upgrade{ UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { + CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator) upgradetypes.UpgradeHandler { return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return mm.RunMigrations(ctx, cfg, fromVM) } diff --git a/app/upgrades/v2_1_0/constants.go b/app/upgrades/v2_1_0/constants.go deleted file mode 100644 index f294c66a4..000000000 --- a/app/upgrades/v2_1_0/constants.go +++ /dev/null @@ -1,42 +0,0 @@ -package v2_1_0 - -import ( - "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" - ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" - clientkeeper "github.com/cosmos/ibc-go/v7/modules/core/02-client/keeper" - - "github.com/NibiruChain/nibiru/v2/app/upgrades" -) - -const UpgradeName = "v2.1.0" - -var Upgrade = upgrades.Upgrade{ - UpgradeName: UpgradeName, - CreateUpgradeHandler: func(mm *module.Manager, cfg module.Configurator, clientKeeper clientkeeper.Keeper) upgradetypes.UpgradeHandler { - return func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - // explicitly update the IBC 02-client params, adding the wasm client type if it is not there - params := clientKeeper.GetParams(ctx) - - hasWasmClient := false - for _, client := range params.AllowedClients { - if client == ibcwasmtypes.Wasm { - hasWasmClient = true - break - } - } - - if !hasWasmClient { - params.AllowedClients = append(params.AllowedClients, ibcwasmtypes.Wasm) - clientKeeper.SetParams(ctx, params) - } - - return mm.RunMigrations(ctx, cfg, fromVM) - } - }, - StoreUpgrades: types.StoreUpgrades{ - Added: []string{ibcwasmtypes.ModuleName}, - }, -} diff --git a/cmd/nibid/cmd/init.go b/cmd/nibid/cmd/init.go index 13de92198..1d8c439a9 100644 --- a/cmd/nibid/cmd/init.go +++ b/cmd/nibid/cmd/init.go @@ -8,7 +8,6 @@ import ( "path/filepath" tmcfg "github.com/cometbft/cometbft/config" - ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/types" "github.com/NibiruChain/nibiru/v2/app/appconst" @@ -26,9 +25,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/genutil" - - ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibctypes "github.com/cosmos/ibc-go/v7/modules/core/types" ) const ( @@ -133,11 +129,6 @@ func InitCmd(mbm module.BasicManager, defaultNodeHome string) *cobra.Command { } appGenState := mbm.DefaultGenesis(cdc) - // add 08-wasm to AllowedClients - ibcState := ibctypes.DefaultGenesisState() - ibcState.ClientGenesis.Params.AllowedClients = append(ibcState.ClientGenesis.Params.AllowedClients, ibcwasmtypes.Wasm) - appGenState[ibcexported.ModuleName] = cdc.MustMarshalJSON(ibcState) - appState, err := json.MarshalIndent(appGenState, "", " ") if err != nil { return errors.Wrap(err, "Failed to marshal default genesis state") diff --git a/go.mod b/go.mod index c4546c826..212c99e6b 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( // Cosmos-SDK and IBC github.com/cosmos/cosmos-proto v1.0.0-beta.5 github.com/cosmos/cosmos-sdk v0.47.11 - github.com/cosmos/ibc-go/v7 v7.4.0 + github.com/cosmos/ibc-go/v7 v7.3.2 github.com/ethereum/go-ethereum v1.10.17 ) @@ -57,7 +57,6 @@ require ( require ( cosmossdk.io/collections v0.4.0 cosmossdk.io/tools/rosetta v0.2.1 - github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/gorilla/websocket v1.5.0 github.com/rs/cors v1.8.3 diff --git a/go.sum b/go.sum index a4fec943d..ab3cd42aa 100644 --- a/go.sum +++ b/go.sum @@ -438,10 +438,8 @@ github.com/cosmos/gogoproto v1.4.10 h1:QH/yT8X+c0F4ZDacDv3z+xE3WU1P1Z3wQoLMBRJoK github.com/cosmos/gogoproto v1.4.10/go.mod h1:3aAZzeRWpAwr+SS/LLkICX2/kDFyaYVzckBDzygIxek= github.com/cosmos/iavl v0.20.0 h1:fTVznVlepH0KK8NyKq8w+U7c2L6jofa27aFX6YGlm38= github.com/cosmos/iavl v0.20.0/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= -github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d h1:QJK/Zr0HblNx6z1x5LXIHEblY7DCCftMkUBcjpKe1qY= -github.com/cosmos/ibc-go/modules/light-clients/08-wasm v0.3.2-0.20240730185603-13c071f0b34d/go.mod h1:5oIHokzX6RJ6q93tLcWZ7Thkrt9vrMGIz3He9HFE660= -github.com/cosmos/ibc-go/v7 v7.4.0 h1:8FqYMptvksgMvlbN4UW9jFxTXzsPyfAzEZurujXac8M= -github.com/cosmos/ibc-go/v7 v7.4.0/go.mod h1:L/KaEhzV5TGUCTfGysVgMBQtl5Dm7hHitfpk+GIeoAo= +github.com/cosmos/ibc-go/v7 v7.3.2 h1:FeUDcBX7VYY0e0iRmcVkPPUjYfAqIc//QuHXo8JHz9c= +github.com/cosmos/ibc-go/v7 v7.3.2/go.mod h1:IMeOXb7gwpZ+/nOG5BuUkdW4weM1ezvN4PQPws4uzOI= github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM= github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0= github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= From 4bc072d46f015bdf55971ce01f1e7f3e8fa7cc37 Mon Sep 17 00:00:00 2001 From: Kevin Yang <5478483+k-yang@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:23:38 -0800 Subject: [PATCH 99/99] fix: remove v2.1.0 upgrade handler --- app/upgrades.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/upgrades.go b/app/upgrades.go index 48727aab9..9cc83f588 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -15,7 +15,6 @@ import ( "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_4_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v1_5_0" "github.com/NibiruChain/nibiru/v2/app/upgrades/v2_0_0" - "github.com/NibiruChain/nibiru/v2/app/upgrades/v2_1_0" ) var Upgrades = []upgrades.Upgrade{ @@ -28,7 +27,6 @@ var Upgrades = []upgrades.Upgrade{ v1_4_0.Upgrade, v1_5_0.Upgrade, v2_0_0.Upgrade, - v2_1_0.Upgrade, } func (app *NibiruApp) setupUpgrades() {