diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ca0b3f5c99..c96b1c3fb23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Bug Fixes +* (runtime) [#17284](https://github.com/cosmos/cosmos-sdk/pull/17284) Properly allow to combine depinject-enabled modules and non-depinject-enabled modules in app v2. * (baseapp) [#17251](https://github.com/cosmos/cosmos-sdk/pull/17251) VerifyVoteExtensions and ExtendVote initialize their own contexts/states, allowing VerifyVoteExtensions being called without ExtendVote. * (x/auth) [#17209](https://github.com/cosmos/cosmos-sdk/pull/17209) Internal error on AccountInfo when account's public key is not set. * (baseapp) [#17159](https://github.com/cosmos/cosmos-sdk/pull/17159) Validators can propose blocks that exceed the gas limit. diff --git a/docs/docs/building-apps/01-app-go-v2.md b/docs/docs/building-apps/01-app-go-v2.md index 04754414826..00b69247181 100644 --- a/docs/docs/building-apps/01-app-go-v2.md +++ b/docs/docs/building-apps/01-app-go-v2.md @@ -118,6 +118,31 @@ More information on how work `depinject.Configs` and `depinject.Supply` can be f https://github.com/cosmos/cosmos-sdk/blob/v0.50.0-alpha.0/simapp/app_v2.go#L114-L146 ``` +### Registering non app wiring modules + +It is possible to combine app wiring / depinject enabled modules with non app wiring modules. +To do so, use the `app.RegisterModules` method to register the modules on your app, as well as `app.RegisterStores` for registering the extra stores needed. + +```go +// .... +app.App = appBuilder.Build(db, traceStore, baseAppOptions...) + +// register module manually +app.RegisterStores(storetypes.NewKVStoreKey(example.ModuleName)) +app.ExampleKeeper = examplekeeper.NewKeeper(app.appCodec, app.AccountKeeper.AddressCodec(), runtime.NewKVStoreService(app.GetKey(example.ModuleName)), authtypes.NewModuleAddress(govtypes.ModuleName).String()) +exampleAppModule := examplemodule.NewAppModule(app.ExampleKeeper) +if err := app.RegisterModules(&exampleAppModule); err != nil { + panic(err) +} + +// .... +``` + +:::warning +When using AutoCLI and combining app wiring and non app wiring modules. The AutoCLI options should be manually constructed instead of injected. +Otherwise it will miss the non depinject modules and not register their CLI. +::: + ### Complete `app_v2.go` :::tip diff --git a/runtime/app.go b/runtime/app.go index e1ed0da78c0..620b058a118 100644 --- a/runtime/app.go +++ b/runtime/app.go @@ -9,6 +9,7 @@ import ( runtimev1alpha1 "cosmossdk.io/api/cosmos/app/runtime/v1alpha1" appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1" + "cosmossdk.io/core/appmodule" "cosmossdk.io/log" storetypes "cosmossdk.io/store/types" @@ -75,7 +76,26 @@ func (a *App) RegisterModules(modules ...module.AppModule) error { appModule.RegisterInterfaces(a.interfaceRegistry) appModule.RegisterLegacyAminoCodec(a.amino) + if module, ok := appModule.(module.HasServices); ok { + module.RegisterServices(a.configurator) + } else if module, ok := appModule.(appmodule.HasServices); ok { + if err := module.RegisterServices(a.configurator); err != nil { + return err + } + } } + + return nil +} + +// RegisterStores registers the provided store keys. +// This method should only be used for registering extra stores +// wiich is necessary for modules that not registered using the app config. +// To be used in combination of RegisterModules. +func (a *App) RegisterStores(keys ...storetypes.StoreKey) error { + a.storeKeys = append(a.storeKeys, keys...) + a.MountStores(keys...) + return nil } diff --git a/runtime/module.go b/runtime/module.go index b544167dc02..7b3a54fc784 100644 --- a/runtime/module.go +++ b/runtime/module.go @@ -176,8 +176,7 @@ func ProvideInterfaceRegistry(addressCodec address.Codec, validatorAddressCodec return nil, err } - err = interfaceRegistry.SigningContext().Validate() - if err != nil { + if err := interfaceRegistry.SigningContext().Validate(); err != nil { return nil, err } diff --git a/scripts/init-simapp.sh b/scripts/init-simapp.sh index 5db89d2c506..9225e9b1245 100755 --- a/scripts/init-simapp.sh +++ b/scripts/init-simapp.sh @@ -7,6 +7,7 @@ echo "using $SIMD_BIN" if [ -d "$($SIMD_BIN config home)" ]; then rm -r $($SIMD_BIN config home); fi $SIMD_BIN config set client chain-id demo $SIMD_BIN config set client keyring-backend test +$SIMD_BIN config set app api.enable true $SIMD_BIN keys add alice $SIMD_BIN keys add bob $SIMD_BIN init test --chain-id demo