diff --git a/app/app.go b/app/app.go index ec6685373..790d01c75 100644 --- a/app/app.go +++ b/app/app.go @@ -182,21 +182,15 @@ func init() { // AxelarApp defines the axelar Cosmos app that runs all modules type AxelarApp struct { *bam.BaseApp + // Keys and Keepers are necessary for the app to interact with the cosmos-sdk and to be able to test the app in isolation without mocks + Keepers *KeeperCache + Keys map[string]*sdk.KVStoreKey - appCodec codec.Codec - interfaceRegistry types.InterfaceRegistry - - // necessary keepers for export - stakingKeeper stakingkeeper.Keeper - crisisKeeper crisiskeeper.Keeper - distrKeeper distrkeeper.Keeper - slashingKeeper slashingkeeper.Keeper + appCodec codec.Codec - // keys to access the substores - keys map[string]*sdk.KVStoreKey + interfaceRegistry types.InterfaceRegistry - mm *module.Manager - upgradeKeeper upgradekeeper.Keeper + mm *module.Manager } // NewAxelarApp is a constructor function for axelar @@ -220,7 +214,7 @@ func NewAxelarApp( memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) keepers := NewKeeperCache() - SetKeeper(keepers, InitParamsKeeper(encodingConfig, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])) + SetKeeper(keepers, initParamsKeeper(encodingConfig, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])) // BaseApp handles interactions with Tendermint through the ABCI protocol bApp := initBaseApp(db, traceStore, encodingConfig, keepers, baseAppOptions, logger) @@ -229,23 +223,23 @@ func NewAxelarApp( moduleAccountPermissions := InitModuleAccountPermissions() // set up predefined keepers - SetKeeper(keepers, InitAccountKeeper(appCodec, keys, keepers, moduleAccountPermissions)) - SetKeeper(keepers, InitBankKeeper(appCodec, keys, keepers, moduleAccountPermissions)) - SetKeeper(keepers, InitStakingKeeper(appCodec, keys, keepers)) + SetKeeper(keepers, initAccountKeeper(appCodec, keys, keepers, moduleAccountPermissions)) + SetKeeper(keepers, initBankKeeper(appCodec, keys, keepers, moduleAccountPermissions)) + SetKeeper(keepers, initStakingKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initMintKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initDistributionKeeper(appCodec, keys, keepers, moduleAccountPermissions)) SetKeeper(keepers, initSlashingKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initCrisisKeeper(keepers, invCheckPeriod)) - SetKeeper(keepers, InitUpgradeKeeper(appCodec, keys, skipUpgradeHeights, homePath, bApp)) + SetKeeper(keepers, initUpgradeKeeper(appCodec, keys, skipUpgradeHeights, homePath, bApp)) SetKeeper(keepers, initEvidenceKeeper(appCodec, keys, keepers)) - SetKeeper(keepers, InitFeegrantKeeper(appCodec, keys, keepers)) - SetKeeper(keepers, InitCapabilityKeeper(appCodec, keys, memKeys)) - SetKeeper(keepers, InitIBCKeeper(appCodec, keys, keepers)) + SetKeeper(keepers, initFeegrantKeeper(appCodec, keys, keepers)) + SetKeeper(keepers, initCapabilityKeeper(appCodec, keys, memKeys)) + SetKeeper(keepers, initIBCKeeper(appCodec, keys, keepers)) // set up custom axelar keepers - SetKeeper(keepers, InitAxelarnetKeeper(appCodec, keys, keepers)) + SetKeeper(keepers, initAxelarnetKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initEvmKeeper(appCodec, keys, keepers)) - SetKeeper(keepers, InitNexusKeeper(appCodec, keys, keepers)) + SetKeeper(keepers, initNexusKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initRewardKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initMultisigKeeper(appCodec, keys, keepers)) SetKeeper(keepers, initTssKeeper(appCodec, keys, keepers)) @@ -281,7 +275,7 @@ func NewAxelarApp( // set the contract keeper for the Ics20WasmHooks if wasmHooks != nil { - wasmHooks.ContractKeeper = getKeeper[wasmkeeper.PermissionedKeeper](keepers) + wasmHooks.ContractKeeper = GetKeeper[wasmkeeper.PermissionedKeeper](keepers) } } @@ -289,17 +283,17 @@ func NewAxelarApp( SetKeeper(keepers, initGovernanceKeeper(appCodec, keys, keepers)) // seal capability keeper after all keepers are set to be certain that all capabilities have been registered - getKeeper[capabilitykeeper.Keeper](keepers).Seal() + GetKeeper[capabilitykeeper.Keeper](keepers).Seal() // set routers - getKeeper[nexusKeeper.Keeper](keepers).SetMessageRouter(initMessageRouter(keepers)) - getKeeper[ibckeeper.Keeper](keepers).SetRouter(initIBCRouter(keepers, initIBCMiddleware(keepers, ics4Wrapper))) + GetKeeper[nexusKeeper.Keeper](keepers).SetMessageRouter(initMessageRouter(keepers)) + GetKeeper[ibckeeper.Keeper](keepers).SetRouter(initIBCRouter(keepers, initIBCMiddleware(keepers, ics4Wrapper))) // register the staking hooks - getKeeper[stakingkeeper.Keeper](keepers).SetHooks( + GetKeeper[stakingkeeper.Keeper](keepers).SetHooks( stakingtypes.NewMultiStakingHooks( - getKeeper[distrkeeper.Keeper](keepers).Hooks(), - getKeeper[slashingkeeper.Keeper](keepers).Hooks(), + GetKeeper[distrkeeper.Keeper](keepers).Hooks(), + GetKeeper[slashingkeeper.Keeper](keepers).Hooks(), ), ) @@ -311,10 +305,10 @@ func NewAxelarApp( encodingConfig, appOpts, axelarnet.NewAppModule( - *getKeeper[axelarnetKeeper.IBCKeeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), - getKeeper[authkeeper.AccountKeeper](keepers), + *GetKeeper[axelarnetKeeper.IBCKeeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + axelarbankkeeper.NewBankKeeper(GetKeeper[bankkeeper.BaseKeeper](keepers)), + GetKeeper[authkeeper.AccountKeeper](keepers), logger, ), ) @@ -325,7 +319,7 @@ func NewAxelarApp( mm.SetOrderEndBlockers(orderEndBlockers()...) mm.SetOrderInitGenesis(orderModulesForGenesis()...) - mm.RegisterInvariants(getKeeper[crisiskeeper.Keeper](keepers)) + mm.RegisterInvariants(GetKeeper[crisiskeeper.Keeper](keepers)) // register all module routes and module queriers mm.RegisterRoutes(bApp.Router(), bApp.QueryRouter(), encodingConfig.Amino) @@ -336,13 +330,9 @@ func NewAxelarApp( BaseApp: bApp, appCodec: appCodec, interfaceRegistry: encodingConfig.InterfaceRegistry, - stakingKeeper: *getKeeper[stakingkeeper.Keeper](keepers), - crisisKeeper: *getKeeper[crisiskeeper.Keeper](keepers), - distrKeeper: *getKeeper[distrkeeper.Keeper](keepers), - slashingKeeper: *getKeeper[slashingkeeper.Keeper](keepers), - keys: keys, + Keepers: keepers, + Keys: keys, mm: mm, - upgradeKeeper: *getKeeper[upgradekeeper.Keeper](keepers), } app.setUpgradeBehaviour(configurator, keepers) @@ -372,7 +362,7 @@ func NewAxelarApp( ctx := app.BaseApp.NewUncachedContext(true, tmproto.Header{}) // Initialize pinned codes in wasmvm as they are not persisted there - if err := getKeeper[wasm.Keeper](keepers).InitializePinnedCodes(ctx); err != nil { + if err := GetKeeper[wasm.Keeper](keepers).InitializePinnedCodes(ctx); err != nil { tmos.Exit(fmt.Sprintf("failed initialize pinned codes %s", err)) } } @@ -382,7 +372,7 @@ func NewAxelarApp( // we need to ensure that all chain subspaces are loaded at start-up to prevent unexpected consensus failures // when the params keeper is used outside the evm module's context - getKeeper[evmKeeper.BaseKeeper](keepers).InitChains(app.NewContext(true, tmproto.Header{})) + GetKeeper[evmKeeper.BaseKeeper](keepers).InitChains(app.NewContext(true, tmproto.Header{})) return app } @@ -391,9 +381,9 @@ func InitICS4Wrapper(keepers *KeeperCache, wasmHooks *ibchooks.WasmHooks) ibchoo // ICS4Wrapper deals with sending IBC packets. These need to get rate limited when appropriate, // so we wrap the channel keeper (which implements the ICS4Wrapper interface) with a rate limiter. ics4Wrapper := axelarnet.NewRateLimitedICS4Wrapper( - getKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, - axelarnet.NewRateLimiter(getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[nexusKeeper.Keeper](keepers)), - getKeeper[axelarnetKeeper.Keeper](keepers), + GetKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, + axelarnet.NewRateLimiter(GetKeeper[axelarnetKeeper.Keeper](keepers), GetKeeper[nexusKeeper.Keeper](keepers)), + GetKeeper[axelarnetKeeper.Keeper](keepers), ) // create a middleware to integrate wasm hooks into the ibc pipeline if wasmHooks != nil { @@ -409,11 +399,11 @@ func initIBCMiddleware(keepers *KeeperCache, ics4Middleware ibchooks.ICS4Middlew // IBCModule deals with received IBC packets. These need to get rate limited when appropriate, // so we wrap the transfer module's IBCModule with a rate limiter. ibcModule := axelarnet.NewAxelarnetIBCModule( - transfer.NewIBCModule(*getKeeper[ibctransferkeeper.Keeper](keepers)), - *getKeeper[axelarnetKeeper.IBCKeeper](keepers), - axelarnet.NewRateLimiter(getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[nexusKeeper.Keeper](keepers)), - getKeeper[nexusKeeper.Keeper](keepers), - axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), + transfer.NewIBCModule(*GetKeeper[ibctransferkeeper.Keeper](keepers)), + *GetKeeper[axelarnetKeeper.IBCKeeper](keepers), + axelarnet.NewRateLimiter(GetKeeper[axelarnetKeeper.Keeper](keepers), GetKeeper[nexusKeeper.Keeper](keepers)), + GetKeeper[nexusKeeper.Keeper](keepers), + axelarbankkeeper.NewBankKeeper(GetKeeper[bankkeeper.BaseKeeper](keepers)), ) // By merging the middlewares the receiving IBC Module has access to all registered hooks in the ICS4Middleware @@ -441,9 +431,9 @@ func initIBCRouter(keepers *KeeperCache, axelarnetModule porttypes.IBCModule) *p if IsWasmEnabled() { // Create wasm ibc stack var wasmStack porttypes.IBCModule = wasm.NewIBCHandler( - getKeeper[wasm.Keeper](keepers), - getKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, - getKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, + GetKeeper[wasm.Keeper](keepers), + GetKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, + GetKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, ) ibcRouter.AddRoute(wasm.ModuleName, wasmStack) } @@ -454,19 +444,19 @@ func initMessageRouter(keepers *KeeperCache) nexusTypes.MessageRouter { messageRouter := nexusTypes.NewMessageRouter(). AddRoute(evmTypes.ModuleName, evmKeeper.NewMessageRoute()). AddRoute(axelarnetTypes.ModuleName, axelarnetKeeper.NewMessageRoute( - *getKeeper[axelarnetKeeper.Keeper](keepers), - getKeeper[axelarnetKeeper.IBCKeeper](keepers), - getKeeper[feegrantkeeper.Keeper](keepers), - axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[authkeeper.AccountKeeper](keepers), + *GetKeeper[axelarnetKeeper.Keeper](keepers), + GetKeeper[axelarnetKeeper.IBCKeeper](keepers), + GetKeeper[feegrantkeeper.Keeper](keepers), + axelarbankkeeper.NewBankKeeper(GetKeeper[bankkeeper.BaseKeeper](keepers)), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), )) if IsWasmEnabled() { messageRouter.AddRoute(wasm.ModuleName, nexusKeeper.NewMessageRoute( - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[wasmkeeper.PermissionedKeeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[wasmkeeper.PermissionedKeeper](keepers), )) } return messageRouter @@ -498,7 +488,7 @@ func (app *AxelarApp) registerWasmSnapshotExtension(keepers *KeeperCache) { if IsWasmEnabled() { if manager := app.SnapshotManager(); manager != nil { err := manager.RegisterExtensions( - wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), getKeeper[wasm.Keeper](keepers)), + wasmkeeper.NewWasmSnapshotter(app.CommitMultiStore(), GetKeeper[wasm.Keeper](keepers)), ) if err != nil { panic(fmt.Errorf("failed to register snapshot extension: %s", err)) @@ -508,7 +498,8 @@ func (app *AxelarApp) registerWasmSnapshotExtension(keepers *KeeperCache) { } func (app *AxelarApp) setUpgradeBehaviour(configurator module.Configurator, keepers *KeeperCache) { - app.upgradeKeeper.SetUpgradeHandler( + upgradeKeeper := GetKeeper[upgradekeeper.Keeper](keepers) + upgradeKeeper.SetUpgradeHandler( upgradeName(app.Version()), func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { updatedVM, err := app.mm.RunMigrations(ctx, configurator, fromVM) @@ -519,7 +510,7 @@ func (app *AxelarApp) setUpgradeBehaviour(configurator module.Configurator, keep // TODO: remove after v35 upgrade // Override wasm module default params if upgradeName(app.Version()) == "v0.35" && IsWasmEnabled() { - getKeeper[wasm.Keeper](keepers).SetParams(ctx, wasmtypes.Params{ + GetKeeper[wasm.Keeper](keepers).SetParams(ctx, wasmtypes.Params{ CodeUploadAccess: wasmtypes.AllowNobody, InstantiateDefaultPermission: wasmtypes.AccessTypeNobody, }) @@ -529,12 +520,12 @@ func (app *AxelarApp) setUpgradeBehaviour(configurator module.Configurator, keep }, ) - upgradeInfo, err := app.upgradeKeeper.ReadUpgradeInfoFromDisk() + upgradeInfo, err := upgradeKeeper.ReadUpgradeInfoFromDisk() if err != nil { panic(err) } - if upgradeInfo.Name == upgradeName(app.Version()) && !app.upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { + if upgradeInfo.Name == upgradeName(app.Version()) && !upgradeKeeper.IsSkipHeight(upgradeInfo.Height) { storeUpgrades := store.StoreUpgrades{} if IsWasmEnabled() { @@ -566,22 +557,22 @@ func initAppModules(keepers *KeeperCache, bApp *bam.BaseApp, encodingConfig axel appCodec := encodingConfig.Codec appModules := []module.AppModule{ - genutil.NewAppModule(getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[stakingkeeper.Keeper](keepers), bApp.DeliverTx, encodingConfig.TxConfig), - auth.NewAppModule(appCodec, *getKeeper[authkeeper.AccountKeeper](keepers), nil), - vesting.NewAppModule(*getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers)), + genutil.NewAppModule(GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[stakingkeeper.Keeper](keepers), bApp.DeliverTx, encodingConfig.TxConfig), + auth.NewAppModule(appCodec, *GetKeeper[authkeeper.AccountKeeper](keepers), nil), + vesting.NewAppModule(*GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers)), // bank module accepts a reference to the base keeper, but panics when RegisterService is called on a reference, so we need to dereference it - bank.NewAppModule(appCodec, *getKeeper[bankkeeper.BaseKeeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers)), - crisis.NewAppModule(getKeeper[crisiskeeper.Keeper](keepers), skipGenesisInvariants), - gov.NewAppModule(appCodec, *getKeeper[govkeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers)), - mint.NewAppModule(appCodec, *getKeeper[mintkeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers)), - slashing.NewAppModule(appCodec, *getKeeper[slashingkeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers), getKeeper[stakingkeeper.Keeper](keepers)), - distr.NewAppModule(appCodec, *getKeeper[distrkeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers), getKeeper[stakingkeeper.Keeper](keepers)), - staking.NewAppModule(appCodec, *getKeeper[stakingkeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers)), - upgrade.NewAppModule(*getKeeper[upgradekeeper.Keeper](keepers)), - evidence.NewAppModule(*getKeeper[evidencekeeper.Keeper](keepers)), - params.NewAppModule(*getKeeper[paramskeeper.Keeper](keepers)), - capability.NewAppModule(appCodec, *getKeeper[capabilitykeeper.Keeper](keepers)), + bank.NewAppModule(appCodec, *GetKeeper[bankkeeper.BaseKeeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers)), + crisis.NewAppModule(GetKeeper[crisiskeeper.Keeper](keepers), skipGenesisInvariants), + gov.NewAppModule(appCodec, *GetKeeper[govkeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers)), + mint.NewAppModule(appCodec, *GetKeeper[mintkeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers)), + slashing.NewAppModule(appCodec, *GetKeeper[slashingkeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers), GetKeeper[stakingkeeper.Keeper](keepers)), + distr.NewAppModule(appCodec, *GetKeeper[distrkeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers), GetKeeper[stakingkeeper.Keeper](keepers)), + staking.NewAppModule(appCodec, *GetKeeper[stakingkeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers)), + upgrade.NewAppModule(*GetKeeper[upgradekeeper.Keeper](keepers)), + evidence.NewAppModule(*GetKeeper[evidencekeeper.Keeper](keepers)), + params.NewAppModule(*GetKeeper[paramskeeper.Keeper](keepers)), + capability.NewAppModule(appCodec, *GetKeeper[capabilitykeeper.Keeper](keepers)), } // wasm module needs to be added in a specific order, so we cannot just append it at the end @@ -590,77 +581,77 @@ func initAppModules(keepers *KeeperCache, bApp *bam.BaseApp, encodingConfig axel appModules, wasm.NewAppModule( appCodec, - getKeeper[wasm.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[wasm.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), ), ) } if IsIBCWasmHooksEnabled() { - appModules = append(appModules, ibchooks.NewAppModule(getKeeper[authkeeper.AccountKeeper](keepers))) + appModules = append(appModules, ibchooks.NewAppModule(GetKeeper[authkeeper.AccountKeeper](keepers))) } appModules = append(appModules, - evidence.NewAppModule(*getKeeper[evidencekeeper.Keeper](keepers)), - ibc.NewAppModule(getKeeper[ibckeeper.Keeper](keepers)), - transfer.NewAppModule(*getKeeper[ibctransferkeeper.Keeper](keepers)), + evidence.NewAppModule(*GetKeeper[evidencekeeper.Keeper](keepers)), + ibc.NewAppModule(GetKeeper[ibckeeper.Keeper](keepers)), + transfer.NewAppModule(*GetKeeper[ibctransferkeeper.Keeper](keepers)), feegrantmodule.NewAppModule( appCodec, - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), - *getKeeper[feegrantkeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), + *GetKeeper[feegrantkeeper.Keeper](keepers), encodingConfig.InterfaceRegistry, ), - snapshot.NewAppModule(*getKeeper[snapKeeper.Keeper](keepers)), + snapshot.NewAppModule(*GetKeeper[snapKeeper.Keeper](keepers)), multisig.NewAppModule( - *getKeeper[multisigKeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[slashingkeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[rewardKeeper.Keeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), + *GetKeeper[multisigKeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[slashingkeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[rewardKeeper.Keeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), ), tss.NewAppModule( - *getKeeper[tssKeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[multisigKeeper.Keeper](keepers), + *GetKeeper[tssKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[multisigKeeper.Keeper](keepers), ), - vote.NewAppModule(*getKeeper[voteKeeper.Keeper](keepers)), + vote.NewAppModule(*GetKeeper[voteKeeper.Keeper](keepers)), nexus.NewAppModule( - *getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[slashingkeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[axelarnetKeeper.Keeper](keepers), - getKeeper[rewardKeeper.Keeper](keepers), + *GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[slashingkeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[axelarnetKeeper.Keeper](keepers), + GetKeeper[rewardKeeper.Keeper](keepers), ), evm.NewAppModule( - getKeeper[evmKeeper.BaseKeeper](keepers), - getKeeper[voteKeeper.Keeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[slashingkeeper.Keeper](keepers), - getKeeper[multisigKeeper.Keeper](keepers), + GetKeeper[evmKeeper.BaseKeeper](keepers), + GetKeeper[voteKeeper.Keeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[slashingkeeper.Keeper](keepers), + GetKeeper[multisigKeeper.Keeper](keepers), ), axelarnetModule, reward.NewAppModule( - *getKeeper[rewardKeeper.Keeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[mintkeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[slashingkeeper.Keeper](keepers), - getKeeper[multisigKeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), + *GetKeeper[rewardKeeper.Keeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[mintkeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[slashingkeeper.Keeper](keepers), + GetKeeper[multisigKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), bApp.MsgServiceRouter(), bApp.Router(), ), - permission.NewAppModule(*getKeeper[permissionKeeper.Keeper](keepers)), + permission.NewAppModule(*GetKeeper[permissionKeeper.Keeper](keepers)), ) return appModules } @@ -677,10 +668,10 @@ func initAnteHandlers(encodingConfig axelarParams.EncodingConfig, keys map[strin // The baseAnteHandler handles signature verification and transaction pre-processing baseAnteHandler, err := authAnte.NewAnteHandler( authAnte.HandlerOptions{ - AccountKeeper: getKeeper[authkeeper.AccountKeeper](keepers), - BankKeeper: getKeeper[bankkeeper.BaseKeeper](keepers), + AccountKeeper: GetKeeper[authkeeper.AccountKeeper](keepers), + BankKeeper: GetKeeper[bankkeeper.BaseKeeper](keepers), SignModeHandler: encodingConfig.TxConfig.SignModeHandler(), - FeegrantKeeper: getKeeper[feegrantkeeper.Keeper](keepers), + FeegrantKeeper: GetKeeper[feegrantkeeper.Keeper](keepers), SigGasConsumer: authAnte.DefaultSigVerificationGasConsumer, }, ) @@ -688,10 +679,19 @@ func initAnteHandlers(encodingConfig axelarParams.EncodingConfig, keys map[strin panic(err) } - anteDecorators := []sdk.AnteDecorator{ - ante.NewAnteHandlerDecorator(baseAnteHandler), - } + customAnteDecorators := InitCustomAnteDecorators(encodingConfig, keys, keepers, appOpts) + anteDecorators := append([]sdk.AnteDecorator{ante.NewAnteHandlerDecorator(baseAnteHandler)}, customAnteDecorators...) + return sdk.ChainAnteDecorators(anteDecorators...) +} + +func InitCustomAnteDecorators( + encodingConfig axelarParams.EncodingConfig, + keys map[string]*sdk.KVStoreKey, + keepers *KeeperCache, + appOpts servertypes.AppOptions, +) []sdk.AnteDecorator { + var anteDecorators []sdk.AnteDecorator // enforce wasm limits earlier in the ante handler chain if IsWasmEnabled() { wasmConfig := mustReadWasmConfig(appOpts) @@ -704,33 +704,32 @@ func initAnteHandlers(encodingConfig axelarParams.EncodingConfig, keys map[strin } anteDecorators = append(anteDecorators, - ibcante.NewAnteDecorator(getKeeper[ibckeeper.Keeper](keepers)), + ibcante.NewAnteDecorator(GetKeeper[ibckeeper.Keeper](keepers)), ante.NewCheckRefundFeeDecorator( encodingConfig.InterfaceRegistry, - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[rewardKeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[rewardKeeper.Keeper](keepers), ), ante.NewAnteHandlerDecorator( initMessageAnteDecorators(encodingConfig, keepers).ToAnteHandler()), ) - - return sdk.ChainAnteDecorators(anteDecorators...) + return anteDecorators } func initMessageAnteDecorators(encodingConfig axelarParams.EncodingConfig, keepers *KeeperCache) ante.MessageAnteHandler { return ante.ChainMessageAnteDecorators( ante.NewLogMsgDecorator(encodingConfig.Codec), - ante.NewCheckCommissionRate(getKeeper[stakingkeeper.Keeper](keepers)), + ante.NewCheckCommissionRate(GetKeeper[stakingkeeper.Keeper](keepers)), ante.NewUndelegateDecorator( - getKeeper[multisigKeeper.Keeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[snapKeeper.Keeper](keepers), + GetKeeper[multisigKeeper.Keeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), ), - ante.NewCheckProxy(getKeeper[snapKeeper.Keeper](keepers)), - ante.NewRestrictedTx(getKeeper[permissionKeeper.Keeper](keepers)), + ante.NewCheckProxy(GetKeeper[snapKeeper.Keeper](keepers)), + ante.NewRestrictedTx(GetKeeper[permissionKeeper.Keeper](keepers)), ) } @@ -986,7 +985,7 @@ func (app *AxelarApp) InitChainer(ctx sdk.Context, req abci.RequestInitChain) ab panic(err) } - app.upgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap()) + GetKeeper[upgradekeeper.Keeper](app.Keepers).SetModuleVersionMap(ctx, app.mm.GetVersionMap()) return app.mm.InitGenesis(ctx, app.appCodec, genesisState) } diff --git a/app/app_test.go b/app/app_test.go index 4c1ffb6b9..9c4e6fbc4 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -8,16 +8,24 @@ import ( "github.com/CosmWasm/wasmd/x/wasm" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" "github.com/cosmos/cosmos-sdk/simapp" + "github.com/cosmos/cosmos-sdk/simapp/helpers" + "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/version" "github.com/stretchr/testify/assert" + abcitypes "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" + abci "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" "google.golang.org/grpc/encoding" encproto "google.golang.org/grpc/encoding/proto" "github.com/axelarnetwork/axelar-core/app" + "github.com/axelarnetwork/axelar-core/app/params" + "github.com/axelarnetwork/axelar-core/testutils/fake" multisig "github.com/axelarnetwork/axelar-core/x/multisig/types" + "github.com/axelarnetwork/axelar-core/x/nexus/exported" + "github.com/axelarnetwork/utils/funcs" ) func TestNewAxelarApp(t *testing.T) { @@ -105,3 +113,62 @@ func TestGRPCEncodingSetDuringInit(t *testing.T) { assert.NoError(t, err) assert.NoError(t, codec.Unmarshal(bz, &keyResponse)) } + +func TestAnteHandlersCanHandleWasmMsgsWithoutSigners(t *testing.T) { + app.SetConfig() + app.WasmEnabled = "true" + app.IBCWasmHooksEnabled = "true" + version.Version = "0.35.0" + encConfig := app.MakeEncodingConfig() + + tx := prepareTx(encConfig, &exported.WasmMessage{}) + anteHandler := prepareAnteHandler(encConfig) + ctx := prepareCtx() + + _, err := anteHandler(ctx, tx, true) + assert.NoError(t, err) + _, err = anteHandler(ctx, tx, false) + assert.NoError(t, err) +} + +func prepareTx(encConfig params.EncodingConfig, msg sdk.Msg) sdk.Tx { + sk, _, _ := testdata.KeyTestPubAddr() + + tx := funcs.Must(helpers.GenTx( + encConfig.TxConfig, + []sdk.Msg{msg}, + sdk.NewCoins(sdk.NewInt64Coin("testcoin", 0)), + 1000000000, + "testchain", + []uint64{0}, + []uint64{0}, + sk, + )) + return tx +} + +func prepareAnteHandler(cfg params.EncodingConfig) sdk.AnteHandler { + axelarApp := app.NewAxelarApp( + log.TestingLogger(), + dbm.NewMemDB(), + nil, + true, + nil, + "", + "", + 0, + cfg, + simapp.EmptyAppOptions{}, + []wasm.Option{}, + ) + + anteHandler := app.InitCustomAnteDecorators(cfg, axelarApp.Keys, axelarApp.Keepers, simapp.EmptyAppOptions{}) + return sdk.ChainAnteDecorators(anteHandler...) +} + +func prepareCtx() sdk.Context { + return sdk.NewContext(fake.NewMultiStore(), abci.Header{}, false, log.TestingLogger()). + WithConsensusParams(&abcitypes.ConsensusParams{ + Block: &abcitypes.BlockParams{MaxGas: 1000000000}, + }) +} diff --git a/app/export.go b/app/export.go index e4f1409ba..a67ad1167 100644 --- a/app/export.go +++ b/app/export.go @@ -6,8 +6,12 @@ import ( servertypes "github.com/cosmos/cosmos-sdk/server/types" sdk "github.com/cosmos/cosmos-sdk/types" + crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" + stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" ) @@ -33,7 +37,8 @@ func (app *AxelarApp) ExportAppStateAndValidators(forZeroHeight bool, jailAllowe return servertypes.ExportedApp{}, err } - validators, err := staking.WriteValidators(ctx, app.stakingKeeper) + stakingKeeper := GetKeeper[stakingkeeper.Keeper](app.Keepers) + validators, err := staking.WriteValidators(ctx, *stakingKeeper) if err != nil { return servertypes.ExportedApp{}, err } @@ -66,49 +71,54 @@ func (app *AxelarApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs allowedAddrsMap[addr] = true } + crisisKeeper := GetKeeper[crisiskeeper.Keeper](app.Keepers) + stakingKeeper := GetKeeper[stakingkeeper.Keeper](app.Keepers) + distrKeeper := GetKeeper[distrkeeper.Keeper](app.Keepers) + slashingKeeper := GetKeeper[slashingkeeper.Keeper](app.Keepers) + /* Just to be safe, assert the invariants on current state. */ - app.crisisKeeper.AssertInvariants(ctx) + crisisKeeper.AssertInvariants(ctx) /* Handle fee distribution state. */ // withdraw all validator commission - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { - _, _ = app.distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) + stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + _, _ = distrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator()) return false }) // withdraw all delegator rewards - dels := app.stakingKeeper.GetAllDelegations(ctx) + dels := stakingKeeper.GetAllDelegations(ctx) for _, delegation := range dels { - _, _ = app.distrKeeper.WithdrawDelegationRewards(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr()) + _, _ = distrKeeper.WithdrawDelegationRewards(ctx, delegation.GetDelegatorAddr(), delegation.GetValidatorAddr()) } // clear validator slash events - app.distrKeeper.DeleteAllValidatorSlashEvents(ctx) + distrKeeper.DeleteAllValidatorSlashEvents(ctx) // clear validator historical rewards - app.distrKeeper.DeleteAllValidatorHistoricalRewards(ctx) + distrKeeper.DeleteAllValidatorHistoricalRewards(ctx) // set context height to zero height := ctx.BlockHeight() ctx = ctx.WithBlockHeight(0) // reinitialize all validators - app.stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { + stakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) { // donate any unwithdrawn outstanding reward fraction tokens to the community pool - scraps := app.distrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) - feePool := app.distrKeeper.GetFeePool(ctx) + scraps := distrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator()) + feePool := distrKeeper.GetFeePool(ctx) feePool.CommunityPool = feePool.CommunityPool.Add(scraps...) - app.distrKeeper.SetFeePool(ctx, feePool) + distrKeeper.SetFeePool(ctx, feePool) - app.distrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) + distrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()) return false }) // reinitialize all delegations for _, del := range dels { - app.distrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) - app.distrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + distrKeeper.Hooks().BeforeDelegationCreated(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) + distrKeeper.Hooks().AfterDelegationModified(ctx, del.GetDelegatorAddr(), del.GetValidatorAddr()) } // reset context height @@ -117,32 +127,32 @@ func (app *AxelarApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs /* Handle staking state. */ // iterate through redelegations, reset creation height - app.stakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { + stakingKeeper.IterateRedelegations(ctx, func(_ int64, red stakingtypes.Redelegation) (stop bool) { for i := range red.Entries { red.Entries[i].CreationHeight = 0 } - app.stakingKeeper.SetRedelegation(ctx, red) + stakingKeeper.SetRedelegation(ctx, red) return false }) // iterate through unbonding delegations, reset creation height - app.stakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { + stakingKeeper.IterateUnbondingDelegations(ctx, func(_ int64, ubd stakingtypes.UnbondingDelegation) (stop bool) { for i := range ubd.Entries { ubd.Entries[i].CreationHeight = 0 } - app.stakingKeeper.SetUnbondingDelegation(ctx, ubd) + stakingKeeper.SetUnbondingDelegation(ctx, ubd) return false }) // Iterate through validators by power descending, reset bond heights, and // update bond intra-tx counters. - store := ctx.KVStore(app.keys[stakingtypes.StoreKey]) + store := ctx.KVStore(app.Keys[stakingtypes.StoreKey]) iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey) counter := int16(0) for ; iter.Valid(); iter.Next() { addr := sdk.ValAddress(iter.Key()[1:]) - validator, found := app.stakingKeeper.GetValidator(ctx, addr) + validator, found := stakingKeeper.GetValidator(ctx, addr) if !found { panic("expected validator, not found") } @@ -152,24 +162,24 @@ func (app *AxelarApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs validator.Jailed = true } - app.stakingKeeper.SetValidator(ctx, validator) + stakingKeeper.SetValidator(ctx, validator) counter++ } _ = iter.Close() - if _, err := app.stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx); err != nil { + if _, err := stakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx); err != nil { panic(err) } /* Handle slashing state. */ // reset start height on signing infos - app.slashingKeeper.IterateValidatorSigningInfos( + slashingKeeper.IterateValidatorSigningInfos( ctx, func(addr sdk.ConsAddress, info slashingtypes.ValidatorSigningInfo) (stop bool) { info.StartHeight = 0 - app.slashingKeeper.SetValidatorSigningInfo(ctx, addr, info) + slashingKeeper.SetValidatorSigningInfo(ctx, addr, info) return false }, ) diff --git a/app/keepers.go b/app/keepers.go index de2dc4b9a..9785699cc 100644 --- a/app/keepers.go +++ b/app/keepers.go @@ -87,7 +87,7 @@ func NewKeeperCache() *KeeperCache { } func (k *KeeperCache) getSubspace(moduleName string) paramstypes.Subspace { - paramsK := getKeeper[paramskeeper.Keeper](k) + paramsK := GetKeeper[paramskeeper.Keeper](k) subspace, ok := paramsK.GetSubspace(moduleName) if !ok { panic(fmt.Sprintf("subspace %s not found", moduleName)) @@ -95,7 +95,7 @@ func (k *KeeperCache) getSubspace(moduleName string) paramstypes.Subspace { return subspace } -func getKeeper[T any](k *KeeperCache) *T { +func GetKeeper[T any](k *KeeperCache) *T { if reflect.TypeOf(*new(T)).Kind() == reflect.Ptr { panic(fmt.Sprintf("the generic parameter for %s cannot be a reference type", fullTypeName[T]())) } @@ -125,7 +125,7 @@ func fullTypeName[T any]() string { return keeperType.PkgPath() + "." + keeperType.Name() } -func InitParamsKeeper(encodingConfig axelarParams.EncodingConfig, key, tkey sdk.StoreKey) *paramskeeper.Keeper { +func initParamsKeeper(encodingConfig axelarParams.EncodingConfig, key, tkey sdk.StoreKey) *paramskeeper.Keeper { paramsKeeper := paramskeeper.NewKeeper(encodingConfig.Codec, encodingConfig.Amino, key, tkey) paramsKeeper.Subspace(bam.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()) @@ -153,12 +153,12 @@ func InitParamsKeeper(encodingConfig axelarParams.EncodingConfig, key, tkey sdk. return ¶msKeeper } -func InitStakingKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *stakingkeeper.Keeper { +func initStakingKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *stakingkeeper.Keeper { stakingK := stakingkeeper.NewKeeper( appCodec, keys[stakingtypes.StoreKey], - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), keepers.getSubspace(stakingtypes.ModuleName), ) return &stakingK @@ -176,31 +176,31 @@ func initWasmKeeper(encodingConfig axelarParams.EncodingConfig, keys map[string] // if we want to allow any custom callbacks wasmOpts = append(wasmOpts, wasmkeeper.WithMessageHandlerDecorator( func(old wasmkeeper.Messenger) wasmkeeper.Messenger { - encoders := wasm.DefaultEncoders(encodingConfig.Codec, getKeeper[ibctransferkeeper.Keeper](keepers)) + encoders := wasm.DefaultEncoders(encodingConfig.Codec, GetKeeper[ibctransferkeeper.Keeper](keepers)) encoders.Custom = nexusKeeper.EncodeRoutingMessage return WithAnteHandlers( encoders, initMessageAnteDecorators(encodingConfig, keepers), // for security reasons we disallow some msg types that can be used for arbitrary calls - wasmkeeper.NewMessageHandlerChain(NewMsgTypeBlacklistMessenger(), old, nexusKeeper.NewMessenger(getKeeper[nexusKeeper.Keeper](keepers)))) + wasmkeeper.NewMessageHandlerChain(NewMsgTypeBlacklistMessenger(), old, nexusKeeper.NewMessenger(GetKeeper[nexusKeeper.Keeper](keepers)))) })) - scopedWasmK := getKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(wasm.ModuleName) - ibcKeeper := getKeeper[ibckeeper.Keeper](keepers) + scopedWasmK := GetKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(wasm.ModuleName) + ibcKeeper := GetKeeper[ibckeeper.Keeper](keepers) wasmK := wasm.NewKeeper( encodingConfig.Codec, keys[wasm.StoreKey], keepers.getSubspace(wasm.ModuleName), - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[distrkeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[distrkeeper.Keeper](keepers), ibcKeeper.ChannelKeeper, ibcKeeper.ChannelKeeper, &ibcKeeper.PortKeeper, scopedWasmK, - getKeeper[ibctransferkeeper.Keeper](keepers), + GetKeeper[ibctransferkeeper.Keeper](keepers), bApp.MsgServiceRouter(), bApp.GRPCQueryRouter(), wasmDir, @@ -216,23 +216,23 @@ func initGovernanceKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, // Add governance proposal hooks govRouter := govtypes.NewRouter() govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler). - AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(*getKeeper[paramskeeper.Keeper](keepers))). - AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(*getKeeper[distrkeeper.Keeper](keepers))). - AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(*getKeeper[upgradekeeper.Keeper](keepers))). - AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(getKeeper[ibckeeper.Keeper](keepers).ClientKeeper)). - AddRoute(axelarnetTypes.RouterKey, axelarnet.NewProposalHandler(*getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[nexusKeeper.Keeper](keepers), getKeeper[authkeeper.AccountKeeper](keepers))) + AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(*GetKeeper[paramskeeper.Keeper](keepers))). + AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(*GetKeeper[distrkeeper.Keeper](keepers))). + AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(*GetKeeper[upgradekeeper.Keeper](keepers))). + AddRoute(ibcclienttypes.RouterKey, ibcclient.NewClientProposalHandler(GetKeeper[ibckeeper.Keeper](keepers).ClientKeeper)). + AddRoute(axelarnetTypes.RouterKey, axelarnet.NewProposalHandler(*GetKeeper[axelarnetKeeper.Keeper](keepers), GetKeeper[nexusKeeper.Keeper](keepers), GetKeeper[authkeeper.AccountKeeper](keepers))) if IsWasmEnabled() { - govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(getKeeper[wasm.Keeper](keepers), wasm.EnableAllProposals)) + govRouter.AddRoute(wasm.RouterKey, wasm.NewWasmProposalHandler(GetKeeper[wasm.Keeper](keepers), wasm.EnableAllProposals)) } govK := govkeeper.NewKeeper( - appCodec, keys[govtypes.StoreKey], keepers.getSubspace(govtypes.ModuleName), getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), govRouter, + appCodec, keys[govtypes.StoreKey], keepers.getSubspace(govtypes.ModuleName), GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), govRouter, ) - axelarnetK := getKeeper[axelarnetKeeper.Keeper](keepers) - govK.SetHooks(govtypes.NewMultiGovHooks(axelarnetK.Hooks(getKeeper[nexusKeeper.Keeper](keepers), govK))) + axelarnetK := GetKeeper[axelarnetKeeper.Keeper](keepers) + govK.SetHooks(govtypes.NewMultiGovHooks(axelarnetK.Hooks(GetKeeper[nexusKeeper.Keeper](keepers), govK))) return &govK } @@ -247,9 +247,9 @@ func initVoteKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepe evmTypes.ModuleName, evmKeeper.NewVoteHandler( appCodec, - getKeeper[evmKeeper.BaseKeeper](keepers), - getKeeper[nexusKeeper.Keeper](keepers), - getKeeper[rewardKeeper.Keeper](keepers), + GetKeeper[evmKeeper.BaseKeeper](keepers), + GetKeeper[nexusKeeper.Keeper](keepers), + GetKeeper[rewardKeeper.Keeper](keepers), ), ) @@ -257,9 +257,9 @@ func initVoteKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepe appCodec, keys[voteTypes.StoreKey], keepers.getSubspace(voteTypes.ModuleName), - getKeeper[snapKeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[rewardKeeper.Keeper](keepers), + GetKeeper[snapKeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[rewardKeeper.Keeper](keepers), ) voteK.SetVoteRouter(voteRouter) return &voteK @@ -270,9 +270,9 @@ func initSnapshotKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, k appCodec, keys[snapTypes.StoreKey], keepers.getSubspace(snapTypes.ModuleName), - getKeeper[stakingkeeper.Keeper](keepers), - axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), - getKeeper[slashingkeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + axelarbankkeeper.NewBankKeeper(GetKeeper[bankkeeper.BaseKeeper](keepers)), + GetKeeper[slashingkeeper.Keeper](keepers), ) return &snapK } @@ -284,7 +284,7 @@ func initTssKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keeper func initMultisigKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *multisigKeeper.Keeper { multisigRouter := multisigTypes.NewSigRouter() - multisigRouter.AddHandler(evmTypes.ModuleName, evmKeeper.NewSigHandler(appCodec, getKeeper[evmKeeper.BaseKeeper](keepers))) + multisigRouter.AddHandler(evmTypes.ModuleName, evmKeeper.NewSigHandler(appCodec, GetKeeper[evmKeeper.BaseKeeper](keepers))) multisigK := multisigKeeper.NewKeeper(appCodec, keys[multisigTypes.StoreKey], keepers.getSubspace(multisigTypes.ModuleName)) multisigK.SetSigRouter(multisigRouter) @@ -296,67 +296,67 @@ func initRewardKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, kee appCodec, keys[rewardTypes.StoreKey], keepers.getSubspace(rewardTypes.ModuleName), - axelarbankkeeper.NewBankKeeper(getKeeper[bankkeeper.BaseKeeper](keepers)), - getKeeper[distrkeeper.Keeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), + axelarbankkeeper.NewBankKeeper(GetKeeper[bankkeeper.BaseKeeper](keepers)), + GetKeeper[distrkeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), ) return &rewardK } -func InitIBCKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *ibckeeper.Keeper { - scopedIBCK := getKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(ibchost.ModuleName) +func initIBCKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *ibckeeper.Keeper { + scopedIBCK := GetKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(ibchost.ModuleName) return ibckeeper.NewKeeper( appCodec, keys[ibchost.StoreKey], keepers.getSubspace(ibchost.ModuleName), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[upgradekeeper.Keeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[upgradekeeper.Keeper](keepers), scopedIBCK, ) } func initIBCTransferKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache, ics4Wrapper ibctransfertypes.ICS4Wrapper) *ibctransferkeeper.Keeper { - scopedTransferK := getKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(ibctransfertypes.ModuleName) + scopedTransferK := GetKeeper[capabilitykeeper.Keeper](keepers).ScopeToModule(ibctransfertypes.ModuleName) transferK := ibctransferkeeper.NewKeeper( appCodec, keys[ibctransfertypes.StoreKey], keepers.getSubspace(ibctransfertypes.ModuleName), // Use the IBC middleware stack ics4Wrapper, - getKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, &getKeeper[ibckeeper.Keeper](keepers).PortKeeper, - getKeeper[authkeeper.AccountKeeper](keepers), getKeeper[bankkeeper.BaseKeeper](keepers), scopedTransferK, + GetKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, &GetKeeper[ibckeeper.Keeper](keepers).PortKeeper, + GetKeeper[authkeeper.AccountKeeper](keepers), GetKeeper[bankkeeper.BaseKeeper](keepers), scopedTransferK, ) return &transferK } func initWasmContractKeeper(keepers *KeeperCache) *wasmkeeper.PermissionedKeeper { - return wasmkeeper.NewDefaultPermissionKeeper(getKeeper[wasm.Keeper](keepers)) + return wasmkeeper.NewDefaultPermissionKeeper(GetKeeper[wasm.Keeper](keepers)) } func initAxelarIBCKeeper(keepers *KeeperCache) *axelarnetKeeper.IBCKeeper { - ibcK := axelarnetKeeper.NewIBCKeeper(*getKeeper[axelarnetKeeper.Keeper](keepers), getKeeper[ibctransferkeeper.Keeper](keepers)) + ibcK := axelarnetKeeper.NewIBCKeeper(*GetKeeper[axelarnetKeeper.Keeper](keepers), GetKeeper[ibctransferkeeper.Keeper](keepers)) return &ibcK } -func InitAxelarnetKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *axelarnetKeeper.Keeper { +func initAxelarnetKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *axelarnetKeeper.Keeper { axelarnetK := axelarnetKeeper.NewKeeper( appCodec, keys[axelarnetTypes.StoreKey], keepers.getSubspace(axelarnetTypes.ModuleName), - getKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, - getKeeper[feegrantkeeper.Keeper](keepers), + GetKeeper[ibckeeper.Keeper](keepers).ChannelKeeper, + GetKeeper[feegrantkeeper.Keeper](keepers), ) return &axelarnetK } func initEvmKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *evmKeeper.BaseKeeper { - return evmKeeper.NewKeeper(appCodec, keys[evmTypes.StoreKey], getKeeper[paramskeeper.Keeper](keepers)) + return evmKeeper.NewKeeper(appCodec, keys[evmTypes.StoreKey], GetKeeper[paramskeeper.Keeper](keepers)) } -func InitNexusKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *nexusKeeper.Keeper { +func initNexusKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *nexusKeeper.Keeper { // setting validator will finalize all by sealing it // no more validators can be added addressValidators := nexusTypes.NewAddressValidators(). AddAddressValidator(evmTypes.ModuleName, evmKeeper.NewAddressValidator()). - AddAddressValidator(axelarnetTypes.ModuleName, axelarnetKeeper.NewAddressValidator(getKeeper[axelarnetKeeper.Keeper](keepers))) + AddAddressValidator(axelarnetTypes.ModuleName, axelarnetKeeper.NewAddressValidator(GetKeeper[axelarnetKeeper.Keeper](keepers))) addressValidators.Seal() nexusK := nexusKeeper.NewKeeper(appCodec, keys[nexusTypes.StoreKey], keepers.getSubspace(nexusTypes.ModuleName)) @@ -365,20 +365,20 @@ func InitNexusKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keep return &nexusK } -func InitCapabilityKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, memKeys map[string]*sdk.MemoryStoreKey) *capabilitykeeper.Keeper { +func initCapabilityKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, memKeys map[string]*sdk.MemoryStoreKey) *capabilitykeeper.Keeper { return capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey]) } -func InitFeegrantKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *feegrantkeeper.Keeper { - feegrantK := feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], getKeeper[authkeeper.AccountKeeper](keepers)) +func initFeegrantKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *feegrantkeeper.Keeper { + feegrantK := feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], GetKeeper[authkeeper.AccountKeeper](keepers)) return &feegrantK } func initEvidenceKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *evidencekeeper.Keeper { - return evidencekeeper.NewKeeper(appCodec, keys[evidencetypes.StoreKey], getKeeper[stakingkeeper.Keeper](keepers), getKeeper[slashingkeeper.Keeper](keepers)) + return evidencekeeper.NewKeeper(appCodec, keys[evidencetypes.StoreKey], GetKeeper[stakingkeeper.Keeper](keepers), GetKeeper[slashingkeeper.Keeper](keepers)) } -func InitUpgradeKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, skipUpgradeHeights map[int64]bool, homePath string, bApp *bam.BaseApp) *upgradekeeper.Keeper { +func initUpgradeKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, skipUpgradeHeights map[int64]bool, homePath string, bApp *bam.BaseApp) *upgradekeeper.Keeper { upgradeK := upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, bApp) return &upgradeK } @@ -398,14 +398,14 @@ func initCrisisKeeper(keepers *KeeperCache, invCheckPeriod uint) *crisiskeeper.K crisisK := crisiskeeper.NewKeeper( keepers.getSubspace(crisistypes.ModuleName), invCheckPeriod, - getKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), authtypes.FeeCollectorName, ) return &crisisK } func initSlashingKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache) *slashingkeeper.Keeper { - slashK := slashingkeeper.NewKeeper(appCodec, keys[slashingtypes.StoreKey], getKeeper[stakingkeeper.Keeper](keepers), keepers.getSubspace(slashingtypes.ModuleName)) + slashK := slashingkeeper.NewKeeper(appCodec, keys[slashingtypes.StoreKey], GetKeeper[stakingkeeper.Keeper](keepers), keepers.getSubspace(slashingtypes.ModuleName)) return &slashK } @@ -414,9 +414,9 @@ func initDistributionKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKe appCodec, keys[distrtypes.StoreKey], keepers.getSubspace(distrtypes.ModuleName), - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), - getKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), authtypes.FeeCollectorName, moduleAccountAddrs(moduleAccPerms), ) @@ -428,19 +428,19 @@ func initMintKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepe appCodec, keys[minttypes.StoreKey], keepers.getSubspace(minttypes.ModuleName), - getKeeper[stakingkeeper.Keeper](keepers), - getKeeper[authkeeper.AccountKeeper](keepers), - getKeeper[bankkeeper.BaseKeeper](keepers), + GetKeeper[stakingkeeper.Keeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[bankkeeper.BaseKeeper](keepers), authtypes.FeeCollectorName, ) return &mintK } -func InitBankKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache, moduleAccPerms map[string][]string) *bankkeeper.BaseKeeper { +func initBankKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache, moduleAccPerms map[string][]string) *bankkeeper.BaseKeeper { bankK := bankkeeper.NewBaseKeeper( appCodec, keys[banktypes.StoreKey], - getKeeper[authkeeper.AccountKeeper](keepers), + GetKeeper[authkeeper.AccountKeeper](keepers), keepers.getSubspace(banktypes.ModuleName), maps.Filter(moduleAccountAddrs(moduleAccPerms), func(addr string, _ bool) bool { // we do not rely on internal balance tracking for invariance checks in the axelarnet module @@ -453,7 +453,7 @@ func InitBankKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepe return &bankK } -func InitAccountKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache, moduleAccPerms map[string][]string) *authkeeper.AccountKeeper { +func initAccountKeeper(appCodec codec.Codec, keys map[string]*sdk.KVStoreKey, keepers *KeeperCache, moduleAccPerms map[string][]string) *authkeeper.AccountKeeper { authK := authkeeper.NewAccountKeeper( appCodec, keys[authtypes.StoreKey], diff --git a/app/wasm_test.go b/app/wasm_test.go index 09423ef41..83c6ea240 100644 --- a/app/wasm_test.go +++ b/app/wasm_test.go @@ -8,12 +8,12 @@ import ( wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types" wasmvmtypes "github.com/CosmWasm/wasmvm/types" + "github.com/cosmos/cosmos-sdk/simapp" sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" "github.com/stretchr/testify/assert" "github.com/tendermint/tendermint/libs/log" tmproto "github.com/tendermint/tendermint/proto/tendermint/types" + dbm "github.com/tendermint/tm-db" "github.com/axelarnetwork/axelar-core/app" "github.com/axelarnetwork/axelar-core/app/mock" @@ -255,13 +255,7 @@ func TestNewWasmAppModuleBasicOverride(t *testing.T) { } func TestICSMiddleWare(t *testing.T) { - encodingConfig := app.MakeEncodingConfig() - appCodec := encodingConfig.Codec - keys := app.CreateStoreKeys() - tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) - memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey) - moduleAccountPermissions := app.InitModuleAccountPermissions() testCases := []struct { wasm string @@ -275,21 +269,23 @@ func TestICSMiddleWare(t *testing.T) { t.Run("wasm_enabled:"+testCase.wasm+"-hooks_enabled:"+testCase.hooks, func(t *testing.T) { app.WasmEnabled, app.IBCWasmHooksEnabled = testCase.wasm, testCase.hooks - keepers := app.NewKeeperCache() - app.SetKeeper(keepers, app.InitParamsKeeper(encodingConfig, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])) - app.SetKeeper(keepers, app.InitAccountKeeper(appCodec, keys, keepers, moduleAccountPermissions)) - app.SetKeeper(keepers, app.InitBankKeeper(appCodec, keys, keepers, moduleAccountPermissions)) - app.SetKeeper(keepers, app.InitStakingKeeper(appCodec, keys, keepers)) - app.SetKeeper(keepers, app.InitCapabilityKeeper(appCodec, keys, memKeys)) - app.SetKeeper(keepers, app.InitUpgradeKeeper(appCodec, keys, nil, "home", nil)) - app.SetKeeper(keepers, app.InitIBCKeeper(appCodec, keys, keepers)) - app.SetKeeper(keepers, app.InitFeegrantKeeper(appCodec, keys, keepers)) - app.SetKeeper(keepers, app.InitAxelarnetKeeper(appCodec, keys, keepers)) - app.SetKeeper(keepers, app.InitNexusKeeper(appCodec, keys, keepers)) + axelarApp := app.NewAxelarApp( + log.TestingLogger(), + dbm.NewMemDB(), + nil, + true, + nil, + "", + "", + 0, + app.MakeEncodingConfig(), + simapp.EmptyAppOptions{}, + []wasm.Option{}, + ) // this is the focus of the test, we need to ensure that the hooks and wrapper are correctly set up for each valid wasm/hooks flag combination wasmHooks := app.InitWasmHooks(keys) - ics4Wrapper := app.InitICS4Wrapper(keepers, wasmHooks) + ics4Wrapper := app.InitICS4Wrapper(axelarApp.Keepers, wasmHooks) ctx := sdk.NewContext(fake.NewMultiStore(), tmproto.Header{}, false, log.TestingLogger()) packet := &mock.PacketIMock{ diff --git a/x/ante/check_refund.go b/x/ante/check_refund.go index 3dc992d67..7780d36a9 100644 --- a/x/ante/check_refund.go +++ b/x/ante/check_refund.go @@ -101,7 +101,7 @@ func (d CheckRefundFeeDecorator) validateRefundQualification(ctx sdk.Context, ms return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "signer is not associated with a validator") } default: - return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("message type %T is not refundable", msg)) + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, fmt.Sprintf("all messages in a transaction must be refundable, message type %T is not refundable", msg)) } } diff --git a/x/ante/restricted_tx.go b/x/ante/restricted_tx.go index 2df598c1c..57dc5b432 100644 --- a/x/ante/restricted_tx.go +++ b/x/ante/restricted_tx.go @@ -24,17 +24,22 @@ func NewRestrictedTx(permission types.Permission) RestrictedTx { // AnteHandle fails if the signer is not authorized to send the transaction func (d RestrictedTx) AnteHandle(ctx sdk.Context, msgs []sdk.Msg, simulate bool, next MessageAnteHandler) (sdk.Context, error) { for _, msg := range msgs { - signer := msg.GetSigners()[0] - signerRole := d.permission.GetRole(ctx, signer) + signers := msg.GetSigners() + var signer sdk.AccAddress + + if len(signers) != 0 { + signer = signers[0] + } + signerRole := d.permission.GetRole(ctx, signer) switch permission.GetPermissionRole((msg).(descriptor.Message)) { case permission.ROLE_ACCESS_CONTROL: if permission.ROLE_ACCESS_CONTROL != signerRole { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s is not authorized to send transaction %T", signer, msg) + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "signer '%s' is not authorized to send transaction %T", signer, msg) } case permission.ROLE_CHAIN_MANAGEMENT: if permission.ROLE_CHAIN_MANAGEMENT != signerRole { - return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s is not authorized to send transaction %T", signer, msg) + return ctx, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "signer '%s' is not authorized to send transaction %T", signer, msg) } default: continue diff --git a/x/ante/restricted_tx_test.go b/x/ante/restricted_tx_test.go index 8772fc924..e15669da9 100644 --- a/x/ante/restricted_tx_test.go +++ b/x/ante/restricted_tx_test.go @@ -24,15 +24,18 @@ func TestRestrictedTx(t *testing.T) { handler sdk.AnteDecorator permission *mock.PermissionMock tx *mock.TxMock + signers []sdk.AccAddress ) signerAnyRole := func() { + signers = slices.Expand(func(_ int) sdk.AccAddress { return rand.AccAddr() }, int(rand.I64Between(1, 5))) permission.GetRoleFunc = func(sdk.Context, sdk.AccAddress) exported.Role { return exported.Role(rand.Of(maps.Keys(exported.Role_name)...)) } } signerIsNot := func(role exported.Role) func() { + signers = slices.Expand(func(_ int) sdk.AccAddress { return rand.AccAddr() }, int(rand.I64Between(1, 5))) return func() { permission.GetRoleFunc = func(sdk.Context, sdk.AccAddress) exported.Role { filtered := slices.Filter(maps.Keys(exported.Role_name), func(k int32) bool { return k != int32(role) }) @@ -41,6 +44,17 @@ func TestRestrictedTx(t *testing.T) { } } + noSigner := func() { + signers = []sdk.AccAddress{} + permission.GetRoleFunc = func(_ sdk.Context, addr sdk.AccAddress) exported.Role { + if len(addr) == 0 { + return exported.ROLE_UNRESTRICTED + } + + return exported.Role(rand.Of(maps.Keys(exported.Role_name)...)) + } + } + letTxThrough := func(t *testing.T) { _, err := handler.AnteHandle(sdk.Context{}, tx, false, func(sdk.Context, sdk.Tx, bool) (sdk.Context, error) { return sdk.Context{}, nil }) @@ -59,7 +73,7 @@ func TestRestrictedTx(t *testing.T) { return slices.Expand(func(_ int) sdk.Msg { return &mock.MsgMock{ GetSignersFunc: func() []sdk.AccAddress { - return slices.Expand(func(_ int) sdk.AccAddress { return rand.AccAddr() }, int(rand.I64Between(1, 5))) + return signers }, DescriptorFunc: msg.Descriptor, } @@ -93,5 +107,21 @@ func TestRestrictedTx(t *testing.T) { When("msg role is access control", msgRoleIsAccessControl). When("signer is not access control", signerIsNot(exported.ROLE_ACCESS_CONTROL)). Then("stop tx", stopTx), + + When("msg role is unrestricted", msgRoleIsUnrestricted). + When("there is no signer", noSigner). + Then("let the msg through", letTxThrough), + + When("msg role is unspecified", msgRoleIsUnspecified). + When("there is no signer", noSigner). + Then("let the msg through", letTxThrough), + + When("msg role is chain management", msgRoleIsChainManagement). + When("there is no signer", noSigner). + Then("stop tx", stopTx), + + When("msg role is access control", msgRoleIsAccessControl). + When("there is no signer", noSigner). + Then("stop tx", stopTx), ).Run(t, 20) } diff --git a/x/permission/keeper/keeper.go b/x/permission/keeper/keeper.go index f0004de2f..519bd19ef 100644 --- a/x/permission/keeper/keeper.go +++ b/x/permission/keeper/keeper.go @@ -67,6 +67,10 @@ func (k Keeper) GetGovernanceKey(ctx sdk.Context) (multisig.LegacyAminoPubKey, b // GetRole returns the role of the given account address func (k Keeper) GetRole(ctx sdk.Context, address sdk.AccAddress) exported.Role { + if address.Empty() { + return exported.ROLE_UNRESTRICTED + } + govAccount, ok := k.getGovAccount(ctx, address) if !ok { return exported.ROLE_UNRESTRICTED diff --git a/x/permission/keeper/keeper_test.go b/x/permission/keeper/keeper_test.go new file mode 100644 index 000000000..bdea767c1 --- /dev/null +++ b/x/permission/keeper/keeper_test.go @@ -0,0 +1,25 @@ +package keeper_test + +import ( + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + "github.com/stretchr/testify/assert" + "github.com/tendermint/tendermint/libs/log" + + "github.com/axelarnetwork/axelar-core/app" + "github.com/axelarnetwork/axelar-core/testutils/fake" + "github.com/axelarnetwork/axelar-core/x/permission/exported" + "github.com/axelarnetwork/axelar-core/x/permission/keeper" +) + +func TestKeeper_GetRole_nil_Address_Return_Unrestricted(t *testing.T) { + encCfg := app.MakeEncodingConfig() + key := sdk.NewKVStoreKey("permission") + subspace := paramstypes.NewSubspace(encCfg.Codec, encCfg.Amino, key, sdk.NewKVStoreKey("trewardKey"), "reward") + k := keeper.NewKeeper(encCfg.Codec, key, subspace) + + ctx := sdk.NewContext(fake.NewMultiStore(), sdk.Context{}.BlockHeader(), false, log.TestingLogger()) + assert.Equal(t, k.GetRole(ctx, nil), exported.ROLE_UNRESTRICTED) +}