diff --git a/app/app.go b/app/app.go index 2e9027f5..57eb1d76 100644 --- a/app/app.go +++ b/app/app.go @@ -1,167 +1,63 @@ package app import ( - "encoding/json" - "fmt" + _ "embed" "io" "os" "path/filepath" v1p4 "github.com/KYVENetwork/chain/app/upgrades/v1_4" + bundlesKeeper "github.com/KYVENetwork/chain/x/bundles/keeper" + delegationKeeper "github.com/KYVENetwork/chain/x/delegation/keeper" + globalKeeper "github.com/KYVENetwork/chain/x/global/keeper" + poolKeeper "github.com/KYVENetwork/chain/x/pool/keeper" + queryKeeper "github.com/KYVENetwork/chain/x/query/keeper" + stakersKeeper "github.com/KYVENetwork/chain/x/stakers/keeper" + teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" + "github.com/cosmos/cosmos-sdk/client/grpc/node" + "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + authTx "github.com/cosmos/cosmos-sdk/x/auth/tx" + + "cosmossdk.io/depinject" 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" - "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/client/grpc/node" - "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/codec" - "github.com/cosmos/cosmos-sdk/codec/types" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" "github.com/cosmos/cosmos-sdk/runtime" "github.com/cosmos/cosmos-sdk/server" "github.com/cosmos/cosmos-sdk/server/api" "github.com/cosmos/cosmos-sdk/server/config" - serverTypes "github.com/cosmos/cosmos-sdk/server/types" + servertypes "github.com/cosmos/cosmos-sdk/server/types" "github.com/cosmos/cosmos-sdk/store/streaming" - storeTypes "github.com/cosmos/cosmos-sdk/store/types" - sdk "github.com/cosmos/cosmos-sdk/types" + storetypes "github.com/cosmos/cosmos-sdk/store/types" + testdata_pulsar "github.com/cosmos/cosmos-sdk/testutil/testdata/testpb" "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/version" - "github.com/spf13/cast" - - // Auth - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/ante" - authKeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - authTx "github.com/cosmos/cosmos-sdk/x/auth/tx" - authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/cosmos/cosmos-sdk/x/auth/vesting" - vestingTypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" - // Authz - authzTypes "github.com/cosmos/cosmos-sdk/x/authz" - authzKeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" - authz "github.com/cosmos/cosmos-sdk/x/authz/module" - // Bank - "github.com/cosmos/cosmos-sdk/x/bank" - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - bankTypes "github.com/cosmos/cosmos-sdk/x/bank/types" - // Bundles - "github.com/KYVENetwork/chain/x/bundles" - bundlesKeeper "github.com/KYVENetwork/chain/x/bundles/keeper" - bundlesTypes "github.com/KYVENetwork/chain/x/bundles/types" - // Capability - "github.com/cosmos/cosmos-sdk/x/capability" - capabilityKeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" - capabilityTypes "github.com/cosmos/cosmos-sdk/x/capability/types" - // Consensus - "github.com/cosmos/cosmos-sdk/x/consensus" - consensusKeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" - consensusTypes "github.com/cosmos/cosmos-sdk/x/consensus/types" - // Crisis - "github.com/cosmos/cosmos-sdk/x/crisis" - crisisKeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" - crisisTypes "github.com/cosmos/cosmos-sdk/x/crisis/types" - // Delegation - "github.com/KYVENetwork/chain/x/delegation" - delegationKeeper "github.com/KYVENetwork/chain/x/delegation/keeper" - delegationTypes "github.com/KYVENetwork/chain/x/delegation/types" - // Distribution - "github.com/cosmos/cosmos-sdk/x/distribution" - distributionKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - distributionTypes "github.com/cosmos/cosmos-sdk/x/distribution/types" - // Evidence - "github.com/cosmos/cosmos-sdk/x/evidence" - evidenceKeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" - evidenceTypes "github.com/cosmos/cosmos-sdk/x/evidence/types" - // FeeGrant - feeGrantTypes "github.com/cosmos/cosmos-sdk/x/feegrant" - feeGrantKeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" - feeGrant "github.com/cosmos/cosmos-sdk/x/feegrant/module" - // GenUtil - "github.com/cosmos/cosmos-sdk/x/genutil" - genUtilTypes "github.com/cosmos/cosmos-sdk/x/genutil/types" - // Global - "github.com/KYVENetwork/chain/x/global" - globalKeeper "github.com/KYVENetwork/chain/x/global/keeper" - globalTypes "github.com/KYVENetwork/chain/x/global/types" - // Gov - "github.com/cosmos/cosmos-sdk/x/gov" - govKeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" - "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1" - // Group - groupTypes "github.com/cosmos/cosmos-sdk/x/group" - groupKeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" - group "github.com/cosmos/cosmos-sdk/x/group/module" - // IBC Core - ibc "github.com/cosmos/ibc-go/v7/modules/core" - ibcClientHandler "github.com/cosmos/ibc-go/v7/modules/core/02-client" // TODO - ibcClientTypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" - ibcPortTypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" - ibcExported "github.com/cosmos/ibc-go/v7/modules/core/exported" - ibcKeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" - // IBC Fee - 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" - // IBC Transfer - ibcTransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" - ibcTransferKeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" - ibcTransferTypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" - // ICA - ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" - icaTypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" - // ICA Controller - 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" - // ICA Host - icaHost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host" - icaHostKeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" - icaHostTypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" - // Mint - "github.com/cosmos/cosmos-sdk/x/mint" - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - mintTypes "github.com/cosmos/cosmos-sdk/x/mint/types" - // Params - "github.com/cosmos/cosmos-sdk/x/params" - paramsTypes "github.com/cosmos/cosmos-sdk/x/params/types" - paramsProposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal" - // Pool - "github.com/KYVENetwork/chain/x/pool" - poolKeeper "github.com/KYVENetwork/chain/x/pool/keeper" - poolTypes "github.com/KYVENetwork/chain/x/pool/types" - // PFM - pfm "github.com/strangelove-ventures/packet-forward-middleware/v7/router" - pfmKeeper "github.com/strangelove-ventures/packet-forward-middleware/v7/router/keeper" - pfmTypes "github.com/strangelove-ventures/packet-forward-middleware/v7/router/types" - // Query - "github.com/KYVENetwork/chain/x/query" - queryKeeper "github.com/KYVENetwork/chain/x/query/keeper" - queryTypes "github.com/KYVENetwork/chain/x/query/types" - // Slashing - "github.com/cosmos/cosmos-sdk/x/slashing" - slashingKeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" - slashingTypes "github.com/cosmos/cosmos-sdk/x/slashing/types" - // Stakers - "github.com/KYVENetwork/chain/x/stakers" - stakersKeeper "github.com/KYVENetwork/chain/x/stakers/keeper" - stakersTypes "github.com/KYVENetwork/chain/x/stakers/types" - // Staking - "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" - // Team - "github.com/KYVENetwork/chain/x/team" - teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" - teamTypes "github.com/KYVENetwork/chain/x/team/types" - // Upgrade - "github.com/cosmos/cosmos-sdk/x/upgrade" - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" - upgradeTypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" + _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects + authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper" + bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper" + consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper" + feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper" + govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" + groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" + mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" + upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" + icahostkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" + ibcfeekeeper "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/keeper" + ibctransferkeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibckeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + // this line is used by starport scaffolding # stargate/app/moduleImport ) const ( @@ -180,54 +76,155 @@ var ( ) var ( - // TODO(@john): Ask if this is needed for a "v1" app. _ runtime.AppI = (*App)(nil) - _ serverTypes.Application = (*App)(nil) + _ servertypes.Application = (*App)(nil) ) -func init() { - userHomeDir, err := os.UserHomeDir() - if err != nil { - panic(err) - } - - DefaultNodeHome = filepath.Join(userHomeDir, "."+Name) -} - // App extends an ABCI application, but with most of its parameters exported. // They are exported for convenience in creating helper functions, as object // capabilities aren't needed for testing. type App struct { - *baseapp.BaseApp + *runtime.App legacyAmino *codec.LegacyAmino appCodec codec.Codec txConfig client.TxConfig - interfaceRegistry types.InterfaceRegistry + interfaceRegistry codectypes.InterfaceRegistry + + // non depinject support modules store keys + keys map[string]*storetypes.KVStoreKey + + // keepers + AccountKeeper authkeeper.AccountKeeper + BankKeeper bankkeeper.Keeper + CapabilityKeeper *capabilitykeeper.Keeper + StakingKeeper *stakingkeeper.Keeper + SlashingKeeper slashingkeeper.Keeper + MintKeeper mintkeeper.Keeper + DistributionKeeper distrkeeper.Keeper + GovKeeper *govkeeper.Keeper + CrisisKeeper *crisiskeeper.Keeper + UpgradeKeeper *upgradekeeper.Keeper + ParamsKeeper paramskeeper.Keeper + AuthzKeeper authzkeeper.Keeper + EvidenceKeeper evidencekeeper.Keeper + FeeGrantKeeper feegrantkeeper.Keeper + GroupKeeper groupkeeper.Keeper + ConsensusParamsKeeper consensuskeeper.Keeper + + // IBC + IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly + IBCFeeKeeper ibcfeekeeper.Keeper + ICAControllerKeeper icacontrollerkeeper.Keeper + ICAHostKeeper icahostkeeper.Keeper + IBCTransferKeeper ibctransferkeeper.Keeper + + // KYVE Keepers + BundlesKeeper *bundlesKeeper.Keeper + DelegationKeeper *delegationKeeper.Keeper + GlobalKeeper *globalKeeper.Keeper + PoolKeeper *poolKeeper.Keeper + QueryKeeper *queryKeeper.Keeper + TeamKeeper *teamKeeper.Keeper + StakersKeeper *stakersKeeper.Keeper + // this line is used by starport scaffolding # stargate/app/keeperDeclaration + + // Scoped IBC + ScopedIBCKeeper capabilitykeeper.ScopedKeeper + ScopedIBCTransferKeeper capabilitykeeper.ScopedKeeper + ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper + ScopedICAHostKeeper capabilitykeeper.ScopedKeeper +} - keys map[string]*storeTypes.KVStoreKey - tkeys map[string]*storeTypes.TransientStoreKey - memKeys map[string]*storeTypes.MemoryStoreKey +func init() { + userHomeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } - Keepers - mm *module.Manager - configurator module.Configurator + DefaultNodeHome = filepath.Join(userHomeDir, "."+Name) } -// NewKYVEApp returns a reference to an initialized blockchain app -func NewKYVEApp( +// NewKyveApp returns a reference to an initialized App. +func NewKyveApp( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, - appOpts serverTypes.AppOptions, + appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp), ) *App { - encodingConfig := MakeEncodingConfig() - - appCodec := encodingConfig.Marshaler - legacyAmino := encodingConfig.Amino - interfaceRegistry := encodingConfig.InterfaceRegistry - txConfig := encodingConfig.TxConfig + var ( + app = &App{} + appBuilder *runtime.AppBuilder + + // merge the AppConfig and other configuration in one config + appConfig = depinject.Configs( + AppConfig, + depinject.Supply( + // supply the application options + appOpts, + // supply ibc keeper getter for the IBC modules + app.GetIBCeKeeper, + + // ADVANCED CONFIGURATION + // + // AUTH + // + // For providing a custom function required in auth to generate custom account types + // add it below. By default the auth module uses simulation.RandomGenesisAccounts. + // + // authtypes.RandomGenesisAccountsFn(simulation.RandomGenesisAccounts), + + // For providing a custom a base account type add it below. + // By default the auth module uses authtypes.ProtoBaseAccount(). + // + // func() authtypes.AccountI { return authtypes.ProtoBaseAccount() }, + + // + // MINT + // + + // For providing a custom inflation function for x/mint add here your + // custom function that implements the minttypes.InflationCalculationFn + // interface. + ), + ) + ) + + if err := depinject.Inject(appConfig, + &appBuilder, + &app.appCodec, + &app.legacyAmino, + &app.txConfig, + &app.interfaceRegistry, + &app.AccountKeeper, + &app.BankKeeper, + &app.CapabilityKeeper, + &app.StakingKeeper, + &app.SlashingKeeper, + &app.MintKeeper, + &app.DistributionKeeper, + &app.GovKeeper, + &app.CrisisKeeper, + &app.UpgradeKeeper, + &app.ParamsKeeper, + &app.AuthzKeeper, + &app.EvidenceKeeper, + &app.FeeGrantKeeper, + &app.GroupKeeper, + &app.ConsensusParamsKeeper, + // KYVE Modules + &app.BundlesKeeper, + &app.DelegationKeeper, + &app.GlobalKeeper, + &app.PoolKeeper, + &app.QueryKeeper, + &app.TeamKeeper, + &app.StakersKeeper, + // this line is used by starport scaffolding # stargate/app/keeperDefinition + ); err != nil { + panic(err) + } // Below we could construct and set an application specific mempool and // ABCI 1.0 PrepareProposal and ProcessProposal handlers. These defaults are @@ -236,16 +233,16 @@ func NewKYVEApp( // // Example: // - // bApp := baseapp.NewBaseApp(...) + // app.App = appBuilder.Build(...) // nonceMempool := mempool.NewSenderNonceMempool() - // abciPropHandler := NewDefaultProposalHandler(nonceMempool, bApp) + // abciPropHandler := NewDefaultProposalHandler(nonceMempool, app.App.BaseApp) // - // bApp.SetMempool(nonceMempool) - // bApp.SetPrepareProposal(abciPropHandler.PrepareProposalHandler()) - // bApp.SetProcessProposal(abciPropHandler.ProcessProposalHandler()) + // app.App.BaseApp.SetMempool(nonceMempool) + // app.App.BaseApp.SetPrepareProposal(abciPropHandler.PrepareProposalHandler()) + // app.App.BaseApp.SetProcessProposal(abciPropHandler.ProcessProposalHandler()) // // Alternatively, you can construct BaseApp options, append those to - // baseAppOptions and pass them to NewBaseApp. + // baseAppOptions and pass them to the appBuilder. // // Example: // @@ -255,633 +252,62 @@ func NewKYVEApp( // } // baseAppOptions = append(baseAppOptions, prepareOpt) - bApp := baseapp.NewBaseApp(Name, logger, db, txConfig.TxDecoder(), baseAppOptions...) - bApp.SetCommitMultiStoreTracer(traceStore) - bApp.SetVersion(version.Version) - bApp.SetInterfaceRegistry(interfaceRegistry) - bApp.SetTxEncoder(txConfig.TxEncoder()) - - keys := sdk.NewKVStoreKeys( - authTypes.StoreKey, - authzTypes.ModuleName, - bankTypes.StoreKey, - capabilityTypes.StoreKey, - consensusTypes.StoreKey, - crisisTypes.StoreKey, - distributionTypes.StoreKey, - evidenceTypes.StoreKey, - feeGrantTypes.StoreKey, - govTypes.StoreKey, - groupTypes.StoreKey, - mintTypes.StoreKey, - paramsTypes.StoreKey, - slashingTypes.StoreKey, - stakingTypes.StoreKey, - upgradeTypes.StoreKey, - - ibcExported.StoreKey, - ibcFeeTypes.StoreKey, - ibcTransferTypes.StoreKey, - icaControllerTypes.StoreKey, - icaHostTypes.StoreKey, - pfmTypes.StoreKey, + app.App = appBuilder.Build(logger, db, traceStore, baseAppOptions...) - bundlesTypes.StoreKey, - delegationTypes.StoreKey, - globalTypes.StoreKey, - poolTypes.StoreKey, - queryTypes.StoreKey, - stakersTypes.StoreKey, - teamTypes.StoreKey, - ) - tkeys := sdk.NewTransientStoreKeys(paramsTypes.TStoreKey) - memKeys := sdk.NewMemoryStoreKeys( - capabilityTypes.MemStoreKey, - - bundlesTypes.MemStoreKey, delegationTypes.MemStoreKey, - ) + // Register legacy modules + // app.registerIBCModules() // load state streaming if enabled - if _, _, err := streaming.LoadStreamingServices(bApp, appOpts, appCodec, logger, keys); err != nil { + if _, _, err := streaming.LoadStreamingServices(app.App.BaseApp, appOpts, app.appCodec, logger, app.kvStoreKeys()); err != nil { logger.Error("failed to load state streaming", "err", err) os.Exit(1) } - app := &App{ - BaseApp: bApp, - legacyAmino: legacyAmino, - appCodec: appCodec, - txConfig: txConfig, - interfaceRegistry: interfaceRegistry, - keys: keys, - tkeys: tkeys, - memKeys: memKeys, - } - - app.ParamsKeeper = initParamsKeeper( - appCodec, - legacyAmino, - keys[paramsTypes.StoreKey], - tkeys[paramsTypes.TStoreKey], - ) - - // set the BaseApp's parameter store - app.ConsensusKeeper = consensusKeeper.NewKeeper( - appCodec, - keys[consensusTypes.StoreKey], - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - bApp.SetParamStore(&app.ConsensusKeeper) - - // add capability keeper and ScopeToModule for ibc module - app.CapabilityKeeper = capabilityKeeper.NewKeeper( - appCodec, - keys[capabilityTypes.StoreKey], - memKeys[capabilityTypes.MemStoreKey], - ) - - scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcExported.ModuleName) - scopedIBCTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibcTransferTypes.ModuleName) - scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icaControllerTypes.SubModuleName) - scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icaHostTypes.SubModuleName) - - // TODO(@john): Seal x/capability keeper. - - // add keepers - app.AccountKeeper = authKeeper.NewAccountKeeper( - appCodec, - keys[authTypes.StoreKey], - authTypes.ProtoBaseAccount, - moduleAccountPermissions, - sdk.Bech32MainPrefix, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.AuthzKeeper = authzKeeper.NewKeeper( - keys[authzTypes.ModuleName], - appCodec, - app.MsgServiceRouter(), - app.AccountKeeper, - ) - - app.BankKeeper = bankKeeper.NewBaseKeeper( - appCodec, - keys[bankTypes.StoreKey], - app.AccountKeeper, - app.BlockedModuleAccountAddrs(), - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.StakingKeeper = stakingKeeper.NewKeeper( - appCodec, - keys[stakingTypes.StoreKey], - app.AccountKeeper, - app.BankKeeper, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.MintKeeper = mintKeeper.NewKeeper( - appCodec, - keys[mintTypes.StoreKey], - app.StakingKeeper, - &app.StakersKeeper, // TODO(@john) - app.AccountKeeper, - app.BankKeeper, - authTypes.FeeCollectorName, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.DistributionKeeper = distributionKeeper.NewKeeper( - appCodec, - keys[distributionTypes.StoreKey], - app.AccountKeeper, - app.BankKeeper, - app.StakingKeeper, - authTypes.FeeCollectorName, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.SlashingKeeper = slashingKeeper.NewKeeper( - appCodec, - legacyAmino, - keys[slashingTypes.StoreKey], - app.StakingKeeper, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - invCheckPeriod := cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)) - app.CrisisKeeper = crisisKeeper.NewKeeper( - appCodec, - keys[crisisTypes.StoreKey], - invCheckPeriod, - app.BankKeeper, - authTypes.FeeCollectorName, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - app.FeeGrantKeeper = feeGrantKeeper.NewKeeper( - appCodec, - keys[feeGrantTypes.StoreKey], - app.AccountKeeper, - ) - - app.GroupKeeper = groupKeeper.NewKeeper( - keys[groupTypes.StoreKey], - appCodec, - app.MsgServiceRouter(), - app.AccountKeeper, - groupTypes.DefaultConfig(), - ) - - // get skipUpgradeHeights from the app options - skipUpgradeHeights := map[int64]bool{} - for _, h := range cast.ToIntSlice(appOpts.Get(server.FlagUnsafeSkipUpgrades)) { - skipUpgradeHeights[int64(h)] = true - } - homePath := cast.ToString(appOpts.Get(flags.FlagHome)) - // set the governance module account as the authority for conducting upgrades - app.UpgradeKeeper = upgradeKeeper.NewKeeper( - skipUpgradeHeights, - keys[upgradeTypes.StoreKey], - appCodec, - homePath, - app.BaseApp, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - - // register the staking hooks - // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks - app.StakingKeeper.SetHooks( - stakingTypes.NewMultiStakingHooks(app.DistributionKeeper.Hooks(), app.SlashingKeeper.Hooks()), - ) - - // ... other modules keepers - app.GlobalKeeper = *globalKeeper.NewKeeper(appCodec, keys[globalTypes.StoreKey], authTypes.NewModuleAddress(govTypes.ModuleName).String()) - - app.TeamKeeper = *teamKeeper.NewKeeper(appCodec, keys[teamTypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.MintKeeper, *app.UpgradeKeeper) - - app.PoolKeeper = *poolKeeper.NewKeeper( - appCodec, - keys[poolTypes.StoreKey], - memKeys[poolTypes.MemStoreKey], - - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - - app.AccountKeeper, - app.BankKeeper, - app.DistributionKeeper, - app.MintKeeper, - app.UpgradeKeeper, - app.TeamKeeper, - ) - - app.StakersKeeper = *stakersKeeper.NewKeeper( - appCodec, - keys[stakersTypes.StoreKey], - memKeys[stakersTypes.MemStoreKey], - - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - - app.AccountKeeper, - app.BankKeeper, - app.DistributionKeeper, - app.PoolKeeper, - app.UpgradeKeeper, - ) - - app.DelegationKeeper = *delegationKeeper.NewKeeper( - appCodec, - keys[delegationTypes.StoreKey], - memKeys[delegationTypes.MemStoreKey], - - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - - app.AccountKeeper, - app.BankKeeper, - app.DistributionKeeper, - app.PoolKeeper, - app.UpgradeKeeper, - app.StakersKeeper, - ) - - stakersKeeper.SetDelegationKeeper(&app.StakersKeeper, app.DelegationKeeper) - poolKeeper.SetStakersKeeper(&app.PoolKeeper, app.StakersKeeper) - - app.BundlesKeeper = *bundlesKeeper.NewKeeper( - appCodec, - keys[bundlesTypes.StoreKey], - memKeys[bundlesTypes.MemStoreKey], - - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - - app.AccountKeeper, - app.BankKeeper, - app.DistributionKeeper, - app.PoolKeeper, - app.StakersKeeper, - app.DelegationKeeper, - ) - - app.IBCKeeper = ibcKeeper.NewKeeper( - appCodec, - keys[ibcExported.StoreKey], - app.GetSubspace(ibcExported.ModuleName), - app.StakingKeeper, - app.UpgradeKeeper, - scopedIBCKeeper, - ) - - app.IBCFeeKeeper = ibcFeeKeeper.NewKeeper( - appCodec, - keys[ibcFeeTypes.StoreKey], - app.IBCKeeper.ChannelKeeper, - app.IBCKeeper.ChannelKeeper, - &app.IBCKeeper.PortKeeper, - app.AccountKeeper, - app.BankKeeper, - ) - - app.IBCTransferKeeper = ibcTransferKeeper.NewKeeper( - appCodec, - keys[ibcTransferTypes.StoreKey], - app.GetSubspace(ibcTransferTypes.ModuleName), - app.IBCKeeper.ChannelKeeper, - app.IBCKeeper.ChannelKeeper, - &app.IBCKeeper.PortKeeper, - app.AccountKeeper, - app.BankKeeper, - scopedIBCTransferKeeper, - ) - - app.ICAControllerKeeper = icaControllerKeeper.NewKeeper( - appCodec, - keys[icaControllerTypes.StoreKey], - app.GetSubspace(icaControllerTypes.SubModuleName), - app.IBCKeeper.ChannelKeeper, - app.IBCKeeper.ChannelKeeper, - &app.IBCKeeper.PortKeeper, - scopedICAControllerKeeper, - app.MsgServiceRouter(), - ) - - app.ICAHostKeeper = icaHostKeeper.NewKeeper( - appCodec, - keys[icaHostTypes.StoreKey], - app.GetSubspace(icaHostTypes.SubModuleName), - app.IBCKeeper.ChannelKeeper, - app.IBCKeeper.ChannelKeeper, - &app.IBCKeeper.PortKeeper, - app.AccountKeeper, - scopedICAHostKeeper, - app.MsgServiceRouter(), - ) - - app.PFMKeeper = pfmKeeper.NewKeeper( - appCodec, keys[pfmTypes.StoreKey], - app.GetSubspace(pfmTypes.ModuleName), - app.IBCTransferKeeper, - app.IBCKeeper.ChannelKeeper, - app.DistributionKeeper, - app.BankKeeper, - app.IBCKeeper.ChannelKeeper, - ) - - // Create evidence Keeper for to register the IBC light client misbehaviour evidence route - app.EvidenceKeeper = evidenceKeeper.NewKeeper( - appCodec, - keys[evidenceTypes.StoreKey], - app.StakingKeeper, - app.SlashingKeeper, - ) - // If evidence needs to be handled for the app, set routes in router here and seal - // app.EvidenceKeeper = *evidenceKeeper - - govRouter := v1beta1.NewRouter() - govRouter. - AddRoute(govTypes.RouterKey, v1beta1.ProposalHandler). - AddRoute(paramsProposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)). - // AddRoute(distrtypes.RouterKey, distribution.NewCommunityPoolSpendProposalHandler(app.DistributionKeeper)). - AddRoute(upgradeTypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)). - AddRoute(ibcClientTypes.RouterKey, ibcClientHandler.NewClientProposalHandler(app.IBCKeeper.ClientKeeper)) - govConfig := govTypes.DefaultConfig() - app.GovKeeper = govKeeper.NewKeeper( - appCodec, - keys[govTypes.StoreKey], - app.AccountKeeper, - app.BankKeeper, - app.StakingKeeper, - app.StakersKeeper, - app.MsgServiceRouter(), - govConfig, - authTypes.NewModuleAddress(govTypes.ModuleName).String(), - ) - app.GovKeeper.SetLegacyRouter(govRouter) - - app.QueryKeeper = *queryKeeper.NewKeeper( - appCodec, - keys[queryTypes.StoreKey], - keys[queryTypes.MemStoreKey], - app.GetSubspace(queryTypes.ModuleName), - - app.AccountKeeper, - app.BankKeeper, - app.DistributionKeeper, - app.PoolKeeper, - app.StakersKeeper, - app.DelegationKeeper, - app.BundlesKeeper, - app.GlobalKeeper, - *app.GovKeeper, - app.TeamKeeper, - ) - // this line is used by starport scaffolding # stargate/app/keeperDefinition - - // Create static IBC router, add transfer route, then set and seal it - var ibcTransferStack ibcPortTypes.IBCModule - ibcTransferStack = ibcTransfer.NewIBCModule(app.IBCTransferKeeper) - ibcTransferStack = ibcFee.NewIBCMiddleware(ibcTransferStack, app.IBCFeeKeeper) - ibcTransferStack = pfm.NewIBCMiddleware( - ibcTransferStack, - app.PFMKeeper, - 0, - pfmKeeper.DefaultForwardTransferPacketTimeoutTimestamp, - pfmKeeper.DefaultRefundTransferPacketTimeoutTimestamp, - ) - - var icaControllerStack ibcPortTypes.IBCModule - icaControllerStack = icaController.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper) - icaControllerStack = ibcFee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper) - - var icaHostStack ibcPortTypes.IBCModule - icaHostStack = icaHost.NewIBCModule(app.ICAHostKeeper) - icaHostStack = ibcFee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper) - - ibcRouter := ibcPortTypes.NewRouter() - ibcRouter.AddRoute(ibcTransferTypes.ModuleName, ibcTransferStack). - AddRoute(icaControllerTypes.SubModuleName, icaControllerStack). - AddRoute(icaHostTypes.SubModuleName, icaHostStack) - app.IBCKeeper.SetRouter(ibcRouter) - /**** Module Options ****/ - // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment - // we prefer to be more strict in what arguments the modules expect. - skipGenesisInvariants := cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants)) - - // NOTE: Any module instantiated in the module manager that is later modified - // must be passed by reference here. - - app.mm = module.NewManager( - // Cosmos SDK - auth.NewAppModule(appCodec, app.AccountKeeper, nil, app.GetSubspace(authTypes.ModuleName)), - authz.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper, app.GetSubspace(bankTypes.ModuleName)), - capability.NewAppModule(appCodec, *app.CapabilityKeeper, false), - consensus.NewAppModule(appCodec, app.ConsensusKeeper), - crisis.NewAppModule(app.CrisisKeeper, skipGenesisInvariants, app.GetSubspace(crisisTypes.ModuleName)), - distribution.NewAppModule(appCodec, app.DistributionKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(distributionTypes.ModuleName)), - evidence.NewAppModule(*app.EvidenceKeeper), - feeGrant.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry), - genutil.NewAppModule( - app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx, - encodingConfig.TxConfig, - ), - gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(govTypes.ModuleName)), - group.NewAppModule(appCodec, app.GroupKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), - mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper, mintTypes.DefaultInflationCalculationFn, app.GetSubspace(mintTypes.ModuleName)), - params.NewAppModule(app.ParamsKeeper), - slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper, app.GetSubspace(slashingTypes.ModuleName)), - staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.GetSubspace(stakingTypes.ModuleName)), - upgrade.NewAppModule(app.UpgradeKeeper), - vesting.NewAppModule(app.AccountKeeper, app.BankKeeper), - - // IBC - ibc.NewAppModule(app.IBCKeeper), - ibcFee.NewAppModule(app.IBCFeeKeeper), - ibcTransfer.NewAppModule(app.IBCTransferKeeper), - ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper), - - // KYVE - bundles.NewAppModule(appCodec, app.BundlesKeeper, app.AccountKeeper, app.BankKeeper, app.DistributionKeeper, app.MintKeeper, *app.UpgradeKeeper, app.PoolKeeper, app.TeamKeeper), - delegation.NewAppModule(appCodec, app.DelegationKeeper, app.AccountKeeper, app.BankKeeper), - global.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.GlobalKeeper, *app.UpgradeKeeper), - pool.NewAppModule(appCodec, app.PoolKeeper, app.AccountKeeper, app.BankKeeper, *app.UpgradeKeeper), - query.NewAppModule(appCodec, app.QueryKeeper, app.AccountKeeper, app.BankKeeper), - stakers.NewAppModule(appCodec, app.StakersKeeper, app.AccountKeeper, app.BankKeeper), - team.NewAppModule(appCodec, app.BankKeeper, app.MintKeeper, app.TeamKeeper, *app.UpgradeKeeper), - ) - - // During begin block slashing happens after distr.BeginBlocker so that - // there is nothing left over in the validator fee pool, so as to keep the - // CanWithdrawInvariant invariant. - // NOTE: staking module is required if HistoricalEntries param > 0 - app.mm.SetOrderBeginBlockers( - // upgrades should be run first - upgradeTypes.ModuleName, - capabilityTypes.ModuleName, - mintTypes.ModuleName, - // NOTE: x/team must be run before x/distribution and after x/mint. - teamTypes.ModuleName, - // NOTE: x/bundles must be run before x/distribution and after x/team. - bundlesTypes.ModuleName, - distributionTypes.ModuleName, - slashingTypes.ModuleName, - evidenceTypes.ModuleName, - stakingTypes.ModuleName, - authTypes.ModuleName, - bankTypes.ModuleName, - govTypes.ModuleName, - crisisTypes.ModuleName, - ibcFeeTypes.ModuleName, - ibcTransferTypes.ModuleName, - ibcExported.ModuleName, - icaTypes.ModuleName, - genUtilTypes.ModuleName, - authzTypes.ModuleName, - feeGrantTypes.ModuleName, - groupTypes.ModuleName, - paramsTypes.ModuleName, - vestingTypes.ModuleName, - consensusTypes.ModuleName, - - // this line is used by starport scaffolding # stargate/app/beginBlockers - poolTypes.ModuleName, - stakersTypes.ModuleName, - delegationTypes.ModuleName, - queryTypes.ModuleName, - globalTypes.ModuleName, - ) - - app.mm.SetOrderEndBlockers( - crisisTypes.ModuleName, - govTypes.ModuleName, - stakingTypes.ModuleName, - ibcFeeTypes.ModuleName, - ibcTransferTypes.ModuleName, - ibcExported.ModuleName, - icaTypes.ModuleName, - capabilityTypes.ModuleName, - authTypes.ModuleName, - bankTypes.ModuleName, - distributionTypes.ModuleName, - slashingTypes.ModuleName, - mintTypes.ModuleName, - genUtilTypes.ModuleName, - evidenceTypes.ModuleName, - authzTypes.ModuleName, - feeGrantTypes.ModuleName, - groupTypes.ModuleName, - paramsTypes.ModuleName, - upgradeTypes.ModuleName, - vestingTypes.ModuleName, - consensusTypes.ModuleName, - - // this line is used by starport scaffolding # stargate/app/endBlockers - poolTypes.ModuleName, - stakersTypes.ModuleName, - delegationTypes.ModuleName, - bundlesTypes.ModuleName, - queryTypes.ModuleName, - globalTypes.ModuleName, - teamTypes.ModuleName, - ) - - // NOTE: The genutils module must occur after staking so that pools are - // properly initialized with tokens from genesis accounts. - // NOTE: Capability module must occur first so that it can initialize any capabilities - // so that other modules that want to create or claim capabilities afterwards in InitChain - // can do so safely. - app.mm.SetOrderInitGenesis( - capabilityTypes.ModuleName, - authTypes.ModuleName, - bankTypes.ModuleName, - distributionTypes.ModuleName, - stakingTypes.ModuleName, - slashingTypes.ModuleName, - govTypes.ModuleName, - mintTypes.ModuleName, - crisisTypes.ModuleName, - genUtilTypes.ModuleName, - ibcFeeTypes.ModuleName, - ibcTransferTypes.ModuleName, - ibcExported.ModuleName, - icaTypes.ModuleName, - evidenceTypes.ModuleName, - authzTypes.ModuleName, - feeGrantTypes.ModuleName, - groupTypes.ModuleName, - paramsTypes.ModuleName, - upgradeTypes.ModuleName, - vestingTypes.ModuleName, - consensusTypes.ModuleName, - - // this line is used by starport scaffolding # stargate/app/initGenesis - poolTypes.ModuleName, - stakersTypes.ModuleName, - delegationTypes.ModuleName, - bundlesTypes.ModuleName, - queryTypes.ModuleName, - globalTypes.ModuleName, - teamTypes.ModuleName, - ) - - // Uncomment if you want to set a custom migration order here. - // app.mm.SetOrderMigrations(custom order) - - app.mm.RegisterInvariants(app.CrisisKeeper) - app.configurator = module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()) - app.mm.RegisterServices(app.configurator) - - // initialize stores - app.MountKVStores(keys) - app.MountTransientStores(tkeys) - app.MountMemoryStores(memKeys) + // app.RegisterLegacyModules() - // initialize BaseApp - var err error + app.ModuleManager.RegisterInvariants(app.CrisisKeeper) - anteHandler, err := NewAnteHandler( - app.AccountKeeper, - app.BankKeeper, - app.FeeGrantKeeper, - app.GlobalKeeper, - app.IBCKeeper, - *app.StakingKeeper, - ante.DefaultSigVerificationGasConsumer, - encodingConfig.TxConfig.SignModeHandler(), - ) - if err != nil { - panic(fmt.Errorf("failed to create AnteHandler: %s", err)) - } - - postHandler, err := NewPostHandler( - app.BankKeeper, - app.FeeGrantKeeper, - app.GlobalKeeper, - ) - if err != nil { - panic(fmt.Errorf("failed to create PostHandler: %s", err)) - } + // add test gRPC service for testing gRPC queries in isolation + testdata_pulsar.RegisterQueryServer(app.GRPCQueryRouter(), testdata_pulsar.QueryImpl{}) - app.SetAnteHandler(anteHandler) - app.SetPostHandler(postHandler) - app.SetInitChainer(app.InitChainer) - app.SetBeginBlocker(app.BeginBlocker) - app.SetEndBlocker(app.EndBlocker) + // create the simulation manager and define the order of the modules for deterministic simulations + // + // NOTE: this is not required apps that don't use the simulator for fuzz testing + // transactions + //overrideModules := map[string]module.AppModuleSimulation{ + // authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)), + //} + //app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, overrideModules) + // + //app.sm.RegisterStoreDecoders() - app.UpgradeKeeper.SetUpgradeHandler( - v1p4.UpgradeName, - v1p4.CreateUpgradeHandler( - app.mm, - app.configurator, - appCodec, - app.ConsensusKeeper, - app.GlobalKeeper, - *app.GovKeeper, - *app.IBCKeeper, - app.ParamsKeeper, - ), - ) + // A custom InitChainer can be set if extra pre-init-genesis logic is required. + // By default, when using app wiring enabled module, this is not required. + // For instance, the upgrade module will set automatically the module version map in its init genesis thanks to app wiring. + // However, when registering a module manually (i.e. that does not support app wiring), the module version map + // must be set manually as follow. The upgrade module will de-duplicate the module version map. + // + // app.SetInitChainer(func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { + // app.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap()) + // return app.App.InitChainer(ctx, req) + // }) + + // TODO(rapha): handle upgrade + //app.UpgradeKeeper.SetUpgradeHandler( + // v1p4.UpgradeName, + // v1p4.CreateUpgradeHandler( + // app.ModuleManager, + // app.Configurator(), + // app.AppCodec(), + // app.ConsensusKeeper, + // app.GlobalKeeper, + // *app.GovKeeper, + // *app.IBCKeeper, + // app.ParamsKeeper, + // ), + //) upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() if err != nil { @@ -892,53 +318,17 @@ func NewKYVEApp( app.SetStoreLoader(v1p4.CreateStoreLoader(upgradeInfo.Height)) } - if loadLatest { - if err := app.LoadLatestVersion(); err != nil { - cmtOs.Exit(err.Error()) - } + if err := app.Load(loadLatest); err != nil { + panic(err) } - app.ScopedIBCKeeper = scopedIBCKeeper - app.ScopedIBCTransferKeeper = scopedIBCTransferKeeper - app.ScopedICAControllerKeeper = scopedICAControllerKeeper - app.ScopedICAHostKeeper = scopedICAHostKeeper - return app } // Name returns the name of the App func (app *App) Name() string { return app.BaseApp.Name() } -// BeginBlocker application updates every begin block -func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock { - return app.mm.BeginBlock(ctx, req) -} - -// EndBlocker application updates every end block -func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock { - return app.mm.EndBlock(ctx, req) -} - -func (app *App) Configurator() module.Configurator { - return app.configurator -} - -// InitChainer application update at chain initialization -func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain { - var genesisState GenesisState - if err := json.Unmarshal(req.AppStateBytes, &genesisState); err != nil { - panic(err) - } - app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) - return app.mm.InitGenesis(ctx, app.appCodec, genesisState) -} - -// LoadHeight loads a particular height -func (app *App) LoadHeight(height int64) error { - return app.LoadVersion(height) -} - -// LegacyAmino returns SimApp's amino codec. +// LegacyAmino returns App's amino codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable // for modules to register their own custom testing types. @@ -946,7 +336,7 @@ func (app *App) LegacyAmino() *codec.LegacyAmino { return app.legacyAmino } -// AppCodec returns an app codec. +// AppCodec returns App's app codec. // // NOTE: This is solely to be used for testing purposes as it may be desirable // for modules to register their own custom testing types. @@ -954,50 +344,57 @@ func (app *App) AppCodec() codec.Codec { return app.appCodec } -// InterfaceRegistry returns an InterfaceRegistry -func (app *App) InterfaceRegistry() types.InterfaceRegistry { +// InterfaceRegistry returns App's InterfaceRegistry +func (app *App) InterfaceRegistry() codectypes.InterfaceRegistry { return app.interfaceRegistry } -// TxConfig returns a TxConfig +// TxConfig returns App's TxConfig func (app *App) TxConfig() client.TxConfig { return app.txConfig } -// DefaultGenesis returns a default genesis from the registered AppModuleBasic's. -func (app *App) DefaultGenesis() map[string]json.RawMessage { - return ModuleBasics.DefaultGenesis(app.appCodec) -} - // GetKey returns the KVStoreKey for the provided store key. -// -// NOTE: This is solely to be used for testing purposes. -func (app *App) GetKey(storeKey string) *storeTypes.KVStoreKey { - return app.keys[storeKey] -} +func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey { + if key, ok := app.keys[storeKey]; ok { + return key + } -// GetTKey returns the TransientStoreKey for the provided store key. -// -// NOTE: This is solely to be used for testing purposes. -func (app *App) GetTKey(storeKey string) *storeTypes.TransientStoreKey { - return app.tkeys[storeKey] + sk := app.UnsafeFindStoreKey(storeKey) + kvStoreKey, ok := sk.(*storetypes.KVStoreKey) + if !ok { + return nil + } + return kvStoreKey } -// GetMemKey returns the MemStoreKey for the provided mem key. -// -// NOTE: This is solely used for testing purposes. -func (app *App) GetMemKey(storeKey string) *storeTypes.MemoryStoreKey { - return app.memKeys[storeKey] +// kvStoreKeys returns all the kv store keys registered inside App. +func (app *App) kvStoreKeys() map[string]*storetypes.KVStoreKey { + keys := make(map[string]*storetypes.KVStoreKey) + for _, k := range app.GetStoreKeys() { + if kv, ok := k.(*storetypes.KVStoreKey); ok { + keys[kv.Name()] = kv + } + } + + for _, kv := range app.keys { + keys[kv.Name()] = kv + } + + return keys } // GetSubspace returns a param subspace for a given module name. -// -// NOTE: This is solely to be used for testing purposes. -func (app *App) GetSubspace(moduleName string) paramsTypes.Subspace { +func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { subspace, _ := app.ParamsKeeper.GetSubspace(moduleName) return subspace } +// SimulationManager implements the SimulationApp interface. +func (app *App) SimulationManager() *module.SimulationManager { + return nil +} + // RegisterAPIRoutes registers all application module routes with the provided // API server. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) { @@ -1020,25 +417,33 @@ func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig } } -// RegisterTxService implements the Application.RegisterTxService method. -func (app *App) RegisterTxService(clientCtx client.Context) { - authTx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry) +// GetIBCeKeeper returns the IBC keeper +func (app *App) GetIBCeKeeper() *ibckeeper.Keeper { + return app.IBCKeeper } -// RegisterTendermintService implements the Application.RegisterTendermintService method. -func (app *App) RegisterTendermintService(clientCtx client.Context) { - tmservice.RegisterTendermintService( - clientCtx, - app.BaseApp.GRPCQueryRouter(), - app.interfaceRegistry, - app.Query, - ) +// GetMaccPerms returns a copy of the module account permissions +// +// NOTE: This is solely to be used for testing purposes. +func GetMaccPerms() map[string][]string { + dup := make(map[string][]string) + for _, perms := range moduleAccPerms { + dup[perms.Account] = perms.Permissions + } + return dup } -func (app *App) RegisterNodeService(clientCtx client.Context) { - node.RegisterNodeService(clientCtx, app.GRPCQueryRouter()) +// BlockedAddresses returns all the app's blocked account addresses. +func BlockedAddresses() map[string]bool { + result := make(map[string]bool) + if len(blockAccAddrs) > 0 { + for _, addr := range blockAccAddrs { + result[addr] = true + } + } else { + for addr := range GetMaccPerms() { + result[addr] = true + } + } + return result } - -// SimulationManager implements the SimulationApp interface. -// NOTE: We simply return nil as we don't use the simulation manager anywhere. -func (app *App) SimulationManager() *module.SimulationManager { return nil } diff --git a/app/app_config.go b/app/app_config.go new file mode 100644 index 00000000..b04b1959 --- /dev/null +++ b/app/app_config.go @@ -0,0 +1,392 @@ +package app + +import ( + "time" + + runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1" + appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" + txconfigv1 "cosmossdk.io/api/cosmos/tx/config/v1" + "cosmossdk.io/core/appconfig" + stakersmodule "github.com/KYVENetwork/chain/pulsar/kyve/stakers/module/v1" + "google.golang.org/protobuf/types/known/durationpb" + + // Auth + authmodulev1 "cosmossdk.io/api/cosmos/auth/module/v1" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + // Authz + authzmodulev1 "cosmossdk.io/api/cosmos/authz/module/v1" + "github.com/cosmos/cosmos-sdk/x/authz" + // Bank + bankmodulev1 "cosmossdk.io/api/cosmos/bank/module/v1" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + // Bundles + bundlesmodule "github.com/KYVENetwork/chain/pulsar/kyve/bundles/module/v1" + bundlestypes "github.com/KYVENetwork/chain/x/bundles/types" + // Capability + capabilitymodulev1 "cosmossdk.io/api/cosmos/capability/module/v1" + capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" + // Consensus + consensusmodulev1 "cosmossdk.io/api/cosmos/consensus/module/v1" + consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + // Crisis + crisismodulev1 "cosmossdk.io/api/cosmos/crisis/module/v1" + crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + // Delegation + delegationmodule "github.com/KYVENetwork/chain/pulsar/kyve/delegation/module/v1" + delegationtypes "github.com/KYVENetwork/chain/x/delegation/types" + // Distribution + distrmodulev1 "cosmossdk.io/api/cosmos/distribution/module/v1" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + // Evidence + evidencemodulev1 "cosmossdk.io/api/cosmos/evidence/module/v1" + evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types" + // FeeGrant + feegrantmodulev1 "cosmossdk.io/api/cosmos/feegrant/module/v1" + "github.com/cosmos/cosmos-sdk/x/feegrant" + // Genutil + genutilmodulev1 "cosmossdk.io/api/cosmos/genutil/module/v1" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + // Global + globalmodule "github.com/KYVENetwork/chain/pulsar/kyve/global/module/v1" + globaltypes "github.com/KYVENetwork/chain/x/global/types" + // Governance + govmodulev1 "cosmossdk.io/api/cosmos/gov/module/v1" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + // Group + groupmodulev1 "cosmossdk.io/api/cosmos/group/module/v1" + "github.com/cosmos/cosmos-sdk/x/group" + // IBC Core + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" + // IBC Fee + ibcfeetypes "github.com/cosmos/ibc-go/v7/modules/apps/29-fee/types" + // IBC Transfer + ibctransfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + // ICA + icatypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + // Mint + mintmodulev1 "cosmossdk.io/api/cosmos/mint/module/v1" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" + // Params + paramsmodulev1 "cosmossdk.io/api/cosmos/params/module/v1" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + // Pool + poolmodule "github.com/KYVENetwork/chain/pulsar/kyve/pool/module/v1" + pooltypes "github.com/KYVENetwork/chain/x/pool/types" + // Query + querymodule "github.com/KYVENetwork/chain/pulsar/kyve/query/module/v1" + querytypes "github.com/KYVENetwork/chain/x/query/types" + // Slashing + slashingmodulev1 "cosmossdk.io/api/cosmos/slashing/module/v1" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + + stakerstypes "github.com/KYVENetwork/chain/x/stakers/types" + // Staking + stakingmodulev1 "cosmossdk.io/api/cosmos/staking/module/v1" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + // Team + teammodule "github.com/KYVENetwork/chain/pulsar/kyve/team/module/v1" + teamtypes "github.com/KYVENetwork/chain/x/team/types" + // Upgrade + upgrademodulev1 "cosmossdk.io/api/cosmos/upgrade/module/v1" + upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + // Vesting + vestingmodulev1 "cosmossdk.io/api/cosmos/vesting/module/v1" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + // this line is used by starport scaffolding # stargate/app/moduleImport +) + +var ( + // NOTE: The genutils module must occur after staking so that pools are + // properly initialized with tokens from genesis accounts. + // NOTE: The genutils module must also occur after auth so that it can access the params from auth. + // NOTE: Capability module must occur first so that it can initialize any capabilities + // so that other modules that want to create or claim capabilities afterwards in InitChain + // can do so safely. + genesisModuleOrder = []string{ + capabilitytypes.ModuleName, + authtypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + stakingtypes.ModuleName, + ibcexported.ModuleName, + ibctransfertypes.ModuleName, + slashingtypes.ModuleName, + govtypes.ModuleName, + minttypes.ModuleName, + crisistypes.ModuleName, + genutiltypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + group.ModuleName, + paramstypes.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + icatypes.ModuleName, + ibcfeetypes.ModuleName, + consensustypes.ModuleName, + + // Kyve modules + pooltypes.ModuleName, + delegationtypes.ModuleName, + bundlestypes.ModuleName, + querytypes.ModuleName, + globaltypes.ModuleName, + teamtypes.ModuleName, + stakerstypes.ModuleName, + // this line is used by starport scaffolding # stargate/app/initGenesis + } + + // During begin block slashing happens after distr.BeginBlocker so that + // there is nothing left over in the validator fee pool, so as to keep the + // CanWithdrawInvariant invariant. + // NOTE: staking module is required if HistoricalEntries param > 0 + // NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC) + beginBlockers = []string{ + upgradetypes.ModuleName, + capabilitytypes.ModuleName, + minttypes.ModuleName, + // NOTE: x/team must be run before x/distribution and after x/mint. + teamtypes.ModuleName, + distrtypes.ModuleName, + slashingtypes.ModuleName, + evidencetypes.ModuleName, + stakingtypes.ModuleName, + ibcexported.ModuleName, + authtypes.ModuleName, + ibctransfertypes.ModuleName, + banktypes.ModuleName, + govtypes.ModuleName, + crisistypes.ModuleName, + ibctransfertypes.ModuleName, + icatypes.ModuleName, + genutiltypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + group.ModuleName, + paramstypes.ModuleName, + vestingtypes.ModuleName, + icatypes.ModuleName, + ibcfeetypes.ModuleName, + consensustypes.ModuleName, + // Kyve modules + pooltypes.ModuleName, + delegationtypes.ModuleName, + bundlestypes.ModuleName, + querytypes.ModuleName, + globaltypes.ModuleName, + stakerstypes.ModuleName, + // this line is used by starport scaffolding # stargate/app/beginBlockers + } + + endBlockers = []string{ + crisistypes.ModuleName, + govtypes.ModuleName, + stakingtypes.ModuleName, + ibcexported.ModuleName, + ibctransfertypes.ModuleName, + capabilitytypes.ModuleName, + authtypes.ModuleName, + banktypes.ModuleName, + distrtypes.ModuleName, + slashingtypes.ModuleName, + minttypes.ModuleName, + genutiltypes.ModuleName, + evidencetypes.ModuleName, + authz.ModuleName, + feegrant.ModuleName, + group.ModuleName, + paramstypes.ModuleName, + upgradetypes.ModuleName, + vestingtypes.ModuleName, + icatypes.ModuleName, + ibcfeetypes.ModuleName, + consensustypes.ModuleName, + // Kyve modules + pooltypes.ModuleName, + delegationtypes.ModuleName, + bundlestypes.ModuleName, + querytypes.ModuleName, + globaltypes.ModuleName, + teamtypes.ModuleName, + stakerstypes.ModuleName, + // this line is used by starport scaffolding # stargate/app/endBlockers + } + + // module account permissions + moduleAccPerms = []*authmodulev1.ModuleAccountPermission{ + {Account: authtypes.FeeCollectorName}, + {Account: distrtypes.ModuleName}, + {Account: icatypes.ModuleName}, + {Account: minttypes.ModuleName, Permissions: []string{authtypes.Minter}}, + {Account: stakingtypes.BondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, + {Account: stakingtypes.NotBondedPoolName, Permissions: []string{authtypes.Burner, stakingtypes.ModuleName}}, + {Account: govtypes.ModuleName, Permissions: []string{authtypes.Burner}}, + {Account: ibctransfertypes.ModuleName, Permissions: []string{authtypes.Minter, authtypes.Burner}}, + + // KYVE + {Account: bundlestypes.ModuleName}, + {Account: delegationtypes.ModuleName}, + {Account: pooltypes.ModuleName}, + {Account: globaltypes.ModuleName, Permissions: []string{authtypes.Burner}}, + {Account: teamtypes.ModuleName}, + {Account: stakerstypes.ModuleName}, + // this line is used by starport scaffolding # stargate/app/maccPerms + } + + // blocked account addresses + blockAccAddrs = []string{ + authtypes.FeeCollectorName, + distrtypes.ModuleName, + minttypes.ModuleName, + stakingtypes.BondedPoolName, + stakingtypes.NotBondedPoolName, + // We allow the following module accounts to receive funds: + // govtypes.ModuleName + } + + // AppConfig application configuration (used by depinject) + AppConfig = appconfig.Compose(&appv1alpha1.Config{ + Modules: []*appv1alpha1.ModuleConfig{ + { + Name: "runtime", + Config: appconfig.WrapAny(&runtimev1alpha1.Module{ + AppName: Name, + BeginBlockers: beginBlockers, + EndBlockers: endBlockers, + OverrideStoreKeys: []*runtimev1alpha1.StoreKeyConfig{ + { + ModuleName: authtypes.ModuleName, + KvStoreKey: "acc", + }, + }, + InitGenesis: genesisModuleOrder, + // When ExportGenesis is not specified, the export genesis module order + // is equal to the init genesis order + // ExportGenesis: genesisModuleOrder, + // Uncomment if you want to set a custom migration order here. + // OrderMigrations: nil, + }), + }, + { + Name: authtypes.ModuleName, + Config: appconfig.WrapAny(&authmodulev1.Module{ + Bech32Prefix: "kyve", + ModuleAccountPermissions: moduleAccPerms, + // By default modules authority is the governance module. This is configurable with the following: + // Authority: "group", // A custom module authority can be set using a module name + // Authority: "cosmos1cwwv22j5ca08ggdv9c2uky355k908694z577tv", // or a specific address + }), + }, + { + Name: vestingtypes.ModuleName, + Config: appconfig.WrapAny(&vestingmodulev1.Module{}), + }, + { + Name: banktypes.ModuleName, + Config: appconfig.WrapAny(&bankmodulev1.Module{ + BlockedModuleAccountsOverride: blockAccAddrs, + }), + }, + { + Name: stakingtypes.ModuleName, + Config: appconfig.WrapAny(&stakingmodulev1.Module{}), + }, + { + Name: slashingtypes.ModuleName, + Config: appconfig.WrapAny(&slashingmodulev1.Module{}), + }, + { + Name: paramstypes.ModuleName, + Config: appconfig.WrapAny(¶msmodulev1.Module{}), + }, + { + Name: "tx", + Config: appconfig.WrapAny(&txconfigv1.Config{}), + }, + { + Name: genutiltypes.ModuleName, + Config: appconfig.WrapAny(&genutilmodulev1.Module{}), + }, + { + Name: authz.ModuleName, + Config: appconfig.WrapAny(&authzmodulev1.Module{}), + }, + { + Name: upgradetypes.ModuleName, + Config: appconfig.WrapAny(&upgrademodulev1.Module{}), + }, + { + Name: distrtypes.ModuleName, + Config: appconfig.WrapAny(&distrmodulev1.Module{}), + }, + { + Name: capabilitytypes.ModuleName, + Config: appconfig.WrapAny(&capabilitymodulev1.Module{ + SealKeeper: true, + }), + }, + { + Name: evidencetypes.ModuleName, + Config: appconfig.WrapAny(&evidencemodulev1.Module{}), + }, + { + Name: minttypes.ModuleName, + Config: appconfig.WrapAny(&mintmodulev1.Module{}), + }, + { + Name: group.ModuleName, + Config: appconfig.WrapAny(&groupmodulev1.Module{ + MaxExecutionPeriod: durationpb.New(time.Second * 1209600), + MaxMetadataLen: 255, + }), + }, + { + Name: feegrant.ModuleName, + Config: appconfig.WrapAny(&feegrantmodulev1.Module{}), + }, + { + Name: govtypes.ModuleName, + Config: appconfig.WrapAny(&govmodulev1.Module{}), + }, + { + Name: crisistypes.ModuleName, + Config: appconfig.WrapAny(&crisismodulev1.Module{}), + }, + { + Name: consensustypes.ModuleName, + Config: appconfig.WrapAny(&consensusmodulev1.Module{}), + }, + // ----- KYVE Modules ----- + { + Name: bundlestypes.ModuleName, + Config: appconfig.WrapAny(&bundlesmodule.Module{}), + }, + { + Name: delegationtypes.ModuleName, + Config: appconfig.WrapAny(&delegationmodule.Module{}), + }, + { + Name: globaltypes.ModuleName, + Config: appconfig.WrapAny(&globalmodule.Module{}), + }, + { + Name: pooltypes.ModuleName, + Config: appconfig.WrapAny(&poolmodule.Module{}), + }, + { + Name: querytypes.ModuleName, + Config: appconfig.WrapAny(&querymodule.Module{}), + }, + { + Name: teamtypes.ModuleName, + Config: appconfig.WrapAny(&teammodule.Module{}), + }, + { + Name: stakerstypes.ModuleName, + Config: appconfig.WrapAny(&stakersmodule.Module{}), + }, + // this line is used by starport scaffolding # stargate/app/moduleConfig + }, + }) +) diff --git a/app/export.go b/app/export.go index 43dbad49..e3ad7864 100644 --- a/app/export.go +++ b/app/export.go @@ -30,7 +30,7 @@ func (app *App) ExportAppStateAndValidators(forZeroHeight bool, jailAllowedAddrs app.prepForZeroHeightGenesis(ctx, jailAllowedAddrs) } - genState := app.mm.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) + genState := app.ModuleManager.ExportGenesisForModules(ctx, app.appCodec, modulesToExport) appState, err := json.MarshalIndent(genState, "", " ") if err != nil { return serverTypes.ExportedApp{}, err diff --git a/app/legacy_modules.go b/app/legacy_modules.go new file mode 100644 index 00000000..874ac1de --- /dev/null +++ b/app/legacy_modules.go @@ -0,0 +1,176 @@ +package app + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + + // IBC Client + ibcClientSolomachine "github.com/cosmos/ibc-go/v7/modules/light-clients/06-solomachine" + ibcClientTendermint "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint" + // IBC Core + ibc "github.com/cosmos/ibc-go/v7/modules/core" + ibcPortTypes "github.com/cosmos/ibc-go/v7/modules/core/05-port/types" + ibcTypes "github.com/cosmos/ibc-go/v7/modules/core/exported" + ibcKeeper "github.com/cosmos/ibc-go/v7/modules/core/keeper" + // IBC Fee + 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" + // IBC Transfer + ibcTransfer "github.com/cosmos/ibc-go/v7/modules/apps/transfer" + ibcTransferKeeper "github.com/cosmos/ibc-go/v7/modules/apps/transfer/keeper" + ibcTransferTypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types" + // ICA + ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts" + // ICA Controller + 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" + // ICA Host + icaHost "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host" + icaHostKeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/keeper" + icaHostTypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/host/types" +) + +var ( + keys = sdk.NewKVStoreKeys( + ibcTypes.StoreKey, ibcFeeTypes.StoreKey, ibcTransferTypes.StoreKey, + icaControllerTypes.StoreKey, icaHostTypes.StoreKey, + ) + + memKeys = sdk.NewMemoryStoreKeys() + + subspaces = []string{ + ibcTypes.ModuleName, ibcFeeTypes.ModuleName, ibcTransferTypes.ModuleName, + icaControllerTypes.SubModuleName, icaHostTypes.SubModuleName, + } +) + +func (app *App) RegisterLegacyModules() { + // Register the additional keys. + app.MountKVStores(keys) + app.MountMemoryStores(memKeys) + + // Initialise the additional param subspaces. + for _, subspace := range subspaces { + app.ParamsKeeper.Subspace(subspace) + } + + // Keeper: IBC + scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibcTypes.ModuleName) + app.IBCKeeper = ibcKeeper.NewKeeper( + app.appCodec, + keys[ibcTypes.StoreKey], + app.GetSubspace(ibcTypes.ModuleName), + + app.StakingKeeper, + app.UpgradeKeeper, + scopedIBCKeeper, + ) + app.ScopedIBCKeeper = scopedIBCKeeper + + // Keeper: IBC Fee + app.IBCFeeKeeper = ibcFeeKeeper.NewKeeper( + app.appCodec, + keys[ibcFeeTypes.ModuleName], + + app.IBCKeeper.ChannelKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + + app.AccountKeeper, + app.BankKeeper, + ) + + // Keeper: IBC Transfer + scopedIBCTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibcTransferTypes.ModuleName) + app.IBCTransferKeeper = ibcTransferKeeper.NewKeeper( + app.appCodec, + keys[ibcTransferTypes.StoreKey], + app.GetSubspace(ibcTransferTypes.ModuleName), + + app.IBCFeeKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + + app.AccountKeeper, + app.BankKeeper, + scopedIBCTransferKeeper, + ) + app.ScopedIBCTransferKeeper = scopedIBCTransferKeeper + + // Keeper: ICA Controller + scopedICAControllerKeeper := app.CapabilityKeeper.ScopeToModule(icaControllerTypes.SubModuleName) + app.ICAControllerKeeper = icaControllerKeeper.NewKeeper( + app.appCodec, + keys[icaControllerTypes.StoreKey], + app.GetSubspace(icaControllerTypes.SubModuleName), + + app.IBCFeeKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + + scopedICAControllerKeeper, + app.MsgServiceRouter(), + ) + app.ScopedICAControllerKeeper = scopedICAControllerKeeper + + // Keeper: ICA Host + scopedICAHostKeeper := app.CapabilityKeeper.ScopeToModule(icaHostTypes.SubModuleName) + app.ICAHostKeeper = icaHostKeeper.NewKeeper( + app.appCodec, + keys[icaHostTypes.StoreKey], + app.GetSubspace(icaHostTypes.SubModuleName), + + app.IBCFeeKeeper, + app.IBCKeeper.ChannelKeeper, + &app.IBCKeeper.PortKeeper, + + app.AccountKeeper, + scopedICAHostKeeper, + app.MsgServiceRouter(), + ) + app.ScopedICAHostKeeper = scopedICAHostKeeper + + // IBC: Create a router. + var ibcTransferStack ibcPortTypes.IBCModule + ibcTransferStack = ibcTransfer.NewIBCModule(app.IBCTransferKeeper) + ibcTransferStack = ibcFee.NewIBCMiddleware(ibcTransferStack, app.IBCFeeKeeper) + + var icaControllerStack ibcPortTypes.IBCModule + icaControllerStack = icaController.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper) + icaControllerStack = ibcFee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper) + + var icaHostStack ibcPortTypes.IBCModule + icaHostStack = icaHost.NewIBCModule(app.ICAHostKeeper) + icaHostStack = ibcFee.NewIBCMiddleware(icaHostStack, app.IBCFeeKeeper) + + ibcRouter := ibcPortTypes.NewRouter() + ibcRouter.AddRoute(ibcTransferTypes.ModuleName, ibcTransferStack). + AddRoute(icaControllerTypes.SubModuleName, icaControllerStack). + AddRoute(icaHostTypes.SubModuleName, icaHostStack) + app.IBCKeeper.SetRouter(ibcRouter) + + // TODO(rapha): fix this + // app.GovKeeper.SetProtocolStakingKeeper(app.StakersKeeper) + + // Register modules and interfaces/services. + legacyModules := []module.AppModule{ + ibc.NewAppModule(app.IBCKeeper), + ibcFee.NewAppModule(app.IBCFeeKeeper), + ibcTransfer.NewAppModule(app.IBCTransferKeeper), + ica.NewAppModule(&app.ICAControllerKeeper, &app.ICAHostKeeper), + } + if err := app.RegisterModules(legacyModules...); err != nil { + panic(err) + } + + for _, m := range legacyModules { + if s, ok := m.(module.HasServices); ok { + s.RegisterServices(app.Configurator()) + } + } + + ibcClientSolomachine.AppModuleBasic{}.RegisterInterfaces(app.interfaceRegistry) + ibcClientTendermint.AppModuleBasic{}.RegisterInterfaces(app.interfaceRegistry) +} diff --git a/app/test_helpers.go b/app/test_helpers.go index b5197829..6fc1f168 100644 --- a/app/test_helpers.go +++ b/app/test_helpers.go @@ -132,8 +132,8 @@ func Setup() *App { setPrefixes("kyve") - // app := NewKYVEApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, config, EmptyAppOptions{}) - app := NewKYVEApp(log.NewNopLogger(), db, nil, true, EmptyAppOptions{}, baseapp.SetChainID("kyve-test")) + // app := NewKyveApp(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 5, config, EmptyAppOptions{}) + app := NewKyveApp(log.NewNopLogger(), db, nil, true, EmptyAppOptions{}, baseapp.SetChainID("kyve-test")) // init chain must be called to stop deliverState from being nil genesisState := DefaultGenesisWithValSet(app.AppCodec()) diff --git a/cmd/kyved/app_creator.go b/cmd/kyved/app_creator.go index 06cd887d..ca272771 100644 --- a/cmd/kyved/app_creator.go +++ b/cmd/kyved/app_creator.go @@ -23,7 +23,7 @@ func (ac appCreator) createApp( traceStore io.Writer, appOpts serverTypes.AppOptions, ) serverTypes.Application { - return kyveApp.NewKYVEApp( + return kyveApp.NewKyveApp( logger, db, traceStore, true, appOpts, server.DefaultBaseappOptions(appOpts)..., @@ -59,13 +59,13 @@ func (ac appCreator) exportApp( appOpts = viperAppOpts if height != -1 { - app = kyveApp.NewKYVEApp(logger, db, traceStore, false, appOpts) + app = kyveApp.NewKyveApp(logger, db, traceStore, false, appOpts) if err := app.LoadHeight(height); err != nil { return serverTypes.ExportedApp{}, err } } else { - app = kyveApp.NewKYVEApp(logger, db, traceStore, true, appOpts) + app = kyveApp.NewKyveApp(logger, db, traceStore, true, appOpts) } return app.ExportAppStateAndValidators(forZeroHeight, jailAllowedAddrs, modulesToExport) diff --git a/go.mod b/go.mod index 83b559a6..14519c2e 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,9 @@ module github.com/KYVENetwork/chain go 1.20 require ( + cosmossdk.io/api v0.3.1 + cosmossdk.io/core v0.5.1 + cosmossdk.io/depinject v1.0.0-alpha.4 cosmossdk.io/errors v1.0.0 cosmossdk.io/math v1.1.2 github.com/cometbft/cometbft v0.37.2 @@ -24,6 +27,7 @@ require ( github.com/stretchr/testify v1.8.4 google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529 google.golang.org/grpc v1.56.2 + google.golang.org/protobuf v1.31.0 mvdan.cc/gofumpt v0.5.0 ) @@ -35,9 +39,6 @@ require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v1.1.0 // indirect cloud.google.com/go/storage v1.30.1 // indirect - cosmossdk.io/api v0.3.1 // indirect - cosmossdk.io/core v0.5.1 // indirect - cosmossdk.io/depinject v1.0.0-alpha.4 // indirect cosmossdk.io/log v1.2.1 // indirect cosmossdk.io/tools/rosetta v0.2.1 // indirect filippo.io/edwards25519 v1.0.0 // indirect @@ -303,7 +304,6 @@ require ( google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/proto/Dockerfile b/proto/Dockerfile index ea2150dc..5ef801c4 100644 --- a/proto/Dockerfile +++ b/proto/Dockerfile @@ -7,6 +7,8 @@ RUN apk add --no-cache \ git \ make +RUN go install github.com/cosmos/cosmos-proto/cmd/protoc-gen-go-pulsar@latest +RUN go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest RUN go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway@latest RUN go install github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger@latest diff --git a/proto/buf.gen.pulsar.yaml b/proto/buf.gen.pulsar.yaml new file mode 100644 index 00000000..34829ff4 --- /dev/null +++ b/proto/buf.gen.pulsar.yaml @@ -0,0 +1,18 @@ +version: v1 +managed: + enabled: true + go_package_prefix: + default: github.com/KYVENetwork/chain/pulsar + except: + - buf.build/cosmos/cosmos-proto + - buf.build/cosmos/gogo-proto + - buf.build/googleapis/googleapis + override: + buf.build/cosmos/cosmos-sdk: cosmossdk.io/api +plugins: + - name: go-pulsar + out: ../pulsar + opt: paths=source_relative + - name: go-grpc + out: ../pulsar + opt: paths=source_relative diff --git a/proto/generate.sh b/proto/generate.sh index 27a7fa57..83b6e557 100644 --- a/proto/generate.sh +++ b/proto/generate.sh @@ -1,9 +1,11 @@ cd proto buf generate +buf generate --template buf.gen.pulsar.yaml cd .. cp -r github.com/KYVENetwork/chain/* ./ rm -rf github.com +rm -rf kyve swagger-combine ./docs/config.json -o ./docs/swagger.yml rm -rf tmp-swagger-gen diff --git a/proto/kyve/bundles/module/v1/module.proto b/proto/kyve/bundles/module/v1/module.proto new file mode 100644 index 00000000..84123252 --- /dev/null +++ b/proto/kyve/bundles/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.bundles.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the bundles module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/bundles"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/delegation/module/v1/module.proto b/proto/kyve/delegation/module/v1/module.proto new file mode 100644 index 00000000..d356431f --- /dev/null +++ b/proto/kyve/delegation/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.delegation.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the delegation module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/delegation"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/global/module/v1/module.proto b/proto/kyve/global/module/v1/module.proto new file mode 100644 index 00000000..e91d1b4b --- /dev/null +++ b/proto/kyve/global/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.global.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the global module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/global"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/pool/module/v1/module.proto b/proto/kyve/pool/module/v1/module.proto new file mode 100644 index 00000000..7c86df63 --- /dev/null +++ b/proto/kyve/pool/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.pool.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the pool module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/pool"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/query/module/v1/module.proto b/proto/kyve/query/module/v1/module.proto new file mode 100644 index 00000000..5360b950 --- /dev/null +++ b/proto/kyve/query/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.query.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the query module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/query"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/stakers/module/v1/module.proto b/proto/kyve/stakers/module/v1/module.proto new file mode 100644 index 00000000..4ce2db97 --- /dev/null +++ b/proto/kyve/stakers/module/v1/module.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package kyve.stakers.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the stakers module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/stakers"}; + + // authority defines the custom module authority. If not set, defaults to the governance module. + string authority = 1; +} diff --git a/proto/kyve/team/module/v1/module.proto b/proto/kyve/team/module/v1/module.proto new file mode 100644 index 00000000..ce303424 --- /dev/null +++ b/proto/kyve/team/module/v1/module.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package kyve.team.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the team module. +message Module { + option (cosmos.app.v1alpha1.module) = {go_import: "github.com/KYVENetwork/chain/x/team"}; +} diff --git a/testutil/integration/checks.go b/testutil/integration/checks.go index e84c8c36..e42d5a43 100644 --- a/testutil/integration/checks.go +++ b/testutil/integration/checks.go @@ -155,7 +155,7 @@ func (suite *KeeperTestSuite) VerifyPoolQueries() { } func (suite *KeeperTestSuite) VerifyPoolGenesisImportExport() { - genState := pool.ExportGenesis(suite.Ctx(), suite.App().PoolKeeper) + genState := pool.ExportGenesis(suite.Ctx(), *suite.App().PoolKeeper) // Delete all entries in Pool Store store := suite.Ctx().KVStore(suite.App().PoolKeeper.StoreKey()) @@ -163,7 +163,7 @@ func (suite *KeeperTestSuite) VerifyPoolGenesisImportExport() { err := genState.Validate() Expect(err).To(BeNil()) - pool.InitGenesis(suite.Ctx(), suite.App().PoolKeeper, *genState) + pool.InitGenesis(suite.Ctx(), *suite.App().PoolKeeper, *genState) } // ===================== @@ -240,7 +240,7 @@ func (suite *KeeperTestSuite) VerifyStakersQueries() { } func (suite *KeeperTestSuite) VerifyStakersGenesisImportExport() { - genState := stakers.ExportGenesis(suite.Ctx(), suite.App().StakersKeeper) + genState := stakers.ExportGenesis(suite.Ctx(), *suite.App().StakersKeeper) // Delete all entries in Stakers Store store := suite.Ctx().KVStore(suite.App().StakersKeeper.StoreKey()) @@ -258,7 +258,7 @@ func (suite *KeeperTestSuite) VerifyStakersGenesisImportExport() { err := genState.Validate() Expect(err).To(BeNil()) - stakers.InitGenesis(suite.Ctx(), suite.App().StakersKeeper, *genState) + stakers.InitGenesis(suite.Ctx(), *suite.App().StakersKeeper, *genState) } // ===================== @@ -313,10 +313,10 @@ func (suite *KeeperTestSuite) VerifyBundlesQueries() { } func (suite *KeeperTestSuite) VerifyBundlesGenesisImportExport() { - genState := bundles.ExportGenesis(suite.Ctx(), suite.App().BundlesKeeper) + genState := bundles.ExportGenesis(suite.Ctx(), *suite.App().BundlesKeeper) err := genState.Validate() Expect(err).To(BeNil()) - bundles.InitGenesis(suite.Ctx(), suite.App().BundlesKeeper, *genState) + bundles.InitGenesis(suite.Ctx(), *suite.App().BundlesKeeper, *genState) } // ======================== @@ -400,10 +400,10 @@ func (suite *KeeperTestSuite) VerifyDelegationModuleIntegrity() { } func (suite *KeeperTestSuite) VerifyDelegationGenesisImportExport() { - genState := delegation.ExportGenesis(suite.Ctx(), suite.App().DelegationKeeper) + genState := delegation.ExportGenesis(suite.Ctx(), *suite.App().DelegationKeeper) err := genState.Validate() Expect(err).To(BeNil()) - delegation.InitGenesis(suite.Ctx(), suite.App().DelegationKeeper, *genState) + delegation.InitGenesis(suite.Ctx(), *suite.App().DelegationKeeper, *genState) } // ========================= @@ -411,7 +411,7 @@ func (suite *KeeperTestSuite) VerifyDelegationGenesisImportExport() { // ========================= func (suite *KeeperTestSuite) VerifyTeamGenesisImportExport() { - genState := team.ExportGenesis(suite.Ctx(), suite.App().TeamKeeper) + genState := team.ExportGenesis(suite.Ctx(), *suite.App().TeamKeeper) // Delete all entries in Stakers Store store := suite.Ctx().KVStore(suite.App().TeamKeeper.StoreKey()) @@ -429,7 +429,7 @@ func (suite *KeeperTestSuite) VerifyTeamGenesisImportExport() { err := genState.Validate() Expect(err).To(BeNil()) - team.InitGenesis(suite.Ctx(), suite.App().TeamKeeper, *genState) + team.InitGenesis(suite.Ctx(), *suite.App().TeamKeeper, *genState) } // ======================== diff --git a/util/expected_keepers.go b/util/expected_keepers.go new file mode 100644 index 00000000..aa8e3658 --- /dev/null +++ b/util/expected_keepers.go @@ -0,0 +1,35 @@ +package util + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + // Mint + mintTypes "github.com/cosmos/cosmos-sdk/x/mint/types" + // Upgrade + upgradeTypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" +) + +type AccountKeeper interface { + GetModuleAddress(string) sdk.AccAddress +} + +type BankKeeper interface { + GetBalance(sdk.Context, sdk.AccAddress, string) sdk.Coin + GetSupply(sdk.Context, string) sdk.Coin + SendCoins(sdk.Context, sdk.AccAddress, sdk.AccAddress, sdk.Coins) error + SendCoinsFromAccountToModule(sdk.Context, sdk.AccAddress, string, sdk.Coins) error + SendCoinsFromModuleToAccount(sdk.Context, string, sdk.AccAddress, sdk.Coins) error + SendCoinsFromModuleToModule(sdk.Context, string, string, sdk.Coins) error +} + +type DistributionKeeper interface { + FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error +} + +type MintKeeper interface { + GetMinter(sdk.Context) mintTypes.Minter + GetParams(sdk.Context) mintTypes.Params +} + +type UpgradeKeeper interface { + ScheduleUpgrade(sdk.Context, upgradeTypes.Plan) error +} diff --git a/util/logic_bank.go b/util/logic_bank.go index 7160b861..631202fe 100644 --- a/util/logic_bank.go +++ b/util/logic_bank.go @@ -5,31 +5,6 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -type BankKeeper interface { - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - 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 -} - -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress -} - // TransferFromAddressToAddress sends tokens from the given address to a specified address. func TransferFromAddressToAddress( bankKeeper BankKeeper, @@ -103,7 +78,7 @@ func TransferFromModuleToModule( } // TransferFromAddressToTreasury sends tokens from a given address to the treasury (community spend pool). -func TransferFromAddressToTreasury(distrKeeper DistrKeeper, ctx sdk.Context, address string, amount uint64) error { +func TransferFromAddressToTreasury(distrKeeper DistributionKeeper, ctx sdk.Context, address string, amount uint64) error { sender, errAddress := sdk.AccAddressFromBech32(address) if errAddress != nil { return errAddress @@ -120,7 +95,7 @@ func TransferFromAddressToTreasury(distrKeeper DistrKeeper, ctx sdk.Context, add // TransferFromModuleToTreasury sends tokens from a module to the treasury (community spend pool). func TransferFromModuleToTreasury( accountKeeper AccountKeeper, - distrKeeper DistrKeeper, + distrKeeper DistributionKeeper, ctx sdk.Context, module string, amount uint64, diff --git a/util/logic_error.go b/util/logic_error.go index e689e5d4..791a363a 100644 --- a/util/logic_error.go +++ b/util/logic_error.go @@ -7,10 +7,6 @@ import ( upgradeTypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) -type UpgradeKeeper interface { - ScheduleUpgrade(ctx sdk.Context, plan upgradeTypes.Plan) error -} - // PanicHalt performs an emergency upgrade which immediately halts the chain // The Team has to come up with a solution and develop a patch to handle // the update. diff --git a/x/bundles/abci.go b/x/bundles/abci.go index 245607a1..30bbc3ff 100644 --- a/x/bundles/abci.go +++ b/x/bundles/abci.go @@ -3,23 +3,14 @@ package bundles import ( "github.com/KYVENetwork/chain/util" bundlesKeeper "github.com/KYVENetwork/chain/x/bundles/keeper" + "github.com/KYVENetwork/chain/x/bundles/types" sdk "github.com/cosmos/cosmos-sdk/types" // Auth authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - // Mint - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - // Pool - "github.com/KYVENetwork/chain/x/pool/keeper" - // Team - teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) -func SplitInflation(ctx sdk.Context, k bundlesKeeper.Keeper, bk bankKeeper.Keeper, mk mintKeeper.Keeper, pk keeper.Keeper, tk teamKeeper.Keeper, uk upgradeKeeper.Keeper) { +func SplitInflation(ctx sdk.Context, k bundlesKeeper.Keeper, bk util.BankKeeper, mk util.MintKeeper, pk types.PoolKeeper, tk types.TeamKeeper, uk util.UpgradeKeeper) { minter := mk.GetMinter(ctx) params := mk.GetParams(ctx) @@ -86,5 +77,5 @@ func SplitInflation(ctx sdk.Context, k bundlesKeeper.Keeper, bk bankKeeper.Keepe } // rest gets transferred to chain - pk.Logger(ctx).Info("split portion of minted coins to protocol", "amount", protocolBlockProvision) + ctx.Logger().Info("split portion of minted coins to protocol", "amount", protocolBlockProvision) } diff --git a/x/bundles/keeper/keeper.go b/x/bundles/keeper/keeper.go index 35811cd4..dbef6f66 100644 --- a/x/bundles/keeper/keeper.go +++ b/x/bundles/keeper/keeper.go @@ -3,6 +3,8 @@ package keeper import ( "fmt" + "github.com/KYVENetwork/chain/util" + "github.com/cometbft/cometbft/libs/log" "github.com/KYVENetwork/chain/x/bundles/types" @@ -19,11 +21,11 @@ type ( authority string - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrkeeper types.DistrKeeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper + distrkeeper util.DistributionKeeper poolKeeper types.PoolKeeper - stakerKeeper types.StakerKeeper + stakerKeeper types.StakersKeeper delegationKeeper types.DelegationKeeper } ) @@ -35,11 +37,11 @@ func NewKeeper( authority string, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distrkeeper types.DistrKeeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, + distrkeeper util.DistributionKeeper, poolKeeper types.PoolKeeper, - stakerKeeper types.StakerKeeper, + stakerKeeper types.StakersKeeper, delegationKeeper types.DelegationKeeper, ) *Keeper { return &Keeper{ diff --git a/x/bundles/module.go b/x/bundles/module.go index 451a8dde..2d5c2f4c 100644 --- a/x/bundles/module.go +++ b/x/bundles/module.go @@ -5,20 +5,20 @@ import ( "encoding/json" "fmt" - poolKeeper "github.com/KYVENetwork/chain/x/pool/keeper" - teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - distributionKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" - // this line is used by starport scaffolding # 1 + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" abci "github.com/cometbft/cometbft/abci/types" + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/bundles/module/v1" "github.com/KYVENetwork/chain/x/bundles/client/cli" "github.com/KYVENetwork/chain/x/bundles/keeper" "github.com/KYVENetwork/chain/x/bundles/types" @@ -27,6 +27,7 @@ import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + // this line is used by starport scaffolding # 1 ) var ( @@ -99,42 +100,39 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { type AppModule struct { AppModuleBasic - keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper bankKeeper.Keeper - distributionKeeper distributionKeeper.Keeper - mintKeeper mintKeeper.Keeper - upgradeKeeper upgradeKeeper.Keeper - poolKeeper poolKeeper.Keeper - teamKeeper teamKeeper.Keeper + keeper keeper.Keeper + bankKeeper util.BankKeeper + mintKeeper util.MintKeeper + upgradeKeeper util.UpgradeKeeper + poolKeeper types.PoolKeeper + teamKeeper types.TeamKeeper } func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, - accountKeeper types.AccountKeeper, - bankKeeper bankKeeper.Keeper, - distributionKeeper distributionKeeper.Keeper, - mintKeeper mintKeeper.Keeper, - upgradeKeeper upgradeKeeper.Keeper, - poolKeeper poolKeeper.Keeper, - teamKeeper teamKeeper.Keeper, + bankKeeper util.BankKeeper, + mintKeeper util.MintKeeper, + upgradeKeeper util.UpgradeKeeper, + poolKeeper types.PoolKeeper, + teamKeeper types.TeamKeeper, ) AppModule { return AppModule{ - AppModuleBasic: NewAppModuleBasic(cdc), - keeper: keeper, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - distributionKeeper: distributionKeeper, - mintKeeper: mintKeeper, - upgradeKeeper: upgradeKeeper, - poolKeeper: poolKeeper, - teamKeeper: teamKeeper, + AppModuleBasic: NewAppModuleBasic(cdc), + keeper: keeper, + bankKeeper: bankKeeper, + mintKeeper: mintKeeper, + upgradeKeeper: upgradeKeeper, + poolKeeper: poolKeeper, + teamKeeper: teamKeeper, } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -176,3 +174,59 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val am.keeper.HandleUploadTimeout(sdk.WrapSDKContext(ctx)) return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type BundlesInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + MemKey *storeTypes.MemoryStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper util.BankKeeper + DelegationKeeper types.DelegationKeeper + DistributionKeeper util.DistributionKeeper + PoolKeeper types.PoolKeeper + StakersKeeper types.StakersKeeper + UpgradeKeeper util.UpgradeKeeper + MintKeeper util.MintKeeper + TeamKeeper types.TeamKeeper +} + +type BundlesOutpus struct { + depinject.Out + + BundlesKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in BundlesInputs) BundlesOutpus { + authority := authTypes.NewModuleAddress(govTypes.ModuleName) + if in.Config.Authority != "" { + authority = authTypes.NewModuleAddressOrBech32Address(in.Config.Authority) + } + + bundlesKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.MemKey, + authority.String(), + in.AccountKeeper, + in.BankKeeper, + in.DistributionKeeper, + in.PoolKeeper, + in.StakersKeeper, + in.DelegationKeeper, + ) + m := NewAppModule(in.Cdc, *bundlesKeeper, in.BankKeeper, in.MintKeeper, in.UpgradeKeeper, in.PoolKeeper, in.TeamKeeper) + + return BundlesOutpus{BundlesKeeper: bundlesKeeper, Module: m} +} diff --git a/x/bundles/types/expected_keepers.go b/x/bundles/types/expected_keepers.go index cec3a1c1..600890f2 100644 --- a/x/bundles/types/expected_keepers.go +++ b/x/bundles/types/expected_keepers.go @@ -4,30 +4,8 @@ import ( delegationTypes "github.com/KYVENetwork/chain/x/delegation/types" pooltypes "github.com/KYVENetwork/chain/x/pool/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress -} - -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - 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 -} - -type UpgradeKeeper interface { - ScheduleUpgrade(ctx sdk.Context, plan types.Plan) error -} - type PoolKeeper interface { AssertPoolExists(ctx sdk.Context, poolId uint64) error GetPoolWithError(ctx sdk.Context, poolId uint64) (pooltypes.Pool, error) @@ -36,11 +14,12 @@ type PoolKeeper interface { IncrementBundleInformation(ctx sdk.Context, poolId uint64, currentHeight uint64, currentKey string, currentValue string) GetAllPools(ctx sdk.Context) (list []pooltypes.Pool) + GetProtocolInflationShare(ctx sdk.Context) (res sdk.Dec) ChargeFundersOfPool(ctx sdk.Context, poolId uint64, amount uint64) (payout uint64, err error) ChargeInflationPool(ctx sdk.Context, poolId uint64) (payout uint64, err error) } -type StakerKeeper interface { +type StakersKeeper interface { GetAllStakerAddressesOfPool(ctx sdk.Context, poolId uint64) (stakers []string) GetCommission(ctx sdk.Context, stakerAddress string) sdk.Dec IncreaseStakerCommissionRewards(ctx sdk.Context, address string, amount uint64) error @@ -61,3 +40,7 @@ type DelegationKeeper interface { PayoutRewards(ctx sdk.Context, staker string, amount uint64, payerModuleName string) error SlashDelegators(ctx sdk.Context, poolId uint64, staker string, slashType delegationTypes.SlashType) } + +type TeamKeeper interface { + GetTeamBlockProvision(ctx sdk.Context) int64 +} diff --git a/x/delegation/keeper/keeper.go b/x/delegation/keeper/keeper.go index 20412225..23b380a3 100644 --- a/x/delegation/keeper/keeper.go +++ b/x/delegation/keeper/keeper.go @@ -3,6 +3,8 @@ package keeper import ( "fmt" + "github.com/KYVENetwork/chain/util" + "github.com/cometbft/cometbft/libs/log" "github.com/KYVENetwork/chain/x/delegation/types" @@ -19,11 +21,11 @@ type ( authority string - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrKeeper types.DistrKeeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper + distrKeeper util.DistributionKeeper poolKeeper types.PoolKeeper - upgradeKeeper types.UpgradeKeeper + upgradeKeeper util.UpgradeKeeper stakersKeeper types.StakersKeeper } ) @@ -35,12 +37,11 @@ func NewKeeper( authority string, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distrkeeper types.DistrKeeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, + distrkeeper util.DistributionKeeper, poolKeeper types.PoolKeeper, - upgradeKeeper types.UpgradeKeeper, - stakersKeeper types.StakersKeeper, + upgradeKeeper util.UpgradeKeeper, ) *Keeper { return &Keeper{ cdc: cdc, @@ -54,10 +55,13 @@ func NewKeeper( distrKeeper: distrkeeper, poolKeeper: poolKeeper, upgradeKeeper: upgradeKeeper, - stakersKeeper: stakersKeeper, } } +func (k *Keeper) SetStakersnKeeper(stakersKeeper types.StakersKeeper) { + k.stakersKeeper = stakersKeeper +} + func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/delegation/keeper/msg_server_delegate.go b/x/delegation/keeper/msg_server_delegate.go index b51dcc07..986ee1e7 100644 --- a/x/delegation/keeper/msg_server_delegate.go +++ b/x/delegation/keeper/msg_server_delegate.go @@ -11,6 +11,36 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +// TODO(rapha): Maybe we should move this somewhere else. +func (k Keeper) Delegate(ctx sdk.Context, creator string, staker string, amount uint64) error { + msg := types.MsgDelegate{ + Creator: creator, + Staker: staker, + Amount: amount, + } + + if !k.stakersKeeper.DoesStakerExist(ctx, msg.Staker) { + return sdkErrors.WithType(types.ErrStakerDoesNotExist, msg.Staker) + } + + // Performs logical delegation without transferring the amount + k.performDelegation(ctx, msg.Staker, msg.Creator, msg.Amount) + + // Transfer tokens from sender to this module. + if transferErr := util.TransferFromAddressToModule(k.bankKeeper, ctx, msg.Creator, types.ModuleName, msg.Amount); transferErr != nil { + return transferErr + } + + // Emit a delegation event. + _ = ctx.EventManager().EmitTypedEvent(&types.EventDelegate{ + Address: msg.Creator, + Staker: msg.Staker, + Amount: msg.Amount, + }) + + return nil +} + // Delegate handles the transaction of delegating a specific amount of $KYVE to a staker // The only requirement for the transaction to succeed is that the staker exists // and the user has enough balance. diff --git a/x/delegation/module.go b/x/delegation/module.go index 8f8b9de0..9edfc292 100644 --- a/x/delegation/module.go +++ b/x/delegation/module.go @@ -5,11 +5,20 @@ import ( "encoding/json" "fmt" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" abci "github.com/cometbft/cometbft/abci/types" + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/delegation/module/v1" "github.com/KYVENetwork/chain/x/delegation/client/cli" "github.com/KYVENetwork/chain/x/delegation/keeper" "github.com/KYVENetwork/chain/x/delegation/types" @@ -91,15 +100,15 @@ type AppModule struct { AppModuleBasic keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper } func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), @@ -109,8 +118,11 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -151,3 +163,69 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val am.keeper.ProcessDelegatorUnbondingQueue(ctx) return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + appmodule.Invoke(InvokeSetStakersKeeper), + ) +} + +type DelegationInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + MemKey *storeTypes.MemoryStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper util.BankKeeper + DistributionKeeper util.DistributionKeeper + PoolKeeper types.PoolKeeper + UpgradeKeeper util.UpgradeKeeper +} + +type DelegationOutputs struct { + depinject.Out + + DelegationKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in DelegationInputs) DelegationOutputs { + authority := authTypes.NewModuleAddress(govTypes.ModuleName) + if in.Config.Authority != "" { + authority = authTypes.NewModuleAddressOrBech32Address(in.Config.Authority) + } + + delegationKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.MemKey, + authority.String(), + in.AccountKeeper, + in.BankKeeper, + in.DistributionKeeper, + in.PoolKeeper, + in.UpgradeKeeper, + ) + m := NewAppModule(in.Cdc, *delegationKeeper, in.AccountKeeper, in.BankKeeper) + + return DelegationOutputs{DelegationKeeper: delegationKeeper, Module: m} +} + +func InvokeSetStakersKeeper( + keeper *keeper.Keeper, + stakersKeeper types.StakersKeeper, +) error { + if keeper == nil { + return fmt.Errorf("keeper is nil") + } + if stakersKeeper == nil { + return fmt.Errorf("stakers keeper is nil") + } + keeper.SetStakersnKeeper(stakersKeeper) + return nil +} diff --git a/x/delegation/types/expected_keepers.go b/x/delegation/types/expected_keepers.go index 188e6791..8ee8f676 100644 --- a/x/delegation/types/expected_keepers.go +++ b/x/delegation/types/expected_keepers.go @@ -3,38 +3,17 @@ package types import ( stakerstypes "github.com/KYVENetwork/chain/x/stakers/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress -} - -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - 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 -} - type PoolKeeper interface { AssertPoolExists(ctx sdk.Context, poolId uint64) error } -type UpgradeKeeper interface { - ScheduleUpgrade(ctx sdk.Context, plan types.Plan) error -} - type StakersKeeper interface { - DoesStakerExist(ctx sdk.Context, staker string) bool - GetAllStakerAddressesOfPool(ctx sdk.Context, poolId uint64) (stakers []string) + DoesStakerExist(sdk.Context, string) bool + DoesValaccountExist(sdk.Context, uint64, string) bool GetValaccountsFromStaker(ctx sdk.Context, stakerAddress string) (val []*stakerstypes.Valaccount) - GetPoolCount(ctx sdk.Context, stakerAddress string) (poolCount uint64) - GetActiveStakers(ctx sdk.Context) []string + GetActiveStakers(sdk.Context) []string + GetAllStakerAddressesOfPool(sdk.Context, uint64) []string + GetPoolCount(sdk.Context, string) uint64 } diff --git a/x/global/abci.go b/x/global/abci.go index a692f0b1..9782fc88 100644 --- a/x/global/abci.go +++ b/x/global/abci.go @@ -2,21 +2,17 @@ package global import ( "github.com/KYVENetwork/chain/util" + "github.com/KYVENetwork/chain/x/global/types" sdk "github.com/cosmos/cosmos-sdk/types" - // Auth - authKeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" + // Global "github.com/KYVENetwork/chain/x/global/keeper" - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) // EndBlocker handles the fee burning if it is configured -func EndBlocker(ctx sdk.Context, ak authKeeper.AccountKeeper, bk bankKeeper.Keeper, gk keeper.Keeper, uk upgradeKeeper.Keeper) { +func EndBlocker(ctx sdk.Context, ak util.AccountKeeper, bk types.BankKeeper, gk keeper.Keeper, uk util.UpgradeKeeper) { // Since no fees are paid in the genesis block, skip. // NOTE: This is Tendermint specific. if ctx.BlockHeight() == 1 { diff --git a/x/global/module.go b/x/global/module.go index 2c06fd37..8f5ac573 100644 --- a/x/global/module.go +++ b/x/global/module.go @@ -5,6 +5,15 @@ import ( "encoding/json" "fmt" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/global/module/v1" + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -14,16 +23,10 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - // Auth - authKeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" // Global "github.com/KYVENetwork/chain/x/global/client/cli" "github.com/KYVENetwork/chain/x/global/keeper" "github.com/KYVENetwork/chain/x/global/types" - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) var ( @@ -96,18 +99,18 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { type AppModule struct { AppModuleBasic - ak authKeeper.AccountKeeper - bk bankKeeper.Keeper + ak util.AccountKeeper + bk types.BankKeeper keeper keeper.Keeper - uk upgradeKeeper.Keeper + uk util.UpgradeKeeper } func NewAppModule( cdc codec.Codec, - ak authKeeper.AccountKeeper, - bk bankKeeper.Keeper, + ak util.AccountKeeper, + bk types.BankKeeper, keeper keeper.Keeper, - uk upgradeKeeper.Keeper, + uk util.UpgradeKeeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), @@ -118,8 +121,11 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -159,3 +165,45 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type GlobalInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper types.BankKeeper + UpgradeKeeper util.UpgradeKeeper +} + +type GlobalOutputs struct { + depinject.Out + + GlobalKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in GlobalInputs) GlobalOutputs { + authority := authTypes.NewModuleAddress(govTypes.ModuleName) + if in.Config.Authority != "" { + authority = authTypes.NewModuleAddressOrBech32Address(in.Config.Authority) + } + + globalKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + authority.String(), + ) + m := NewAppModule(in.Cdc, in.AccountKeeper, in.BankKeeper, *globalKeeper, in.UpgradeKeeper) + + return GlobalOutputs{GlobalKeeper: globalKeeper, Module: m} +} diff --git a/x/global/types/expected_keepers.go b/x/global/types/expected_keepers.go new file mode 100644 index 00000000..a1b73f1e --- /dev/null +++ b/x/global/types/expected_keepers.go @@ -0,0 +1,10 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type BankKeeper interface { + BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error + GetAllBalances(sdk.Context, sdk.AccAddress) sdk.Coins +} diff --git a/x/pool/keeper/keeper.go b/x/pool/keeper/keeper.go index bf73b53f..6aaf123b 100644 --- a/x/pool/keeper/keeper.go +++ b/x/pool/keeper/keeper.go @@ -3,24 +3,17 @@ package keeper import ( "fmt" + "github.com/KYVENetwork/chain/util" + "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" - // Auth - authKeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - // Distribution - distributionKeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" - // Mint - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" + // Pool "github.com/KYVENetwork/chain/x/pool/types" - // Team - teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" ) type ( @@ -32,12 +25,11 @@ type ( authority string stakersKeeper types.StakersKeeper - accountKeeper authKeeper.AccountKeeper - bankKeeper bankKeeper.Keeper - distrkeeper distributionKeeper.Keeper - mintKeeper mintKeeper.Keeper - upgradeKeeper types.UpgradeKeeper - teamKeeper teamKeeper.Keeper + accountKeeper types.AccountKeeper + bankKeeper util.BankKeeper + distrkeeper util.DistributionKeeper + mintKeeper util.MintKeeper + upgradeKeeper util.UpgradeKeeper } ) @@ -48,12 +40,11 @@ func NewKeeper( authority string, - accountKeeper authKeeper.AccountKeeper, - bankKeeper bankKeeper.Keeper, - distrKeeper distributionKeeper.Keeper, - mintKeeper mintKeeper.Keeper, - upgradeKeeper types.UpgradeKeeper, - teamKeeper teamKeeper.Keeper, + accountKeeper types.AccountKeeper, + bankKeeper util.BankKeeper, + distrKeeper util.DistributionKeeper, + mintKeeper util.MintKeeper, + upgradeKeeper util.UpgradeKeeper, ) *Keeper { return &Keeper{ cdc: cdc, @@ -67,7 +58,6 @@ func NewKeeper( distrkeeper: distrKeeper, mintKeeper: mintKeeper, upgradeKeeper: upgradeKeeper, - teamKeeper: teamKeeper, } } @@ -90,7 +80,7 @@ func (k Keeper) EnsurePoolAccount(ctx sdk.Context, id uint64) { k.accountKeeper.SetAccount(ctx, account) } -func SetStakersKeeper(k *Keeper, stakersKeeper types.StakersKeeper) { +func (k *Keeper) SetStakersKeeper(stakersKeeper types.StakersKeeper) { k.stakersKeeper = stakersKeeper } diff --git a/x/pool/module.go b/x/pool/module.go index 08e4df6b..cfa2c861 100644 --- a/x/pool/module.go +++ b/x/pool/module.go @@ -5,26 +5,28 @@ import ( "encoding/json" "fmt" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/pool/module/v1" + "github.com/KYVENetwork/chain/util" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" abci "github.com/cometbft/cometbft/abci/types" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - // Pool "github.com/KYVENetwork/chain/x/pool/client/cli" "github.com/KYVENetwork/chain/x/pool/keeper" "github.com/KYVENetwork/chain/x/pool/types" - - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) var ( @@ -99,16 +101,16 @@ type AppModule struct { keeper keeper.Keeper accountKeeper types.AccountKeeper - bankKeeper bankKeeper.Keeper - upgradeKeeper upgradeKeeper.Keeper + bankKeeper util.BankKeeper + upgradeKeeper util.UpgradeKeeper } func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, accountKeeper types.AccountKeeper, - bankKeeper bankKeeper.Keeper, - upgradeKeeper upgradeKeeper.Keeper, + bankKeeper util.BankKeeper, + upgradeKeeper util.UpgradeKeeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), @@ -119,8 +121,11 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -159,3 +164,54 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val am.keeper.HandlePoolUpgrades(ctx) return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type PoolInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + MemKey *storeTypes.MemoryStoreKey + + AccountKeeper types.AccountKeeper + BankKeeper util.BankKeeper + DistributionKeeper util.DistributionKeeper + UpgradeKeeper util.UpgradeKeeper + MintKeeper util.MintKeeper +} + +type PoolOutputs struct { + depinject.Out + + PoolKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in PoolInputs) PoolOutputs { + authority := authTypes.NewModuleAddress(govTypes.ModuleName) + if in.Config.Authority != "" { + authority = authTypes.NewModuleAddressOrBech32Address(in.Config.Authority) + } + + poolKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.MemKey, + authority.String(), + in.AccountKeeper, + in.BankKeeper, + in.DistributionKeeper, + in.MintKeeper, + in.UpgradeKeeper, + ) + m := NewAppModule(in.Cdc, *poolKeeper, in.AccountKeeper, in.BankKeeper, in.UpgradeKeeper) + + return PoolOutputs{PoolKeeper: poolKeeper, Module: m} +} diff --git a/x/pool/types/expected_keepers.go b/x/pool/types/expected_keepers.go index 3c5ee050..38508bb2 100644 --- a/x/pool/types/expected_keepers.go +++ b/x/pool/types/expected_keepers.go @@ -2,13 +2,12 @@ package types import ( sdk "github.com/cosmos/cosmos-sdk/types" - upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" ) -type AccountKeeper interface{} - -type UpgradeKeeper interface { - ScheduleUpgrade(ctx sdk.Context, plan upgradetypes.Plan) error +type AccountKeeper interface { + GetAccount(sdk.Context, sdk.AccAddress) types.AccountI + SetAccount(sdk.Context, types.AccountI) } type StakersKeeper interface { diff --git a/x/query/keeper/keeper.go b/x/query/keeper/keeper.go index 570911f4..51f5653c 100644 --- a/x/query/keeper/keeper.go +++ b/x/query/keeper/keeper.go @@ -3,17 +3,7 @@ package keeper import ( "fmt" - globalKeeper "github.com/KYVENetwork/chain/x/global/keeper" - teamKeeper "github.com/KYVENetwork/chain/x/team/keeper" - govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" - - bundlekeeper "github.com/KYVENetwork/chain/x/bundles/keeper" - delegationkeeper "github.com/KYVENetwork/chain/x/delegation/keeper" - poolkeeper "github.com/KYVENetwork/chain/x/pool/keeper" - stakerskeeper "github.com/KYVENetwork/chain/x/stakers/keeper" - authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + "github.com/KYVENetwork/chain/util" "github.com/cometbft/cometbft/libs/log" @@ -21,26 +11,24 @@ import ( "github.com/cosmos/cosmos-sdk/codec" storetypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" ) type ( Keeper struct { - cdc codec.BinaryCodec - storeKey storetypes.StoreKey - memKey storetypes.StoreKey - paramstore paramtypes.Subspace + cdc codec.BinaryCodec + storeKey storetypes.StoreKey + memKey storetypes.StoreKey + // paramstore paramtypes.Subspace //TODO(rapha): what is ps for? - accountKeeper authkeeper.AccountKeeper - bankKeeper bankkeeper.Keeper - distrkeeper distrkeeper.Keeper - poolKeeper poolkeeper.Keeper - stakerKeeper stakerskeeper.Keeper - delegationKeeper delegationkeeper.Keeper - bundleKeeper bundlekeeper.Keeper - globalKeeper globalKeeper.Keeper - govKeeper govkeeper.Keeper - teamKeeper teamKeeper.Keeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper + distrkeeper util.DistributionKeeper + poolKeeper types.PoolKeeper + stakerKeeper types.StakersKeeper + delegationKeeper types.DelegationKeeper + bundleKeeper types.BundlesKeeper // TODO: rename to bundlesKeeper + globalKeeper types.GlobalKeeper + govKeeper types.GovKeeper } ) @@ -48,24 +36,23 @@ func NewKeeper( cdc codec.BinaryCodec, storeKey, memKey storetypes.StoreKey, - ps paramtypes.Subspace, + // ps paramtypes.Subspace, //TODO(rapha): what is ps for? - accountKeeper authkeeper.AccountKeeper, - bankKeeper bankkeeper.Keeper, - distrkeeper distrkeeper.Keeper, - poolKeeper poolkeeper.Keeper, - stakerKeeper stakerskeeper.Keeper, - delegationKeeper delegationkeeper.Keeper, - bundleKeeper bundlekeeper.Keeper, - globalKeeper globalKeeper.Keeper, - govKeeper govkeeper.Keeper, - teamKeeper teamKeeper.Keeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, + distrkeeper util.DistributionKeeper, + poolKeeper types.PoolKeeper, + stakerKeeper types.StakersKeeper, + delegationKeeper types.DelegationKeeper, + // bundleKeeper types.BundlesKeeper, + globalKeeper types.GlobalKeeper, + govKeeper types.GovKeeper, ) *Keeper { return &Keeper{ - cdc: cdc, - storeKey: storeKey, - memKey: memKey, - paramstore: ps, + cdc: cdc, + storeKey: storeKey, + memKey: memKey, + // paramstore: ps, accountKeeper: accountKeeper, bankKeeper: bankKeeper, @@ -73,10 +60,9 @@ func NewKeeper( poolKeeper: poolKeeper, stakerKeeper: stakerKeeper, delegationKeeper: delegationKeeper, - bundleKeeper: bundleKeeper, - globalKeeper: globalKeeper, - govKeeper: govKeeper, - teamKeeper: teamKeeper, + // bundleKeeper: bundleKeeper, + globalKeeper: globalKeeper, + govKeeper: govKeeper, } } diff --git a/x/query/module.go b/x/query/module.go index 6997f108..cf745a62 100644 --- a/x/query/module.go +++ b/x/query/module.go @@ -3,6 +3,13 @@ package query import ( "context" "encoding/json" + + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + // this line is used by starport scaffolding # 1 "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -10,6 +17,8 @@ import ( abci "github.com/cometbft/cometbft/abci/types" + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/query/module/v1" + "github.com/KYVENetwork/chain/x/query/client/cli" "github.com/KYVENetwork/chain/x/query/keeper" "github.com/KYVENetwork/chain/x/query/types" @@ -87,27 +96,24 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { type AppModule struct { AppModuleBasic - keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + keeper keeper.Keeper } 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, } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -142,3 +148,74 @@ func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {} func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type QueryInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + MemKey *storeTypes.MemoryStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper util.BankKeeper + DelegationKeeper types.DelegationKeeper + DistributionKeeper util.DistributionKeeper + GlobalKeeper types.GlobalKeeper + GovKeeper types.GovKeeper + PoolKeeper types.PoolKeeper + StakersKeeper types.StakersKeeper + UpgradeKeeper util.UpgradeKeeper +} + +type QueryOutputs struct { + depinject.Out + + QueryKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in QueryInputs) QueryOutputs { + queryKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.MemKey, + in.AccountKeeper, + in.BankKeeper, + in.DistributionKeeper, + in.PoolKeeper, + in.StakersKeeper, + in.DelegationKeeper, + in.GlobalKeeper, + in.GovKeeper, + ) + m := NewAppModule(in.Cdc, *queryKeeper) + + return QueryOutputs{QueryKeeper: queryKeeper, Module: m} +} + +// TODO(rapha): cleanup +//type SubspaceInputs struct { +// depinject.In +// +// Key depinject.ModuleKey +// Keeper keeper.Keeper +// KeyTables map[string]paramtypes.KeyTable +//} +// +//func ProvideSubspace(in SubspaceInputs) paramtypes.Subspace { +// moduleName := in.Key.Name() +// kt, exists := in.KeyTables[moduleName] +// if !exists { +// return in.Keeper.Subspace(moduleName) +// } else { +// return in.Keeper.Subspace(moduleName).WithKeyTable(kt) +// } +//} diff --git a/x/query/types/expected_keepers.go b/x/query/types/expected_keepers.go index 6aa6e977..3601e42e 100644 --- a/x/query/types/expected_keepers.go +++ b/x/query/types/expected_keepers.go @@ -1,18 +1,71 @@ package types import ( + bundlesTypes "github.com/KYVENetwork/chain/x/bundles/types" + delegationTypes "github.com/KYVENetwork/chain/x/delegation/types" + globalTypes "github.com/KYVENetwork/chain/x/global/types" + poolTypes "github.com/KYVENetwork/chain/x/pool/types" + stakersTypes "github.com/KYVENetwork/chain/x/stakers/types" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/cosmos/cosmos-sdk/types/query" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types/v1" ) -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - GetAccount(ctx sdk.Context, addr sdk.AccAddress) types.AccountI - // Methods imported from account should be defined here +type GovKeeper interface { + GetParams(sdk.Context) govTypes.Params } -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SpendableCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins - // Methods imported from bank should be defined here +// TODO(rapha): do we need all of this methods? +type BundlesKeeper interface { + AssertCanVote(sdk.Context, uint64, string, string, string) error + AssertCanPropose(sdk.Context, uint64, string, string, uint64) error + GetBundleProposal(sdk.Context, uint64) (bundlesTypes.BundleProposal, bool) + GetBundleVersionMap(sdk.Context) bundlesTypes.BundleVersionMap + GetFinalizedBundle(sdk.Context, uint64, uint64) (bundlesTypes.FinalizedBundle, bool) + GetFinalizedBundleByHeight(sdk.Context, uint64, uint64) (FinalizedBundle, bool) + GetFinalizedBundleByIndex(sdk.Context, uint64, uint64) (FinalizedBundle, bool) + GetPaginatedFinalizedBundleQuery(sdk.Context, *query.PageRequest, uint64) ([]FinalizedBundle, *query.PageResponse, error) + GetParams(sdk.Context) bundlesTypes.Params + GetVoteDistribution(sdk.Context, uint64) bundlesTypes.VoteDistribution +} + +type DelegationKeeper interface { + GetDelegationAmount(sdk.Context, string) uint64 + GetDelegationAmountOfDelegator(sdk.Context, string, string) uint64 + GetDelegationOfPool(sdk.Context, uint64) uint64 + GetOutstandingRewards(sdk.Context, string, string) uint64 + GetPaginatedActiveStakersByDelegation(sdk.Context, *query.PageRequest, func(string, bool) bool) (*query.PageResponse, error) + GetPaginatedActiveStakersByPoolCountAndDelegation(sdk.Context, *query.PageRequest) ([]string, *query.PageResponse, error) + GetPaginatedInactiveStakersByDelegation(sdk.Context, *query.PageRequest, func(string, bool) bool) (*query.PageResponse, error) + GetPaginatedStakersByDelegation(sdk.Context, *query.PageRequest, func(string, bool) bool) (*query.PageResponse, error) + GetRedelegationCooldown(sdk.Context) uint64 + GetRedelegationCooldownEntries(sdk.Context, string) []uint64 + GetRedelegationMaxAmount(sdk.Context) uint64 + GetAllUnbondingDelegationQueueEntriesOfDelegator(sdk.Context, string) []delegationTypes.UndelegationQueueEntry + GetDelegationData(sdk.Context, string) (delegationTypes.DelegationData, bool) + GetUndelegationQueueEntry(sdk.Context, uint64) (delegationTypes.UndelegationQueueEntry, bool) + GetParams(sdk.Context) delegationTypes.Params + StoreKey() storeTypes.StoreKey +} + +type GlobalKeeper interface { + GetParams(sdk.Context) globalTypes.Params +} + +type PoolKeeper interface { + GetPaginatedPoolsQuery(sdk.Context, *query.PageRequest, string, string, bool, uint32) ([]poolTypes.Pool, *query.PageResponse, error) + GetAllPools(sdk.Context) []poolTypes.Pool + GetPool(sdk.Context, uint64) (poolTypes.Pool, bool) + GetPoolWithError(sdk.Context, uint64) (poolTypes.Pool, error) +} + +type StakersKeeper interface { + DoesStakerExist(ctx sdk.Context, staker string) bool + GetAllStakerAddressesOfPool(ctx sdk.Context, poolId uint64) (stakers []string) + GetAllValaccountsOfPool(sdk.Context, uint64) []*stakersTypes.Valaccount + GetCommissionChangeEntryByIndex2(sdk.Context, string) (stakersTypes.CommissionChangeEntry, bool) + GetParams(sdk.Context) stakersTypes.Params + GetStaker(sdk.Context, string) (stakersTypes.Staker, bool) + GetValaccountsFromStaker(sdk.Context, string) []*stakersTypes.Valaccount } diff --git a/x/stakers/keeper/keeper.go b/x/stakers/keeper/keeper.go index 48d46728..12a73346 100644 --- a/x/stakers/keeper/keeper.go +++ b/x/stakers/keeper/keeper.go @@ -3,7 +3,7 @@ package keeper import ( "fmt" - delegationKeeper "github.com/KYVENetwork/chain/x/delegation/keeper" + "github.com/KYVENetwork/chain/util" "github.com/cometbft/cometbft/libs/log" "github.com/KYVENetwork/chain/x/stakers/types" @@ -20,12 +20,12 @@ type ( authority string - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - distrkeeper types.DistrKeeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper + distrkeeper util.DistributionKeeper poolKeeper types.PoolKeeper upgradeKeeper types.UpgradeKeeper - delegationKeeper delegationKeeper.Keeper + delegationKeeper types.DelegationKeeper } ) @@ -36,11 +36,12 @@ func NewKeeper( authority string, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, - distrkeeper types.DistrKeeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, + distrkeeper util.DistributionKeeper, poolKeeper types.PoolKeeper, upgradeKeeper types.UpgradeKeeper, + delegationKeeper types.DelegationKeeper, ) *Keeper { return &Keeper{ cdc: cdc, @@ -49,18 +50,15 @@ func NewKeeper( authority: authority, - accountKeeper: accountKeeper, - bankKeeper: bankKeeper, - distrkeeper: distrkeeper, - poolKeeper: poolKeeper, - upgradeKeeper: upgradeKeeper, + accountKeeper: accountKeeper, + bankKeeper: bankKeeper, + distrkeeper: distrkeeper, + poolKeeper: poolKeeper, + upgradeKeeper: upgradeKeeper, + delegationKeeper: delegationKeeper, } } -func SetDelegationKeeper(k *Keeper, delegationKeeper delegationKeeper.Keeper) { - k.delegationKeeper = delegationKeeper -} - func (k Keeper) Logger(ctx sdk.Context) log.Logger { return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) } diff --git a/x/stakers/keeper/msg_server_create_staker.go b/x/stakers/keeper/msg_server_create_staker.go index ca535900..30c30342 100644 --- a/x/stakers/keeper/msg_server_create_staker.go +++ b/x/stakers/keeper/msg_server_create_staker.go @@ -3,9 +3,6 @@ package keeper import ( "context" - delegationKeeper "github.com/KYVENetwork/chain/x/delegation/keeper" - delegationTypes "github.com/KYVENetwork/chain/x/delegation/types" - "github.com/KYVENetwork/chain/x/stakers/types" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -33,12 +30,7 @@ func (k msgServer) CreateStaker( }) // Perform initial self delegation - delegationMsgServer := delegationKeeper.NewMsgServerImpl(k.delegationKeeper) - if _, err := delegationMsgServer.Delegate(ctx, &delegationTypes.MsgDelegate{ - Creator: msg.Creator, - Staker: msg.Creator, - Amount: msg.Amount, - }); err != nil { + if err := k.delegationKeeper.Delegate(ctx, msg.Creator, msg.Creator, msg.Amount); err != nil { return nil, err } diff --git a/x/stakers/module.go b/x/stakers/module.go index 7141634f..e8fa9f46 100644 --- a/x/stakers/module.go +++ b/x/stakers/module.go @@ -4,6 +4,16 @@ import ( "context" "encoding/json" "fmt" + + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/stakers/module/v1" + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govTypes "github.com/cosmos/cosmos-sdk/x/gov/types" + // this line is used by starport scaffolding # 1 "github.com/grpc-ecosystem/grpc-gateway/runtime" @@ -92,15 +102,15 @@ type AppModule struct { AppModuleBasic keeper keeper.Keeper - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper } func NewAppModule( cdc codec.Codec, keeper keeper.Keeper, - accountKeeper types.AccountKeeper, - bankKeeper types.BankKeeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), @@ -110,8 +120,11 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -151,3 +164,56 @@ func (am AppModule) EndBlock(ctx sdk.Context, _ abci.RequestEndBlock) []abci.Val am.keeper.ProcessLeavePoolQueue(ctx) return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type StakersInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + MemKey *storeTypes.MemoryStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper util.BankKeeper + DistributionKeeper util.DistributionKeeper + PoolKeeper types.PoolKeeper + UpgradeKeeper util.UpgradeKeeper + DelegationKeeper types.DelegationKeeper +} + +type StakersOutputs struct { + depinject.Out + + StakersKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in StakersInputs) StakersOutputs { + authority := authTypes.NewModuleAddress(govTypes.ModuleName) + if in.Config.Authority != "" { + authority = authTypes.NewModuleAddressOrBech32Address(in.Config.Authority) + } + + stakersKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.MemKey, + authority.String(), + in.AccountKeeper, + in.BankKeeper, + in.DistributionKeeper, + in.PoolKeeper, + in.UpgradeKeeper, + in.DelegationKeeper, + ) + m := NewAppModule(in.Cdc, *stakersKeeper, in.AccountKeeper, in.BankKeeper) + + return StakersOutputs{StakersKeeper: stakersKeeper, Module: m} +} diff --git a/x/stakers/types/expected_keepers.go b/x/stakers/types/expected_keepers.go index dcf2d185..57540e51 100644 --- a/x/stakers/types/expected_keepers.go +++ b/x/stakers/types/expected_keepers.go @@ -6,23 +6,6 @@ import ( "github.com/cosmos/cosmos-sdk/x/upgrade/types" ) -// AccountKeeper defines the expected account keeper used for simulations (noalias) -type AccountKeeper interface { - GetModuleAddress(moduleName string) sdk.AccAddress -} - -type DistrKeeper interface { - FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk.AccAddress) error -} - -// BankKeeper defines the expected interface needed to retrieve account balances. -type BankKeeper interface { - SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error - 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 -} - type PoolKeeper interface { AssertPoolExists(ctx sdk.Context, poolId uint64) error GetPoolWithError(ctx sdk.Context, poolId uint64) (poolTypes.Pool, error) @@ -36,4 +19,5 @@ type DelegationKeeper interface { GetDelegationAmount(ctx sdk.Context, staker string) uint64 GetDelegationAmountOfDelegator(ctx sdk.Context, stakerAddress string, delegatorAddress string) uint64 GetStakersByDelegator(ctx sdk.Context, delegator string) []string + Delegate(sdk.Context, string, string, uint64) error } diff --git a/x/team/abci.go b/x/team/abci.go index 5a90a279..30c50f6f 100644 --- a/x/team/abci.go +++ b/x/team/abci.go @@ -8,17 +8,13 @@ import ( // Auth authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" // Team "github.com/KYVENetwork/chain/x/team/keeper" "github.com/KYVENetwork/chain/x/team/types" - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) -func DistributeTeamInflation(ctx sdk.Context, bk bankKeeper.Keeper, tk keeper.Keeper, uk upgradeKeeper.Keeper) { +func DistributeTeamInflation(ctx sdk.Context, bk util.BankKeeper, tk keeper.Keeper, uk util.UpgradeKeeper) { // get the total team reward the module is eligible for in this block teamModuleRewards := tk.GetTeamBlockProvision(ctx) diff --git a/x/team/keeper/keeper.go b/x/team/keeper/keeper.go index 7db97665..198f24a0 100644 --- a/x/team/keeper/keeper.go +++ b/x/team/keeper/keeper.go @@ -3,18 +3,13 @@ package keeper import ( "fmt" - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" + "github.com/KYVENetwork/chain/util" "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" - // Auth - authKeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" // Team "github.com/KYVENetwork/chain/x/team/types" ) @@ -24,20 +19,20 @@ type ( cdc codec.BinaryCodec storeKey storeTypes.StoreKey - accountKeeper authKeeper.AccountKeeper - bankKeeper bankKeeper.Keeper - mintKeeper mintKeeper.Keeper - upgradeKeeper upgradeKeeper.Keeper + accountKeeper util.AccountKeeper + bankKeeper util.BankKeeper + mintKeeper util.MintKeeper + upgradeKeeper util.UpgradeKeeper } ) func NewKeeper( cdc codec.BinaryCodec, storeKey storeTypes.StoreKey, - accountKeeper authKeeper.AccountKeeper, - bankKeeper bankKeeper.Keeper, - mintKeeper mintKeeper.Keeper, - upgradeKeeper upgradeKeeper.Keeper, + accountKeeper util.AccountKeeper, + bankKeeper util.BankKeeper, + mintKeeper util.MintKeeper, + upgradeKeeper util.UpgradeKeeper, ) *Keeper { return &Keeper{ cdc: cdc, diff --git a/x/team/module.go b/x/team/module.go index 1606f61d..b141d17c 100644 --- a/x/team/module.go +++ b/x/team/module.go @@ -5,6 +5,12 @@ import ( "encoding/json" "fmt" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/depinject" + + "github.com/KYVENetwork/chain/util" + storeTypes "github.com/cosmos/cosmos-sdk/store/types" + abci "github.com/cometbft/cometbft/abci/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/codec" @@ -14,16 +20,11 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" - // Bank - bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - // Mint - mintKeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" // Team + modulev1 "github.com/KYVENetwork/chain/pulsar/kyve/team/module/v1" "github.com/KYVENetwork/chain/x/team/client/cli" "github.com/KYVENetwork/chain/x/team/keeper" "github.com/KYVENetwork/chain/x/team/types" - // Upgrade - upgradeKeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper" ) var ( @@ -96,18 +97,18 @@ func (AppModuleBasic) GetQueryCmd() *cobra.Command { type AppModule struct { AppModuleBasic - bk bankKeeper.Keeper - mk mintKeeper.Keeper + bk util.BankKeeper + mk util.MintKeeper keeper keeper.Keeper - uk upgradeKeeper.Keeper + uk util.UpgradeKeeper } func NewAppModule( cdc codec.Codec, - bk bankKeeper.Keeper, - mk mintKeeper.Keeper, + bk util.BankKeeper, + mk util.MintKeeper, keeper keeper.Keeper, - uk upgradeKeeper.Keeper, + uk util.UpgradeKeeper, ) AppModule { return AppModule{ AppModuleBasic: NewAppModuleBasic(cdc), @@ -118,8 +119,11 @@ func NewAppModule( } } -// Deprecated: use RegisterServices -func (AppModule) QuerierRoute() string { return types.RouterKey } +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} // RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { @@ -159,3 +163,44 @@ func (am AppModule) BeginBlock(ctx sdk.Context, _ abci.RequestBeginBlock) { func (am AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { return []abci.ValidatorUpdate{} } + +// App Wiring Setup +func init() { + appmodule.Register(&modulev1.Module{}, + appmodule.Provide(ProvideModule), + ) +} + +type TeamInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + Key *storeTypes.KVStoreKey + + AccountKeeper util.AccountKeeper + BankKeeper util.BankKeeper + MintKeeper util.MintKeeper + UpgradeKeeper util.UpgradeKeeper +} + +type TeamOutputs struct { + depinject.Out + + TeamKeeper *keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in TeamInputs) TeamOutputs { + teamKeeper := keeper.NewKeeper( + in.Cdc, + in.Key, + in.AccountKeeper, + in.BankKeeper, + in.MintKeeper, + in.UpgradeKeeper, + ) + m := NewAppModule(in.Cdc, in.BankKeeper, in.MintKeeper, *teamKeeper, in.UpgradeKeeper) + + return TeamOutputs{TeamKeeper: teamKeeper, Module: m} +}