@@ -19,15 +19,14 @@ import (
19
19
"cosmossdk.io/core/event"
20
20
"cosmossdk.io/core/header"
21
21
"cosmossdk.io/core/registry"
22
- "cosmossdk.io/core/server"
23
22
"cosmossdk.io/core/store"
24
23
"cosmossdk.io/core/transaction"
25
24
"cosmossdk.io/depinject"
26
25
"cosmossdk.io/depinject/appconfig"
27
26
"cosmossdk.io/log"
28
27
"cosmossdk.io/runtime/v2/services"
29
28
"cosmossdk.io/server/v2/stf"
30
- rootstore "cosmossdk.io/store/v2/root"
29
+ "cosmossdk.io/store/v2/root"
31
30
)
32
31
33
32
var (
@@ -97,9 +96,9 @@ func init() {
97
96
appconfig .Register (& runtimev2.Module {},
98
97
appconfig .Provide (
99
98
ProvideAppBuilder [transaction .Tx ],
100
- ProvideEnvironment [transaction .Tx ],
101
99
ProvideModuleManager [transaction .Tx ],
102
- ProvideStoreBuilder ,
100
+ ProvideEnvironment ,
101
+ ProvideKVService ,
103
102
),
104
103
appconfig .Invoke (SetupAppBuilder ),
105
104
)
@@ -108,6 +107,7 @@ func init() {
108
107
func ProvideAppBuilder [T transaction.Tx ](
109
108
interfaceRegistrar registry.InterfaceRegistrar ,
110
109
amino registry.AminoRegistrar ,
110
+ storeBuilder root.Builder ,
111
111
) (
112
112
* AppBuilder [T ],
113
113
* stf.MsgRouterBuilder ,
@@ -127,15 +127,14 @@ func ProvideAppBuilder[T transaction.Tx](
127
127
128
128
msgRouterBuilder := stf .NewMsgRouterBuilder ()
129
129
app := & App [T ]{
130
- storeKeys : nil ,
131
130
interfaceRegistrar : interfaceRegistrar ,
132
131
amino : amino ,
133
132
msgRouterBuilder : msgRouterBuilder ,
134
133
queryRouterBuilder : stf .NewMsgRouterBuilder (), // TODO dedicated query router
135
134
QueryHandlers : map [string ]appmodulev2.Handler {},
136
135
storeLoader : DefaultStoreLoader ,
137
136
}
138
- appBuilder := & AppBuilder [T ]{app : app }
137
+ appBuilder := & AppBuilder [T ]{app : app , storeBuilder : storeBuilder }
139
138
140
139
return appBuilder , msgRouterBuilder , appModule [T ]{app }, protoFiles , protoTypes
141
140
}
@@ -149,12 +148,7 @@ type AppInputs struct {
149
148
InterfaceRegistrar registry.InterfaceRegistrar
150
149
LegacyAmino registry.AminoRegistrar
151
150
Logger log.Logger
152
- // StoreBuilder is a builder for a store/v2 RootStore satisfying the Store interface
153
- StoreBuilder * StoreBuilder
154
- // StoreOptions are required as input for the StoreBuilder. If not provided, the default options are used.
155
- StoreOptions * rootstore.Options `optional:"true"`
156
- // DynamicConfig can be nil in client wiring, but is required in server wiring.
157
- DynamicConfig server.DynamicConfig `optional:"true"`
151
+ StoreBuilder root.Builder
158
152
}
159
153
160
154
func SetupAppBuilder (inputs AppInputs ) {
@@ -164,24 +158,8 @@ func SetupAppBuilder(inputs AppInputs) {
164
158
app .moduleManager = inputs .ModuleManager
165
159
app .moduleManager .RegisterInterfaces (inputs .InterfaceRegistrar )
166
160
app .moduleManager .RegisterLegacyAminoCodec (inputs .LegacyAmino )
167
-
168
- if inputs .DynamicConfig == nil {
169
- return
170
- }
171
- storeOptions := rootstore .DefaultStoreOptions ()
172
- if inputs .StoreOptions != nil {
173
- storeOptions = * inputs .StoreOptions
174
- }
175
- var err error
176
- app .db , err = inputs .StoreBuilder .Build (
177
- inputs .Logger ,
178
- app .storeKeys ,
179
- inputs .DynamicConfig ,
180
- storeOptions ,
181
- )
182
- if err != nil {
183
- panic (err )
184
- }
161
+ // STF requires some state to run
162
+ inputs .StoreBuilder .RegisterKey ("stf" )
185
163
}
186
164
187
165
func ProvideModuleManager [T transaction.Tx ](
@@ -192,44 +170,47 @@ func ProvideModuleManager[T transaction.Tx](
192
170
return NewModuleManager [T ](logger , config , modules )
193
171
}
194
172
195
- // ProvideEnvironment provides the environment for keeper modules, while maintaining backward compatibility and provide services directly as well.
196
- func ProvideEnvironment [T transaction.Tx ](
197
- logger log.Logger ,
173
+ func ProvideKVService (
198
174
config * runtimev2.Module ,
199
175
key depinject.ModuleKey ,
200
- appBuilder * AppBuilder [T ],
201
176
kvFactory store.KVStoreServiceFactory ,
202
- headerService header.Service ,
203
- eventService event.Service ,
204
- ) (
205
- appmodulev2.Environment ,
206
- store.KVStoreService ,
207
- store.MemoryStoreService ,
208
- ) {
209
- var (
210
- kvService store.KVStoreService = failingStoreService {}
211
- memKvService store.MemoryStoreService = failingStoreService {}
212
- )
213
-
177
+ storeBuilder root.Builder ,
178
+ ) (store.KVStoreService , store.MemoryStoreService ) {
214
179
// skips modules that have no store
215
- if ! slices .Contains (config .SkipStoreKeys , key .Name ()) {
216
- var kvStoreKey string
217
- storeKeyOverride := storeKeyOverride (config , key .Name ())
218
- if storeKeyOverride != nil {
219
- kvStoreKey = storeKeyOverride .KvStoreKey
220
- } else {
221
- kvStoreKey = key .Name ()
222
- }
180
+ if slices .Contains (config .SkipStoreKeys , key .Name ()) {
181
+ return & failingStoreService {}, & failingStoreService {}
182
+ }
183
+ var kvStoreKey string
184
+ override := storeKeyOverride (config , key .Name ())
185
+ if override != nil {
186
+ kvStoreKey = override .KvStoreKey
187
+ } else {
188
+ kvStoreKey = key .Name ()
189
+ }
223
190
224
- registerStoreKey (appBuilder , kvStoreKey )
225
- kvService = kvFactory ([]byte (kvStoreKey ))
191
+ storeBuilder .RegisterKey (kvStoreKey )
192
+ return kvFactory ([]byte (kvStoreKey )), stf .NewMemoryStoreService ([]byte (fmt .Sprintf ("memory:%s" , kvStoreKey )))
193
+ }
226
194
227
- memStoreKey := fmt .Sprintf ("memory:%s" , key .Name ())
228
- registerStoreKey (appBuilder , memStoreKey )
229
- memKvService = stf .NewMemoryStoreService ([]byte (memStoreKey ))
195
+ func storeKeyOverride (config * runtimev2.Module , moduleName string ) * runtimev2.StoreKeyConfig {
196
+ for _ , cfg := range config .OverrideStoreKeys {
197
+ if cfg .ModuleName == moduleName {
198
+ return cfg
199
+ }
230
200
}
201
+ return nil
202
+ }
231
203
232
- env := appmodulev2.Environment {
204
+ // ProvideEnvironment provides the environment for keeper modules, while maintaining backward compatibility and provide services directly as well.
205
+ func ProvideEnvironment (
206
+ logger log.Logger ,
207
+ key depinject.ModuleKey ,
208
+ kvService store.KVStoreService ,
209
+ memKvService store.MemoryStoreService ,
210
+ headerService header.Service ,
211
+ eventService event.Service ,
212
+ ) appmodulev2.Environment {
213
+ return appmodulev2.Environment {
233
214
Logger : logger ,
234
215
BranchService : stf.BranchService {},
235
216
EventService : eventService ,
@@ -241,28 +222,13 @@ func ProvideEnvironment[T transaction.Tx](
241
222
KVStoreService : kvService ,
242
223
MemStoreService : memKvService ,
243
224
}
244
-
245
- return env , kvService , memKvService
246
- }
247
-
248
- func registerStoreKey [T transaction.Tx ](builder * AppBuilder [T ], key string ) {
249
- builder .app .storeKeys = append (builder .app .storeKeys , key )
250
- }
251
-
252
- func storeKeyOverride (config * runtimev2.Module , moduleName string ) * runtimev2.StoreKeyConfig {
253
- for _ , cfg := range config .OverrideStoreKeys {
254
- if cfg .ModuleName == moduleName {
255
- return cfg
256
- }
257
- }
258
-
259
- return nil
260
225
}
261
226
262
227
// DefaultServiceBindings provides default services for the following service interfaces:
263
228
// - store.KVStoreServiceFactory
264
229
// - header.Service
265
230
// - comet.Service
231
+ // - event.Service
266
232
//
267
233
// They are all required. For most use cases these default services bindings should be sufficient.
268
234
// Power users (or tests) may wish to provide their own services bindings, in which case they must
0 commit comments