chore: remove runtime/v2 from release/v0.52.x (#21148)
Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
parent
7c24d56743
commit
776df21de8
@ -16,7 +16,6 @@ use (
|
||||
./simapp
|
||||
./tests
|
||||
./tests/systemtests
|
||||
./runtime/v2
|
||||
./tools/cosmovisor
|
||||
./tools/confix
|
||||
./tools/hubl
|
||||
|
||||
@ -1,123 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
gogoproto "github.com/cosmos/gogoproto/proto"
|
||||
"golang.org/x/exp/slices"
|
||||
|
||||
runtimev2 "cosmossdk.io/api/cosmos/app/runtime/v2"
|
||||
"cosmossdk.io/core/legacy"
|
||||
"cosmossdk.io/core/registry"
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/log"
|
||||
"cosmossdk.io/server/v2/appmanager"
|
||||
"cosmossdk.io/server/v2/stf"
|
||||
)
|
||||
|
||||
// App is a wrapper around AppManager and ModuleManager that can be used in hybrid
|
||||
// app.go/app config scenarios or directly as a servertypes.Application instance.
|
||||
// To get an instance of *App, *AppBuilder must be requested as a dependency
|
||||
// in a container which declares the runtime module and the AppBuilder.Build()
|
||||
// method must be called.
|
||||
//
|
||||
// App can be used to create a hybrid app.go setup where some configuration is
|
||||
// done declaratively with an app config and the rest of it is done the old way.
|
||||
// See simapp/app_v2.go for an example of this setup.
|
||||
type App[T transaction.Tx] struct {
|
||||
*appmanager.AppManager[T]
|
||||
|
||||
// app manager dependencies
|
||||
stf *stf.STF[T]
|
||||
msgRouterBuilder *stf.MsgRouterBuilder
|
||||
queryRouterBuilder *stf.MsgRouterBuilder
|
||||
db Store
|
||||
|
||||
// app configuration
|
||||
logger log.Logger
|
||||
config *runtimev2.Module
|
||||
|
||||
// modules configuration
|
||||
storeKeys []string
|
||||
interfaceRegistrar registry.InterfaceRegistrar
|
||||
amino legacy.Amino
|
||||
moduleManager *MM[T]
|
||||
|
||||
// GRPCMethodsToMessageMap maps gRPC method name to a function that decodes the request
|
||||
// bytes into a gogoproto.Message, which then can be passed to appmanager.
|
||||
GRPCMethodsToMessageMap map[string]func() gogoproto.Message
|
||||
}
|
||||
|
||||
// Name returns the app name.
|
||||
func (a *App[T]) Name() string {
|
||||
return a.config.AppName
|
||||
}
|
||||
|
||||
// Logger returns the app logger.
|
||||
func (a *App[T]) Logger() log.Logger {
|
||||
return a.logger
|
||||
}
|
||||
|
||||
// ModuleManager returns the module manager.
|
||||
func (a *App[T]) ModuleManager() *MM[T] {
|
||||
return a.moduleManager
|
||||
}
|
||||
|
||||
// DefaultGenesis returns a default genesis from the registered modules.
|
||||
func (a *App[T]) DefaultGenesis() map[string]json.RawMessage {
|
||||
return a.moduleManager.DefaultGenesis()
|
||||
}
|
||||
|
||||
// LoadLatest loads the latest version.
|
||||
func (a *App[T]) LoadLatest() error {
|
||||
return a.db.LoadLatestVersion()
|
||||
}
|
||||
|
||||
// LoadHeight loads a particular height
|
||||
func (a *App[T]) LoadHeight(height uint64) error {
|
||||
return a.db.LoadVersion(height)
|
||||
}
|
||||
|
||||
// Close is called in start cmd to gracefully cleanup resources.
|
||||
func (a *App[T]) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetStoreKeys returns all the app store keys.
|
||||
func (a *App[T]) GetStoreKeys() []string {
|
||||
return a.storeKeys
|
||||
}
|
||||
|
||||
// UnsafeFindStoreKey fetches a registered StoreKey from the App in linear time.
|
||||
// NOTE: This should only be used in testing.
|
||||
func (a *App[T]) UnsafeFindStoreKey(storeKey string) (string, error) {
|
||||
i := slices.IndexFunc(a.storeKeys, func(s string) bool { return s == storeKey })
|
||||
if i == -1 {
|
||||
return "", errors.New("store key not found")
|
||||
}
|
||||
|
||||
return a.storeKeys[i], nil
|
||||
}
|
||||
|
||||
// GetStore returns the app store.
|
||||
func (a *App[T]) GetStore() Store {
|
||||
return a.db
|
||||
}
|
||||
|
||||
// GetLogger returns the app logger.
|
||||
func (a *App[T]) GetLogger() log.Logger {
|
||||
return a.logger
|
||||
}
|
||||
|
||||
func (a *App[T]) ExecuteGenesisTx(_ []byte) error {
|
||||
panic("App.ExecuteGenesisTx not supported in runtime/v2")
|
||||
}
|
||||
|
||||
func (a *App[T]) GetAppManager() *appmanager.AppManager[T] {
|
||||
return a.AppManager
|
||||
}
|
||||
|
||||
func (a *App[T]) GetGPRCMethodsToMessageMap() map[string]func() gogoproto.Message {
|
||||
return a.GRPCMethodsToMessageMap
|
||||
}
|
||||
@ -1,219 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"cosmossdk.io/core/appmodule"
|
||||
appmodulev2 "cosmossdk.io/core/appmodule/v2"
|
||||
"cosmossdk.io/core/store"
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/server/v2/appmanager"
|
||||
"cosmossdk.io/server/v2/stf"
|
||||
"cosmossdk.io/server/v2/stf/branch"
|
||||
"cosmossdk.io/store/v2/db"
|
||||
rootstore "cosmossdk.io/store/v2/root"
|
||||
)
|
||||
|
||||
// AppBuilder is a type that is injected into a container by the runtime/v2 module
|
||||
// (as *AppBuilder) which can be used to create an app which is compatible with
|
||||
// the existing app.go initialization conventions.
|
||||
type AppBuilder[T transaction.Tx] struct {
|
||||
app *App[T]
|
||||
storeOptions *rootstore.FactoryOptions
|
||||
viper *viper.Viper
|
||||
|
||||
// the following fields are used to overwrite the default
|
||||
branch func(state store.ReaderMap) store.WriterMap
|
||||
txValidator func(ctx context.Context, tx T) error
|
||||
postTxExec func(ctx context.Context, tx T, success bool) error
|
||||
}
|
||||
|
||||
// DefaultGenesis returns a default genesis from the registered AppModule's.
|
||||
func (a *AppBuilder[T]) DefaultGenesis() map[string]json.RawMessage {
|
||||
return a.app.moduleManager.DefaultGenesis()
|
||||
}
|
||||
|
||||
// RegisterModules registers the provided modules with the module manager.
|
||||
// This is the primary hook for integrating with modules which are not registered using the app config.
|
||||
func (a *AppBuilder[T]) RegisterModules(modules map[string]appmodulev2.AppModule) error {
|
||||
for name, appModule := range modules {
|
||||
// if a (legacy) module implements the HasName interface, check that the name matches
|
||||
if mod, ok := appModule.(interface{ Name() string }); ok {
|
||||
if name != mod.Name() {
|
||||
a.app.logger.Warn(fmt.Sprintf("module name %q does not match name returned by HasName: %q", name, mod.Name()))
|
||||
}
|
||||
}
|
||||
|
||||
if _, ok := a.app.moduleManager.modules[name]; ok {
|
||||
return fmt.Errorf("module named %q already exists", name)
|
||||
}
|
||||
a.app.moduleManager.modules[name] = appModule
|
||||
|
||||
if mod, ok := appModule.(appmodulev2.HasRegisterInterfaces); ok {
|
||||
mod.RegisterInterfaces(a.app.interfaceRegistrar)
|
||||
}
|
||||
|
||||
if mod, ok := appModule.(appmodule.HasAminoCodec); ok {
|
||||
mod.RegisterLegacyAminoCodec(a.app.amino)
|
||||
}
|
||||
}
|
||||
|
||||
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 *AppBuilder[T]) RegisterStores(keys ...string) {
|
||||
a.app.storeKeys = append(a.app.storeKeys, keys...)
|
||||
if a.storeOptions != nil {
|
||||
a.storeOptions.StoreKeys = append(a.storeOptions.StoreKeys, keys...)
|
||||
}
|
||||
}
|
||||
|
||||
// Build builds an *App instance.
|
||||
func (a *AppBuilder[T]) Build(opts ...AppBuilderOption[T]) (*App[T], error) {
|
||||
for _, opt := range opts {
|
||||
opt(a)
|
||||
}
|
||||
|
||||
// default branch
|
||||
if a.branch == nil {
|
||||
a.branch = branch.DefaultNewWriterMap
|
||||
}
|
||||
|
||||
// default tx validator
|
||||
if a.txValidator == nil {
|
||||
a.txValidator = a.app.moduleManager.TxValidators()
|
||||
}
|
||||
|
||||
// default post tx exec
|
||||
if a.postTxExec == nil {
|
||||
a.postTxExec = func(ctx context.Context, tx T, success bool) error {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
if err := a.app.moduleManager.RegisterServices(a.app); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
endBlocker, valUpdate := a.app.moduleManager.EndBlock()
|
||||
|
||||
stf, err := stf.NewSTF[T](
|
||||
a.app.logger.With("module", "stf"),
|
||||
a.app.msgRouterBuilder,
|
||||
a.app.queryRouterBuilder,
|
||||
a.app.moduleManager.PreBlocker(),
|
||||
a.app.moduleManager.BeginBlock(),
|
||||
endBlocker,
|
||||
a.txValidator,
|
||||
valUpdate,
|
||||
a.postTxExec,
|
||||
a.branch,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create STF: %w", err)
|
||||
}
|
||||
a.app.stf = stf
|
||||
|
||||
v := a.viper
|
||||
home := v.GetString(FlagHome)
|
||||
|
||||
storeOpts := rootstore.DefaultStoreOptions()
|
||||
if s := v.Sub("store.options"); s != nil {
|
||||
if err := s.Unmarshal(&storeOpts); err != nil {
|
||||
return nil, fmt.Errorf("failed to store options: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
scRawDb, err := db.NewDB(db.DBType(v.GetString("store.app-db-backend")), "application", filepath.Join(home, "data"), nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
storeOptions := &rootstore.FactoryOptions{
|
||||
Logger: a.app.logger,
|
||||
RootDir: home,
|
||||
Options: storeOpts,
|
||||
StoreKeys: append(a.app.storeKeys, "stf"),
|
||||
SCRawDB: scRawDb,
|
||||
}
|
||||
a.storeOptions = storeOptions
|
||||
|
||||
rs, err := rootstore.CreateRootStore(a.storeOptions)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create root store: %w", err)
|
||||
}
|
||||
a.app.db = rs
|
||||
|
||||
appManagerBuilder := appmanager.Builder[T]{
|
||||
STF: a.app.stf,
|
||||
DB: a.app.db,
|
||||
ValidateTxGasLimit: a.app.config.GasConfig.ValidateTxGasLimit,
|
||||
QueryGasLimit: a.app.config.GasConfig.QueryGasLimit,
|
||||
SimulationGasLimit: a.app.config.GasConfig.SimulationGasLimit,
|
||||
InitGenesis: func(ctx context.Context, src io.Reader, txHandler func(json.RawMessage) error) error {
|
||||
// this implementation assumes that the state is a JSON object
|
||||
bz, err := io.ReadAll(src)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read import state: %w", err)
|
||||
}
|
||||
var genesisState map[string]json.RawMessage
|
||||
if err = json.Unmarshal(bz, &genesisState); err != nil {
|
||||
return err
|
||||
}
|
||||
if err = a.app.moduleManager.InitGenesisJSON(ctx, genesisState, txHandler); err != nil {
|
||||
return fmt.Errorf("failed to init genesis: %w", err)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
}
|
||||
|
||||
appManager, err := appManagerBuilder.Build()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to build app manager: %w", err)
|
||||
}
|
||||
a.app.AppManager = appManager
|
||||
|
||||
return a.app, nil
|
||||
}
|
||||
|
||||
// AppBuilderOption is a function that can be passed to AppBuilder.Build to customize the resulting app.
|
||||
type AppBuilderOption[T transaction.Tx] func(*AppBuilder[T])
|
||||
|
||||
// AppBuilderWithBranch sets a custom branch implementation for the app.
|
||||
func AppBuilderWithBranch[T transaction.Tx](branch func(state store.ReaderMap) store.WriterMap) AppBuilderOption[T] {
|
||||
return func(a *AppBuilder[T]) {
|
||||
a.branch = branch
|
||||
}
|
||||
}
|
||||
|
||||
// AppBuilderWithTxValidator sets the tx validator for the app.
|
||||
// It overrides all default tx validators defined by modules.
|
||||
func AppBuilderWithTxValidator[T transaction.Tx](txValidators func(ctx context.Context, tx T) error) AppBuilderOption[T] {
|
||||
return func(a *AppBuilder[T]) {
|
||||
a.txValidator = txValidators
|
||||
}
|
||||
}
|
||||
|
||||
// AppBuilderWithPostTxExec sets logic that will be executed after each transaction.
|
||||
// When not provided, a no-op function will be used.
|
||||
func AppBuilderWithPostTxExec[T transaction.Tx](
|
||||
postTxExec func(
|
||||
ctx context.Context,
|
||||
tx T,
|
||||
success bool,
|
||||
) error,
|
||||
) AppBuilderOption[T] {
|
||||
return func(a *AppBuilder[T]) {
|
||||
a.postTxExec = postTxExec
|
||||
}
|
||||
}
|
||||
@ -1,107 +0,0 @@
|
||||
module cosmossdk.io/runtime/v2
|
||||
|
||||
go 1.22.2
|
||||
|
||||
// server v2 integration
|
||||
replace (
|
||||
cosmossdk.io/api => ../../api
|
||||
cosmossdk.io/core => ../../core
|
||||
cosmossdk.io/core/testing => ../../core/testing
|
||||
cosmossdk.io/x/accounts => ../../x/accounts
|
||||
cosmossdk.io/x/auth => ../../x/auth
|
||||
cosmossdk.io/x/bank => ../../x/bank
|
||||
cosmossdk.io/x/consensus => ../../x/consensus
|
||||
cosmossdk.io/x/distribution => ../../x/distribution
|
||||
cosmossdk.io/x/staking => ../../x/staking
|
||||
cosmossdk.io/x/tx => ../../x/tx
|
||||
github.com/cosmos/cosmos-sdk => ../..
|
||||
)
|
||||
|
||||
require (
|
||||
cosmossdk.io/api v0.7.5
|
||||
cosmossdk.io/core v0.12.1-0.20231114100755-569e3ff6a0d7
|
||||
cosmossdk.io/depinject v1.0.0
|
||||
cosmossdk.io/log v1.3.1
|
||||
cosmossdk.io/server/v2/appmanager v0.0.0-20240731205446-aee9803a0af6 // main
|
||||
cosmossdk.io/server/v2/stf v0.0.0-20240731205446-aee9803a0af6 // main
|
||||
cosmossdk.io/store/v2 v2.0.0-20240731205446-aee9803a0af6 // main
|
||||
cosmossdk.io/x/tx v0.13.3
|
||||
github.com/cosmos/gogoproto v1.5.0
|
||||
github.com/spf13/viper v1.19.0
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc
|
||||
google.golang.org/grpc v1.64.1
|
||||
google.golang.org/protobuf v1.34.2
|
||||
)
|
||||
|
||||
require (
|
||||
buf.build/gen/go/cometbft/cometbft/protocolbuffers/go v1.34.2-20240701160653-fedbb9acfd2f.2 // indirect
|
||||
buf.build/gen/go/cosmos/gogo-proto/protocolbuffers/go v1.34.2-20240130113600-88ef6483f90f.2 // indirect
|
||||
cosmossdk.io/core/testing v0.0.0-00010101000000-000000000000 // indirect
|
||||
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 // indirect
|
||||
github.com/DataDog/zstd v1.5.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cockroachdb/errors v1.11.1 // indirect
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
|
||||
github.com/cockroachdb/pebble v1.1.0 // indirect
|
||||
github.com/cockroachdb/redact v1.1.5 // indirect
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
|
||||
github.com/cosmos/cosmos-db v1.0.2 // indirect
|
||||
github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect
|
||||
github.com/cosmos/iavl v1.2.1-0.20240725141113-7adc688cf179 // indirect
|
||||
github.com/cosmos/ics23/go v0.10.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/emicklei/dot v1.6.2 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/getsentry/sentry-go v0.27.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/btree v1.1.2 // indirect
|
||||
github.com/google/go-cmp v0.6.0 // indirect
|
||||
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||
github.com/hashicorp/go-metrics v0.5.3 // indirect
|
||||
github.com/hashicorp/golang-lru v1.0.2 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/klauspost/compress v1.17.8 // indirect
|
||||
github.com/kr/pretty v0.3.1 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/linxGnu/grocksdb v1.8.14 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/onsi/gomega v1.28.1 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/prometheus/client_golang v1.19.1 // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.55.0 // indirect
|
||||
github.com/prometheus/procfs v0.15.1 // indirect
|
||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||
github.com/rs/zerolog v1.33.0 // indirect
|
||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.11.0 // indirect
|
||||
github.com/spf13/cast v1.6.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/stretchr/testify v1.9.0 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
|
||||
github.com/tendermint/go-amino v0.16.0 // indirect
|
||||
github.com/tidwall/btree v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.25.0 // indirect
|
||||
golang.org/x/net v0.27.0 // indirect
|
||||
golang.org/x/sync v0.7.0 // indirect
|
||||
golang.org/x/sys v0.22.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240709173604-40e1e62336c5 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
sigs.k8s.io/yaml v1.4.0 // indirect
|
||||
)
|
||||
@ -1,386 +0,0 @@
|
||||
buf.build/gen/go/cometbft/cometbft/protocolbuffers/go v1.34.2-20240701160653-fedbb9acfd2f.2 h1:90/4O5QkHb8EZdA2SAhueRzYw6u5ZHCPKtReFqshnTY=
|
||||
buf.build/gen/go/cometbft/cometbft/protocolbuffers/go v1.34.2-20240701160653-fedbb9acfd2f.2/go.mod h1:1+3gJj2NvZ1mTLAtHu+lMhOjGgQPiCKCeo+9MBww0Eo=
|
||||
buf.build/gen/go/cosmos/gogo-proto/protocolbuffers/go v1.34.2-20240130113600-88ef6483f90f.2 h1:b7EEYTUHmWSBEyISHlHvXbJPqtKiHRuUignL1tsHnNQ=
|
||||
buf.build/gen/go/cosmos/gogo-proto/protocolbuffers/go v1.34.2-20240130113600-88ef6483f90f.2/go.mod h1:HqcXMSa5qnNuakaMUo+hWhF51mKbcrZxGl9Vp5EeJXc=
|
||||
cosmossdk.io/depinject v1.0.0 h1:dQaTu6+O6askNXO06+jyeUAnF2/ssKwrrszP9t5q050=
|
||||
cosmossdk.io/depinject v1.0.0/go.mod h1:zxK/h3HgHoA/eJVtiSsoaRaRA2D5U4cJ5thIG4ssbB8=
|
||||
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5 h1:IQNdY2kB+k+1OM2DvqFG1+UgeU1JzZrWtwuWzI3ZfwA=
|
||||
cosmossdk.io/errors/v2 v2.0.0-20240731132947-df72853b3ca5/go.mod h1:0CuYKkFHxc1vw2JC+t21THBCALJVROrWVR/3PQ1urpc=
|
||||
cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI=
|
||||
cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM=
|
||||
cosmossdk.io/server/v2/appmanager v0.0.0-20240731205446-aee9803a0af6 h1:vrHmVjfEjEwQh90dim272gYq7OFILg4Yrv3XzreMpe4=
|
||||
cosmossdk.io/server/v2/appmanager v0.0.0-20240731205446-aee9803a0af6/go.mod h1:Xm5IOSjw45Sew7fiVckaTCIU5oQPs20V+54NOqR3H4o=
|
||||
cosmossdk.io/server/v2/stf v0.0.0-20240731205446-aee9803a0af6 h1:F8yfqCf1cAwuZZnIxinmzr/2nmLjhK9K/BJfBjW3nJ0=
|
||||
cosmossdk.io/server/v2/stf v0.0.0-20240731205446-aee9803a0af6/go.mod h1:IUbZp79IZ4NCR2eNXA0utcQOS8lz34BvsAWTeCGwGAM=
|
||||
cosmossdk.io/store/v2 v2.0.0-20240731205446-aee9803a0af6 h1:/ffIfMKzoCVUI38t5Vq3BNW9U8exRMxK5QgS/ujn0lA=
|
||||
cosmossdk.io/store/v2 v2.0.0-20240731205446-aee9803a0af6/go.mod h1:aG3brMLcldPsdhfkdCaisGDIe+tXTNWdUDt5JYsRDl8=
|
||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
|
||||
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
|
||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
|
||||
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4=
|
||||
github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
|
||||
github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8=
|
||||
github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
|
||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
|
||||
github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4=
|
||||
github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E=
|
||||
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
|
||||
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
|
||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
|
||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||
github.com/cosmos/cosmos-db v1.0.2 h1:hwMjozuY1OlJs/uh6vddqnk9j7VamLv+0DBlbEXbAKs=
|
||||
github.com/cosmos/cosmos-db v1.0.2/go.mod h1:Z8IXcFJ9PqKK6BIsVOB3QXtkKoqUOp1vRvPT39kOXEA=
|
||||
github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA=
|
||||
github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec=
|
||||
github.com/cosmos/gogoproto v1.5.0 h1:SDVwzEqZDDBoslaeZg+dGE55hdzHfgUA40pEanMh52o=
|
||||
github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I=
|
||||
github.com/cosmos/iavl v1.2.1-0.20240725141113-7adc688cf179 h1:wmwDn7V3RodN9auB3FooSQxs46nHVE3u0mb87TJkZFE=
|
||||
github.com/cosmos/iavl v1.2.1-0.20240725141113-7adc688cf179/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw=
|
||||
github.com/cosmos/ics23/go v0.10.0 h1:iXqLLgp2Lp+EdpIuwXTYIQU+AiHj9mOC2X9ab++bZDM=
|
||||
github.com/cosmos/ics23/go v0.10.0/go.mod h1:ZfJSmng/TBNTBkFemHHHj5YY7VAU/MBU980F4VU1NG0=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A=
|
||||
github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s=
|
||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
|
||||
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
|
||||
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
|
||||
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
|
||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0=
|
||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
|
||||
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
|
||||
github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
|
||||
github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE=
|
||||
github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE=
|
||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
|
||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE=
|
||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
|
||||
github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU=
|
||||
github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ=
|
||||
github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA=
|
||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
|
||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
|
||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
|
||||
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
||||
github.com/onsi/gomega v1.28.1 h1:MijcGUbfYuznzK/5R4CPNoUP/9Xvuo20sXfEm6XxoTA=
|
||||
github.com/onsi/gomega v1.28.1/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
|
||||
github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
|
||||
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
|
||||
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
|
||||
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
|
||||
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
|
||||
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
|
||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
|
||||
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
||||
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
|
||||
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
|
||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
|
||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
|
||||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
|
||||
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
|
||||
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
|
||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
|
||||
github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E=
|
||||
github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME=
|
||||
github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI=
|
||||
github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
|
||||
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg=
|
||||
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
|
||||
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
|
||||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||
google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240709173604-40e1e62336c5 h1:SbSDUWW1PAO24TNpLdeheoYPd7kllICcLU52x6eD4kQ=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240709173604-40e1e62336c5/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
|
||||
google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=
|
||||
google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
|
||||
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
|
||||
@ -1,712 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"sort"
|
||||
|
||||
gogoproto "github.com/cosmos/gogoproto/proto"
|
||||
"golang.org/x/exp/maps"
|
||||
"google.golang.org/grpc"
|
||||
proto "google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
|
||||
runtimev2 "cosmossdk.io/api/cosmos/app/runtime/v2"
|
||||
cosmosmsg "cosmossdk.io/api/cosmos/msg/v1"
|
||||
"cosmossdk.io/core/appmodule"
|
||||
appmodulev2 "cosmossdk.io/core/appmodule/v2"
|
||||
"cosmossdk.io/core/legacy"
|
||||
"cosmossdk.io/core/registry"
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/log"
|
||||
"cosmossdk.io/server/v2/stf"
|
||||
)
|
||||
|
||||
type MM[T transaction.Tx] struct {
|
||||
logger log.Logger
|
||||
config *runtimev2.Module
|
||||
modules map[string]appmodulev2.AppModule
|
||||
migrationRegistrar *migrationRegistrar
|
||||
}
|
||||
|
||||
// NewModuleManager is the constructor for the module manager
|
||||
// It handles all the interactions between the modules and the application
|
||||
func NewModuleManager[T transaction.Tx](
|
||||
logger log.Logger,
|
||||
config *runtimev2.Module,
|
||||
modules map[string]appmodulev2.AppModule,
|
||||
) *MM[T] {
|
||||
// good defaults for the module manager order
|
||||
modulesName := maps.Keys(modules)
|
||||
if len(config.PreBlockers) == 0 {
|
||||
config.PreBlockers = modulesName
|
||||
}
|
||||
if len(config.BeginBlockers) == 0 {
|
||||
config.BeginBlockers = modulesName
|
||||
}
|
||||
if len(config.EndBlockers) == 0 {
|
||||
config.EndBlockers = modulesName
|
||||
}
|
||||
if len(config.TxValidators) == 0 {
|
||||
config.TxValidators = modulesName
|
||||
}
|
||||
if len(config.InitGenesis) == 0 {
|
||||
config.InitGenesis = modulesName
|
||||
}
|
||||
if len(config.ExportGenesis) == 0 {
|
||||
config.ExportGenesis = modulesName
|
||||
}
|
||||
if len(config.OrderMigrations) == 0 {
|
||||
config.OrderMigrations = defaultMigrationsOrder(modulesName)
|
||||
}
|
||||
|
||||
mm := &MM[T]{
|
||||
logger: logger,
|
||||
config: config,
|
||||
modules: modules,
|
||||
migrationRegistrar: newMigrationRegistrar(),
|
||||
}
|
||||
|
||||
if err := mm.validateConfig(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return mm
|
||||
}
|
||||
|
||||
// Modules returns the modules registered in the module manager
|
||||
func (m *MM[T]) Modules() map[string]appmodulev2.AppModule {
|
||||
return m.modules
|
||||
}
|
||||
|
||||
// RegisterLegacyAminoCodec registers all module codecs
|
||||
func (m *MM[T]) RegisterLegacyAminoCodec(cdc legacy.Amino) {
|
||||
for _, b := range m.modules {
|
||||
if mod, ok := b.(appmodule.HasAminoCodec); ok {
|
||||
mod.RegisterLegacyAminoCodec(cdc)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// RegisterInterfaces registers all module interface types
|
||||
func (m *MM[T]) RegisterInterfaces(registry registry.InterfaceRegistrar) {
|
||||
for _, b := range m.modules {
|
||||
if mod, ok := b.(appmodulev2.HasRegisterInterfaces); ok {
|
||||
mod.RegisterInterfaces(registry)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DefaultGenesis provides default genesis information for all modules
|
||||
func (m *MM[T]) DefaultGenesis() map[string]json.RawMessage {
|
||||
genesisData := make(map[string]json.RawMessage)
|
||||
for name, b := range m.modules {
|
||||
if mod, ok := b.(appmodule.HasGenesisBasics); ok {
|
||||
genesisData[name] = mod.DefaultGenesis()
|
||||
} else if mod, ok := b.(appmodulev2.HasGenesis); ok {
|
||||
genesisData[name] = mod.DefaultGenesis()
|
||||
} else {
|
||||
genesisData[name] = []byte("{}")
|
||||
}
|
||||
}
|
||||
|
||||
return genesisData
|
||||
}
|
||||
|
||||
// ValidateGenesis performs genesis state validation for all modules
|
||||
func (m *MM[T]) ValidateGenesis(genesisData map[string]json.RawMessage) error {
|
||||
for name, b := range m.modules {
|
||||
if mod, ok := b.(appmodule.HasGenesisBasics); ok {
|
||||
if err := mod.ValidateGenesis(genesisData[name]); err != nil {
|
||||
return err
|
||||
}
|
||||
} else if mod, ok := b.(appmodulev2.HasGenesis); ok {
|
||||
if err := mod.ValidateGenesis(genesisData[name]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// InitGenesisJSON performs init genesis functionality for modules from genesis data in JSON format
|
||||
func (m *MM[T]) InitGenesisJSON(
|
||||
ctx context.Context,
|
||||
genesisData map[string]json.RawMessage,
|
||||
txHandler func(json.RawMessage) error,
|
||||
) error {
|
||||
m.logger.Info("initializing blockchain state from genesis.json", "order", m.config.InitGenesis)
|
||||
var seenValUpdates bool
|
||||
for _, moduleName := range m.config.InitGenesis {
|
||||
if genesisData[moduleName] == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
mod := m.modules[moduleName]
|
||||
|
||||
// we might get an adapted module, a native core API module or a legacy module
|
||||
switch module := mod.(type) {
|
||||
case appmodule.HasGenesisAuto:
|
||||
panic(fmt.Sprintf("module %s isn't server/v2 compatible", moduleName))
|
||||
case appmodulev2.GenesisDecoder:
|
||||
genTxs, err := module.DecodeGenesisJSON(genesisData[moduleName])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, jsonTx := range genTxs {
|
||||
if err := txHandler(jsonTx); err != nil {
|
||||
return fmt.Errorf("failed to handle genesis transaction: %w", err)
|
||||
}
|
||||
}
|
||||
case appmodulev2.HasGenesis:
|
||||
m.logger.Debug("running initialization for module", "module", moduleName)
|
||||
if err := module.InitGenesis(ctx, genesisData[moduleName]); err != nil {
|
||||
return fmt.Errorf("init module %s: %w", moduleName, err)
|
||||
}
|
||||
case appmodulev2.HasABCIGenesis:
|
||||
m.logger.Debug("running initialization for module", "module", moduleName)
|
||||
moduleValUpdates, err := module.InitGenesis(ctx, genesisData[moduleName])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// use these validator updates if provided, the module manager assumes
|
||||
// only one module will update the validator set
|
||||
if len(moduleValUpdates) > 0 {
|
||||
if seenValUpdates {
|
||||
return fmt.Errorf("validator InitGenesis updates already set by a previous module: current module %s", moduleName)
|
||||
} else {
|
||||
seenValUpdates = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExportGenesisForModules performs export genesis functionality for modules
|
||||
func (m *MM[T]) ExportGenesisForModules(
|
||||
ctx context.Context,
|
||||
modulesToExport ...string,
|
||||
) (map[string]json.RawMessage, error) {
|
||||
if len(modulesToExport) == 0 {
|
||||
modulesToExport = m.config.ExportGenesis
|
||||
}
|
||||
// verify modules exists in app, so that we don't panic in the middle of an export
|
||||
if err := m.checkModulesExists(modulesToExport); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
type genesisResult struct {
|
||||
bz json.RawMessage
|
||||
err error
|
||||
}
|
||||
|
||||
type ModuleI interface {
|
||||
ExportGenesis(ctx context.Context) (json.RawMessage, error)
|
||||
}
|
||||
|
||||
channels := make(map[string]chan genesisResult)
|
||||
for _, moduleName := range modulesToExport {
|
||||
mod := m.modules[moduleName]
|
||||
var moduleI ModuleI
|
||||
|
||||
if module, hasGenesis := mod.(appmodulev2.HasGenesis); hasGenesis {
|
||||
moduleI = module.(ModuleI)
|
||||
} else if module, hasABCIGenesis := mod.(appmodulev2.HasGenesis); hasABCIGenesis {
|
||||
moduleI = module.(ModuleI)
|
||||
}
|
||||
|
||||
channels[moduleName] = make(chan genesisResult)
|
||||
go func(moduleI ModuleI, ch chan genesisResult) {
|
||||
jm, err := moduleI.ExportGenesis(ctx)
|
||||
if err != nil {
|
||||
ch <- genesisResult{nil, err}
|
||||
return
|
||||
}
|
||||
ch <- genesisResult{jm, nil}
|
||||
}(moduleI, channels[moduleName])
|
||||
}
|
||||
|
||||
genesisData := make(map[string]json.RawMessage)
|
||||
for moduleName := range channels {
|
||||
res := <-channels[moduleName]
|
||||
if res.err != nil {
|
||||
return nil, fmt.Errorf("genesis export error in %s: %w", moduleName, res.err)
|
||||
}
|
||||
|
||||
genesisData[moduleName] = res.bz
|
||||
}
|
||||
|
||||
return genesisData, nil
|
||||
}
|
||||
|
||||
// checkModulesExists verifies that all modules in the list exist in the app
|
||||
func (m *MM[T]) checkModulesExists(moduleName []string) error {
|
||||
for _, name := range moduleName {
|
||||
if _, ok := m.modules[name]; !ok {
|
||||
return fmt.Errorf("module %s does not exist", name)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// BeginBlock runs the begin-block logic of all modules
|
||||
func (m *MM[T]) BeginBlock() func(ctx context.Context) error {
|
||||
return func(ctx context.Context) error {
|
||||
for _, moduleName := range m.config.BeginBlockers {
|
||||
if module, ok := m.modules[moduleName].(appmodulev2.HasBeginBlocker); ok {
|
||||
if err := module.BeginBlock(ctx); err != nil {
|
||||
return fmt.Errorf("failed to run beginblocker for %s: %w", moduleName, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// hasABCIEndBlock is the legacy EndBlocker implemented by x/staking in the CosmosSDK
|
||||
type hasABCIEndBlock interface {
|
||||
EndBlock(context.Context) ([]appmodulev2.ValidatorUpdate, error)
|
||||
}
|
||||
|
||||
// EndBlock runs the end-block logic of all modules and tx validator updates
|
||||
func (m *MM[T]) EndBlock() (
|
||||
endBlockFunc func(ctx context.Context) error,
|
||||
valUpdateFunc func(ctx context.Context) ([]appmodulev2.ValidatorUpdate, error),
|
||||
) {
|
||||
var validatorUpdates []appmodulev2.ValidatorUpdate
|
||||
endBlockFunc = func(ctx context.Context) error {
|
||||
for _, moduleName := range m.config.EndBlockers {
|
||||
if module, ok := m.modules[moduleName].(appmodulev2.HasEndBlocker); ok {
|
||||
err := module.EndBlock(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to run endblock for %s: %w", moduleName, err)
|
||||
}
|
||||
} else if module, ok := m.modules[moduleName].(hasABCIEndBlock); ok { // we need to keep this for our module compatibility promise
|
||||
moduleValUpdates, err := module.EndBlock(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to run enblock for %s: %w", moduleName, err)
|
||||
}
|
||||
// use these validator updates if provided, the module manager assumes
|
||||
// only one module will update the validator set
|
||||
if len(moduleValUpdates) > 0 {
|
||||
if len(validatorUpdates) > 0 {
|
||||
return errors.New("validator end block updates already set by a previous module")
|
||||
}
|
||||
|
||||
validatorUpdates = append(validatorUpdates, moduleValUpdates...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
valUpdateFunc = func(ctx context.Context) ([]appmodulev2.ValidatorUpdate, error) {
|
||||
// get validator updates of modules implementing directly the new HasUpdateValidators interface
|
||||
for _, v := range m.modules {
|
||||
if module, ok := v.(appmodulev2.HasUpdateValidators); ok {
|
||||
moduleValUpdates, err := module.UpdateValidators(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(moduleValUpdates) > 0 {
|
||||
if len(validatorUpdates) > 0 {
|
||||
return nil, errors.New("validator end block updates already set by a previous module")
|
||||
}
|
||||
|
||||
validatorUpdates = append(validatorUpdates, moduleValUpdates...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Reset validatorUpdates
|
||||
res := validatorUpdates
|
||||
validatorUpdates = []appmodulev2.ValidatorUpdate{}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
return endBlockFunc, valUpdateFunc
|
||||
}
|
||||
|
||||
// PreBlocker runs the pre-block logic of all modules
|
||||
func (m *MM[T]) PreBlocker() func(ctx context.Context, txs []T) error {
|
||||
return func(ctx context.Context, txs []T) error {
|
||||
for _, moduleName := range m.config.PreBlockers {
|
||||
if module, ok := m.modules[moduleName].(appmodulev2.HasPreBlocker); ok {
|
||||
if err := module.PreBlock(ctx); err != nil {
|
||||
return fmt.Errorf("failed to run preblock for %s: %w", moduleName, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// TxValidators validates incoming transactions
|
||||
func (m *MM[T]) TxValidators() func(ctx context.Context, tx T) error {
|
||||
return func(ctx context.Context, tx T) error {
|
||||
for _, moduleName := range m.config.TxValidators {
|
||||
if module, ok := m.modules[moduleName].(appmodulev2.HasTxValidator[T]); ok {
|
||||
if err := module.TxValidator(ctx, tx); err != nil {
|
||||
return fmt.Errorf("failed to run tx validator for %s: %w", moduleName, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// TODO write as descriptive godoc as module manager v1.
|
||||
// TODO include feedback from https://github.com/cosmos/cosmos-sdk/issues/15120
|
||||
func (m *MM[T]) RunMigrations(ctx context.Context, fromVM appmodulev2.VersionMap) (appmodulev2.VersionMap, error) {
|
||||
updatedVM := appmodulev2.VersionMap{}
|
||||
for _, moduleName := range m.config.OrderMigrations {
|
||||
module := m.modules[moduleName]
|
||||
fromVersion, exists := fromVM[moduleName]
|
||||
toVersion := uint64(0)
|
||||
if module, ok := module.(appmodulev2.HasConsensusVersion); ok {
|
||||
toVersion = module.ConsensusVersion()
|
||||
}
|
||||
|
||||
// We run migration if the module is specified in `fromVM`.
|
||||
// Otherwise we run InitGenesis.
|
||||
//
|
||||
// The module won't exist in the fromVM in two cases:
|
||||
// 1. A new module is added. In this case we run InitGenesis with an
|
||||
// empty genesis state.
|
||||
// 2. An existing chain is upgrading from version < 0.43 to v0.43+ for the first time.
|
||||
// In this case, all modules have yet to be added to x/upgrade's VersionMap store.
|
||||
if exists {
|
||||
m.logger.Info(fmt.Sprintf("migrating module %s from version %d to version %d", moduleName, fromVersion, toVersion))
|
||||
if err := m.migrationRegistrar.RunModuleMigrations(ctx, moduleName, fromVersion, toVersion); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
m.logger.Info(fmt.Sprintf("adding a new module: %s", moduleName))
|
||||
if mod, ok := m.modules[moduleName].(appmodule.HasGenesis); ok {
|
||||
if err := mod.InitGenesis(ctx, mod.DefaultGenesis()); err != nil {
|
||||
return nil, fmt.Errorf("failed to run InitGenesis for %s: %w", moduleName, err)
|
||||
}
|
||||
}
|
||||
if mod, ok := m.modules[moduleName].(appmodulev2.HasABCIGenesis); ok {
|
||||
moduleValUpdates, err := mod.InitGenesis(ctx, mod.DefaultGenesis())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// The module manager assumes only one module will update the validator set, and it can't be a new module.
|
||||
if len(moduleValUpdates) > 0 {
|
||||
return nil, errors.New("validator InitGenesis update is already set by another module")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updatedVM[moduleName] = toVersion
|
||||
}
|
||||
|
||||
return updatedVM, nil
|
||||
}
|
||||
|
||||
// RegisterServices registers all module services.
|
||||
func (m *MM[T]) RegisterServices(app *App[T]) error {
|
||||
for _, module := range m.modules {
|
||||
// register msg + query
|
||||
if services, ok := module.(appmodule.HasServices); ok {
|
||||
if err := registerServices(services, app, protoregistry.GlobalFiles); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// register migrations
|
||||
if module, ok := module.(appmodulev2.HasMigrations); ok {
|
||||
if err := module.RegisterMigrations(m.migrationRegistrar); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: register pre and post msg
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateConfig validates the module manager configuration
|
||||
// it asserts that all modules are defined in the configuration and that no modules are forgotten
|
||||
func (m *MM[T]) validateConfig() error {
|
||||
if err := m.assertNoForgottenModules("PreBlockers", m.config.PreBlockers, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
_, hasBlock := module.(appmodulev2.HasPreBlocker)
|
||||
return !hasBlock
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("BeginBlockers", m.config.BeginBlockers, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
_, hasBeginBlock := module.(appmodulev2.HasBeginBlocker)
|
||||
return !hasBeginBlock
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("EndBlockers", m.config.EndBlockers, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
if _, hasEndBlock := module.(appmodulev2.HasEndBlocker); hasEndBlock {
|
||||
return !hasEndBlock
|
||||
}
|
||||
|
||||
_, hasABCIEndBlock := module.(hasABCIEndBlock)
|
||||
return !hasABCIEndBlock
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("TxValidators", m.config.TxValidators, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
_, hasTxValidator := module.(appmodulev2.HasTxValidator[T])
|
||||
return !hasTxValidator
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("InitGenesis", m.config.InitGenesis, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
if _, hasGenesis := module.(appmodule.HasGenesisAuto); hasGenesis {
|
||||
panic(fmt.Sprintf("module %s isn't server/v2 compatible", moduleName))
|
||||
}
|
||||
|
||||
if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis {
|
||||
return !hasGenesis
|
||||
}
|
||||
|
||||
_, hasABCIGenesis := module.(appmodulev2.HasABCIGenesis)
|
||||
return !hasABCIGenesis
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("ExportGenesis", m.config.ExportGenesis, func(moduleName string) bool {
|
||||
module := m.modules[moduleName]
|
||||
if _, hasGenesis := module.(appmodule.HasGenesisAuto); hasGenesis {
|
||||
panic(fmt.Sprintf("module %s isn't server/v2 compatible", moduleName))
|
||||
}
|
||||
|
||||
if _, hasGenesis := module.(appmodulev2.HasGenesis); hasGenesis {
|
||||
return !hasGenesis
|
||||
}
|
||||
|
||||
_, hasABCIGenesis := module.(appmodulev2.HasABCIGenesis)
|
||||
return !hasABCIGenesis
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.assertNoForgottenModules("OrderMigrations", m.config.OrderMigrations, nil); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// assertNoForgottenModules checks that we didn't forget any modules in the *runtimev2.Module config.
|
||||
// `pass` is a closure which allows one to omit modules from `moduleNames`.
|
||||
// If you provide non-nil `pass` and it returns true, the module would not be subject of the assertion.
|
||||
func (m *MM[T]) assertNoForgottenModules(
|
||||
setOrderFnName string,
|
||||
moduleNames []string,
|
||||
pass func(moduleName string) bool,
|
||||
) error {
|
||||
ms := make(map[string]bool)
|
||||
for _, m := range moduleNames {
|
||||
ms[m] = true
|
||||
}
|
||||
var missing []string
|
||||
for m := range m.modules {
|
||||
m := m
|
||||
if pass != nil && pass(m) {
|
||||
continue
|
||||
}
|
||||
|
||||
if !ms[m] {
|
||||
missing = append(missing, m)
|
||||
}
|
||||
}
|
||||
|
||||
if len(missing) != 0 {
|
||||
sort.Strings(missing)
|
||||
return fmt.Errorf("all modules must be defined when setting %s, missing: %v", setOrderFnName, missing)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func registerServices[T transaction.Tx](s appmodule.HasServices, app *App[T], registry *protoregistry.Files) error {
|
||||
c := &configurator{
|
||||
grpcQueryDecoders: map[string]func() gogoproto.Message{},
|
||||
stfQueryRouter: app.queryRouterBuilder,
|
||||
stfMsgRouter: app.msgRouterBuilder,
|
||||
registry: registry,
|
||||
err: nil,
|
||||
}
|
||||
|
||||
err := s.RegisterServices(c)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to register services: %w", err)
|
||||
}
|
||||
// merge maps
|
||||
for path, decoder := range c.grpcQueryDecoders {
|
||||
app.GRPCMethodsToMessageMap[path] = decoder
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ grpc.ServiceRegistrar = (*configurator)(nil)
|
||||
|
||||
type configurator struct {
|
||||
// grpcQueryDecoders is required because module expose queries through gRPC
|
||||
// this provides a way to route to modules using gRPC.
|
||||
grpcQueryDecoders map[string]func() gogoproto.Message
|
||||
|
||||
stfQueryRouter *stf.MsgRouterBuilder
|
||||
stfMsgRouter *stf.MsgRouterBuilder
|
||||
registry *protoregistry.Files
|
||||
err error
|
||||
}
|
||||
|
||||
func (c *configurator) RegisterService(sd *grpc.ServiceDesc, ss interface{}) {
|
||||
// first we check if it's a msg server
|
||||
prefSd, err := c.registry.FindDescriptorByName(protoreflect.FullName(sd.ServiceName))
|
||||
if err != nil {
|
||||
c.err = fmt.Errorf("register service: unable to find protov2 service descriptor: please make sure protov2 API counterparty is imported: %s", sd.ServiceName)
|
||||
return
|
||||
}
|
||||
|
||||
if !proto.HasExtension(prefSd.(protoreflect.ServiceDescriptor).Options(), cosmosmsg.E_Service) {
|
||||
err = c.registerQueryHandlers(sd, ss)
|
||||
if err != nil {
|
||||
c.err = err
|
||||
}
|
||||
} else {
|
||||
err = c.registerMsgHandlers(sd, ss)
|
||||
if err != nil {
|
||||
c.err = err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *configurator) registerQueryHandlers(sd *grpc.ServiceDesc, ss interface{}) error {
|
||||
for _, md := range sd.Methods {
|
||||
// TODO(tip): what if a query is not deterministic?
|
||||
requestFullName, err := registerMethod(c.stfQueryRouter, sd, md, ss)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to register query handler %s: %w", md.MethodName, err)
|
||||
}
|
||||
|
||||
// register gRPC query method.
|
||||
typ := gogoproto.MessageType(requestFullName)
|
||||
if typ == nil {
|
||||
return fmt.Errorf("unable to find message in gogotype registry: %w", err)
|
||||
}
|
||||
decoderFunc := func() gogoproto.Message {
|
||||
return reflect.New(typ.Elem()).Interface().(gogoproto.Message)
|
||||
}
|
||||
methodName := fmt.Sprintf("/%s/%s", sd.ServiceName, md.MethodName)
|
||||
c.grpcQueryDecoders[methodName] = decoderFunc
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *configurator) registerMsgHandlers(sd *grpc.ServiceDesc, ss interface{}) error {
|
||||
for _, md := range sd.Methods {
|
||||
_, err := registerMethod(c.stfMsgRouter, sd, md, ss)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to register msg handler %s: %w", md.MethodName, err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// requestFullNameFromMethodDesc returns the fully-qualified name of the request message of the provided service's method.
|
||||
func requestFullNameFromMethodDesc(sd *grpc.ServiceDesc, method grpc.MethodDesc) (protoreflect.FullName, error) {
|
||||
methodFullName := protoreflect.FullName(fmt.Sprintf("%s.%s", sd.ServiceName, method.MethodName))
|
||||
desc, err := gogoproto.HybridResolver.FindDescriptorByName(methodFullName)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("cannot find method descriptor %s", methodFullName)
|
||||
}
|
||||
methodDesc, ok := desc.(protoreflect.MethodDescriptor)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("invalid method descriptor %s", methodFullName)
|
||||
}
|
||||
return methodDesc.Input().FullName(), nil
|
||||
}
|
||||
|
||||
func registerMethod(
|
||||
stfRouter *stf.MsgRouterBuilder,
|
||||
sd *grpc.ServiceDesc,
|
||||
md grpc.MethodDesc,
|
||||
ss interface{},
|
||||
) (string, error) {
|
||||
requestName, err := requestFullNameFromMethodDesc(sd, md)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(requestName), stfRouter.RegisterHandler(string(requestName), func(
|
||||
ctx context.Context,
|
||||
msg appmodulev2.Message,
|
||||
) (resp appmodulev2.Message, err error) {
|
||||
res, err := md.Handler(ss, ctx, noopDecoder, messagePassingInterceptor(msg))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return res.(appmodulev2.Message), nil
|
||||
})
|
||||
}
|
||||
|
||||
func noopDecoder(_ interface{}) error { return nil }
|
||||
|
||||
func messagePassingInterceptor(msg appmodulev2.Message) grpc.UnaryServerInterceptor {
|
||||
return func(
|
||||
ctx context.Context,
|
||||
req interface{},
|
||||
_ *grpc.UnaryServerInfo,
|
||||
handler grpc.UnaryHandler,
|
||||
) (interface{}, error) {
|
||||
return handler(ctx, msg)
|
||||
}
|
||||
}
|
||||
|
||||
// defaultMigrationsOrder returns a default migrations order: ascending alphabetical by module name,
|
||||
// except x/auth which will run last, see:
|
||||
// https://github.com/cosmos/cosmos-sdk/issues/10591
|
||||
func defaultMigrationsOrder(modules []string) []string {
|
||||
const authName = "auth"
|
||||
out := make([]string, 0, len(modules))
|
||||
hasAuth := false
|
||||
for _, m := range modules {
|
||||
if m == authName {
|
||||
hasAuth = true
|
||||
} else {
|
||||
out = append(out, m)
|
||||
}
|
||||
}
|
||||
sort.Strings(out)
|
||||
if hasAuth {
|
||||
out = append(out, authName)
|
||||
}
|
||||
return out
|
||||
}
|
||||
@ -1,69 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
appmodulev2 "cosmossdk.io/core/appmodule/v2"
|
||||
)
|
||||
|
||||
var _ appmodulev2.MigrationRegistrar = (*migrationRegistrar)(nil)
|
||||
|
||||
type migrationRegistrar struct {
|
||||
// migrations is a map of moduleName -> fromVersion -> migration script handler
|
||||
migrations map[string]map[uint64]appmodulev2.MigrationHandler
|
||||
}
|
||||
|
||||
// newMigrationRegistrar is constructor for registering in-place store migrations for modules.
|
||||
func newMigrationRegistrar() *migrationRegistrar {
|
||||
return &migrationRegistrar{
|
||||
migrations: make(map[string]map[uint64]appmodulev2.MigrationHandler),
|
||||
}
|
||||
}
|
||||
|
||||
// Register registers an in-place store migration for a module.
|
||||
// It permits to register modules migrations that have migrated to serverv2 but still be compatible with baseapp.
|
||||
func (mr *migrationRegistrar) Register(moduleName string, fromVersion uint64, handler appmodulev2.MigrationHandler) error {
|
||||
if fromVersion == 0 {
|
||||
return fmt.Errorf("module migration versions should start at 1: %s", moduleName)
|
||||
}
|
||||
|
||||
if mr.migrations[moduleName] == nil {
|
||||
mr.migrations[moduleName] = map[uint64]appmodulev2.MigrationHandler{}
|
||||
}
|
||||
|
||||
if mr.migrations[moduleName][fromVersion] != nil {
|
||||
return fmt.Errorf("another migration for module %s and version %d already exists", moduleName, fromVersion)
|
||||
}
|
||||
|
||||
mr.migrations[moduleName][fromVersion] = handler
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunModuleMigrations runs all in-place store migrations for one given module from a version to another version.
|
||||
func (mr *migrationRegistrar) RunModuleMigrations(ctx context.Context, moduleName string, fromVersion, toVersion uint64) error {
|
||||
// No-op if toVersion is the initial version or if the version is unchanged.
|
||||
if toVersion <= 1 || fromVersion == toVersion {
|
||||
return nil
|
||||
}
|
||||
|
||||
moduleMigrationsMap, found := mr.migrations[moduleName]
|
||||
if !found {
|
||||
return fmt.Errorf("no migrations found for module %s", moduleName)
|
||||
}
|
||||
|
||||
// Run in-place migrations for the module sequentially until toVersion.
|
||||
for i := fromVersion; i < toVersion; i++ {
|
||||
migrateFn, found := moduleMigrationsMap[i]
|
||||
if !found {
|
||||
return fmt.Errorf("no migration found for module %s from version %d to version %d", moduleName, i, i+1)
|
||||
}
|
||||
|
||||
if err := migrateFn(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -1,249 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"github.com/spf13/viper"
|
||||
"google.golang.org/grpc"
|
||||
"google.golang.org/protobuf/reflect/protodesc"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
|
||||
runtimev2 "cosmossdk.io/api/cosmos/app/runtime/v2"
|
||||
appv1alpha1 "cosmossdk.io/api/cosmos/app/v1alpha1"
|
||||
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
|
||||
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
|
||||
"cosmossdk.io/core/app"
|
||||
"cosmossdk.io/core/appmodule"
|
||||
appmodulev2 "cosmossdk.io/core/appmodule/v2"
|
||||
"cosmossdk.io/core/comet"
|
||||
"cosmossdk.io/core/genesis"
|
||||
"cosmossdk.io/core/legacy"
|
||||
"cosmossdk.io/core/registry"
|
||||
"cosmossdk.io/core/store"
|
||||
"cosmossdk.io/core/transaction"
|
||||
"cosmossdk.io/depinject"
|
||||
"cosmossdk.io/depinject/appconfig"
|
||||
"cosmossdk.io/log"
|
||||
"cosmossdk.io/runtime/v2/services"
|
||||
"cosmossdk.io/server/v2/stf"
|
||||
)
|
||||
|
||||
var (
|
||||
_ appmodulev2.AppModule = appModule[transaction.Tx]{}
|
||||
_ appmodule.HasServices = appModule[transaction.Tx]{}
|
||||
)
|
||||
|
||||
type appModule[T transaction.Tx] struct {
|
||||
app *App[T]
|
||||
}
|
||||
|
||||
func (m appModule[T]) IsOnePerModuleType() {}
|
||||
func (m appModule[T]) IsAppModule() {}
|
||||
|
||||
func (m appModule[T]) RegisterServices(registar grpc.ServiceRegistrar) error {
|
||||
autoCliQueryService, err := services.NewAutoCLIQueryService(m.app.moduleManager.modules)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
autocliv1.RegisterQueryServer(registar, autoCliQueryService)
|
||||
|
||||
reflectionSvc, err := services.NewReflectionService()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
reflectionv1.RegisterReflectionServiceServer(registar, reflectionSvc)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m appModule[T]) AutoCLIOptions() *autocliv1.ModuleOptions {
|
||||
return &autocliv1.ModuleOptions{
|
||||
Query: &autocliv1.ServiceCommandDescriptor{
|
||||
Service: appv1alpha1.Query_ServiceDesc.ServiceName,
|
||||
RpcCommandOptions: []*autocliv1.RpcCommandOptions{
|
||||
{
|
||||
RpcMethod: "Config",
|
||||
Short: "Query the current app config",
|
||||
},
|
||||
},
|
||||
SubCommands: map[string]*autocliv1.ServiceCommandDescriptor{
|
||||
"autocli": {
|
||||
Service: autocliv1.Query_ServiceDesc.ServiceName,
|
||||
RpcCommandOptions: []*autocliv1.RpcCommandOptions{
|
||||
{
|
||||
RpcMethod: "AppOptions",
|
||||
Short: "Query the custom autocli options",
|
||||
},
|
||||
},
|
||||
},
|
||||
"reflection": {
|
||||
Service: reflectionv1.ReflectionService_ServiceDesc.ServiceName,
|
||||
RpcCommandOptions: []*autocliv1.RpcCommandOptions{
|
||||
{
|
||||
RpcMethod: "FileDescriptors",
|
||||
Short: "Query the app's protobuf file descriptors",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func init() {
|
||||
appconfig.Register(&runtimev2.Module{},
|
||||
appconfig.Provide(
|
||||
ProvideAppBuilder[transaction.Tx],
|
||||
ProvideEnvironment[transaction.Tx],
|
||||
ProvideModuleManager[transaction.Tx],
|
||||
ProvideGenesisTxHandler[transaction.Tx],
|
||||
ProvideCometService,
|
||||
ProvideAppVersionModifier[transaction.Tx],
|
||||
),
|
||||
appconfig.Invoke(SetupAppBuilder),
|
||||
)
|
||||
}
|
||||
|
||||
func ProvideAppBuilder[T transaction.Tx](
|
||||
interfaceRegistrar registry.InterfaceRegistrar,
|
||||
amino legacy.Amino,
|
||||
) (
|
||||
*AppBuilder[T],
|
||||
*stf.MsgRouterBuilder,
|
||||
appmodulev2.AppModule,
|
||||
protodesc.Resolver,
|
||||
protoregistry.MessageTypeResolver,
|
||||
) {
|
||||
protoFiles := proto.HybridResolver
|
||||
protoTypes := protoregistry.GlobalTypes
|
||||
|
||||
// At startup, check that all proto annotations are correct.
|
||||
if err := validateProtoAnnotations(protoFiles); err != nil {
|
||||
// Once we switch to using protoreflect-based ante handlers, we might
|
||||
// want to panic here instead of logging a warning.
|
||||
_, _ = fmt.Fprintln(os.Stderr, err.Error())
|
||||
}
|
||||
|
||||
msgRouterBuilder := stf.NewMsgRouterBuilder()
|
||||
app := &App[T]{
|
||||
storeKeys: nil,
|
||||
interfaceRegistrar: interfaceRegistrar,
|
||||
amino: amino,
|
||||
msgRouterBuilder: msgRouterBuilder,
|
||||
queryRouterBuilder: stf.NewMsgRouterBuilder(), // TODO dedicated query router
|
||||
GRPCMethodsToMessageMap: map[string]func() proto.Message{},
|
||||
}
|
||||
appBuilder := &AppBuilder[T]{app: app}
|
||||
|
||||
return appBuilder, msgRouterBuilder, appModule[T]{app}, protoFiles, protoTypes
|
||||
}
|
||||
|
||||
type AppInputs struct {
|
||||
depinject.In
|
||||
|
||||
Config *runtimev2.Module
|
||||
AppBuilder *AppBuilder[transaction.Tx]
|
||||
ModuleManager *MM[transaction.Tx]
|
||||
InterfaceRegistrar registry.InterfaceRegistrar
|
||||
LegacyAmino legacy.Amino
|
||||
Logger log.Logger
|
||||
Viper *viper.Viper `optional:"true"`
|
||||
}
|
||||
|
||||
func SetupAppBuilder(inputs AppInputs) {
|
||||
app := inputs.AppBuilder.app
|
||||
app.config = inputs.Config
|
||||
app.logger = inputs.Logger
|
||||
app.moduleManager = inputs.ModuleManager
|
||||
app.moduleManager.RegisterInterfaces(inputs.InterfaceRegistrar)
|
||||
app.moduleManager.RegisterLegacyAminoCodec(inputs.LegacyAmino)
|
||||
|
||||
if inputs.Viper != nil {
|
||||
inputs.AppBuilder.viper = inputs.Viper
|
||||
}
|
||||
}
|
||||
|
||||
func ProvideModuleManager[T transaction.Tx](
|
||||
logger log.Logger,
|
||||
config *runtimev2.Module,
|
||||
modules map[string]appmodulev2.AppModule,
|
||||
) *MM[T] {
|
||||
return NewModuleManager[T](logger, config, modules)
|
||||
}
|
||||
|
||||
// ProvideEnvironment provides the environment for keeper modules, while maintaining backward compatibility and provide services directly as well.
|
||||
func ProvideEnvironment[T transaction.Tx](logger log.Logger, config *runtimev2.Module, key depinject.ModuleKey, appBuilder *AppBuilder[T]) (
|
||||
appmodulev2.Environment,
|
||||
store.KVStoreService,
|
||||
store.MemoryStoreService,
|
||||
) {
|
||||
var (
|
||||
kvService store.KVStoreService = failingStoreService{}
|
||||
memKvService store.MemoryStoreService = failingStoreService{}
|
||||
)
|
||||
|
||||
// skips modules that have no store
|
||||
if !slices.Contains(config.SkipStoreKeys, key.Name()) {
|
||||
var kvStoreKey string
|
||||
storeKeyOverride := storeKeyOverride(config, key.Name())
|
||||
if storeKeyOverride != nil {
|
||||
kvStoreKey = storeKeyOverride.KvStoreKey
|
||||
} else {
|
||||
kvStoreKey = key.Name()
|
||||
}
|
||||
|
||||
registerStoreKey(appBuilder, kvStoreKey)
|
||||
kvService = stf.NewKVStoreService([]byte(kvStoreKey))
|
||||
|
||||
memStoreKey := fmt.Sprintf("memory:%s", key.Name())
|
||||
registerStoreKey(appBuilder, memStoreKey)
|
||||
memKvService = stf.NewMemoryStoreService([]byte(memStoreKey))
|
||||
}
|
||||
|
||||
env := appmodulev2.Environment{
|
||||
Logger: logger,
|
||||
BranchService: stf.BranchService{},
|
||||
EventService: stf.NewEventService(),
|
||||
GasService: stf.NewGasMeterService(),
|
||||
HeaderService: stf.HeaderService{},
|
||||
QueryRouterService: stf.NewQueryRouterService(),
|
||||
MsgRouterService: stf.NewMsgRouterService([]byte(key.Name())),
|
||||
TransactionService: services.NewContextAwareTransactionService(),
|
||||
KVStoreService: kvService,
|
||||
MemStoreService: memKvService,
|
||||
}
|
||||
|
||||
return env, kvService, memKvService
|
||||
}
|
||||
|
||||
func registerStoreKey[T transaction.Tx](wrapper *AppBuilder[T], key string) {
|
||||
wrapper.app.storeKeys = append(wrapper.app.storeKeys, key)
|
||||
}
|
||||
|
||||
func storeKeyOverride(config *runtimev2.Module, moduleName string) *runtimev2.StoreKeyConfig {
|
||||
for _, cfg := range config.OverrideStoreKeys {
|
||||
if cfg.ModuleName == moduleName {
|
||||
return cfg
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func ProvideGenesisTxHandler[T transaction.Tx](appBuilder *AppBuilder[T]) genesis.TxHandler {
|
||||
return appBuilder.app
|
||||
}
|
||||
|
||||
func ProvideCometService() comet.Service {
|
||||
return &services.ContextAwareCometInfoService{}
|
||||
}
|
||||
|
||||
// ProvideAppVersionModifier returns nil, `app.VersionModifier` is a feature of BaseApp and neither used nor required for runtim/v2.
|
||||
// nil is acceptable, see: https://github.com/cosmos/cosmos-sdk/blob/0a6ee406a02477ae8ccbfcbe1b51fc3930087f4c/x/upgrade/keeper/keeper.go#L438
|
||||
func ProvideAppVersionModifier[T transaction.Tx](app *AppBuilder[T]) app.VersionModifier {
|
||||
return nil
|
||||
}
|
||||
@ -1,141 +0,0 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"google.golang.org/grpc"
|
||||
protobuf "google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
|
||||
autocliv1 "cosmossdk.io/api/cosmos/autocli/v1"
|
||||
cosmosmsg "cosmossdk.io/api/cosmos/msg/v1"
|
||||
"cosmossdk.io/core/appmodule"
|
||||
appmodulev2 "cosmossdk.io/core/appmodule/v2"
|
||||
)
|
||||
|
||||
// AutoCLIQueryService implements the cosmos.autocli.v1.Query service.
|
||||
type AutoCLIQueryService struct {
|
||||
autocliv1.UnimplementedQueryServer
|
||||
|
||||
moduleOptions map[string]*autocliv1.ModuleOptions
|
||||
}
|
||||
|
||||
// NewAutoCLIQueryService returns a AutoCLIQueryService for the provided modules.
|
||||
func NewAutoCLIQueryService(appModules map[string]appmodulev2.AppModule) (*AutoCLIQueryService, error) {
|
||||
moduleOptions, err := ExtractAutoCLIOptions(appModules)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &AutoCLIQueryService{moduleOptions: moduleOptions}, nil
|
||||
}
|
||||
|
||||
// ExtractAutoCLIOptions extracts autocli ModuleOptions from the provided app modules.
|
||||
// Example Usage: ExtractAutoCLIOptions(ModuleManager.Modules)
|
||||
// Note, runtimev2/services.ExtractAutoCLIOptions differs from runtimev1/services.ExtractAutoCLIOptions as
|
||||
// it supports only modules implementing fully the core appmodule interface.
|
||||
func ExtractAutoCLIOptions(appModules map[string]appmodule.AppModule) (map[string]*autocliv1.ModuleOptions, error) {
|
||||
moduleOptions := map[string]*autocliv1.ModuleOptions{}
|
||||
for modName, mod := range appModules {
|
||||
if autoCliMod, ok := mod.(interface {
|
||||
AutoCLIOptions() *autocliv1.ModuleOptions
|
||||
}); ok {
|
||||
moduleOptions[modName] = autoCliMod.AutoCLIOptions()
|
||||
continue
|
||||
}
|
||||
|
||||
autoCliRegistrar := &autocliRegistrar{}
|
||||
|
||||
// try to auto-discover options based on the last msg and query
|
||||
// services registered for the module
|
||||
if mod, ok := mod.(appmodule.HasServices); ok {
|
||||
err := mod.RegisterServices(autoCliRegistrar)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
// check for errors in the registrar
|
||||
if err := autoCliRegistrar.Error(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
haveServices := false
|
||||
modOptions := &autocliv1.ModuleOptions{}
|
||||
if autoCliRegistrar.msgServer.serviceName != "" {
|
||||
haveServices = true
|
||||
modOptions.Tx = &autocliv1.ServiceCommandDescriptor{
|
||||
Service: autoCliRegistrar.msgServer.serviceName,
|
||||
}
|
||||
}
|
||||
|
||||
if autoCliRegistrar.queryServer.serviceName != "" {
|
||||
haveServices = true
|
||||
modOptions.Query = &autocliv1.ServiceCommandDescriptor{
|
||||
Service: autoCliRegistrar.queryServer.serviceName,
|
||||
}
|
||||
}
|
||||
|
||||
if haveServices {
|
||||
moduleOptions[modName] = modOptions
|
||||
}
|
||||
}
|
||||
return moduleOptions, nil
|
||||
}
|
||||
|
||||
func (a AutoCLIQueryService) AppOptions(context.Context, *autocliv1.AppOptionsRequest) (*autocliv1.AppOptionsResponse, error) {
|
||||
return &autocliv1.AppOptionsResponse{
|
||||
ModuleOptions: a.moduleOptions,
|
||||
}, nil
|
||||
}
|
||||
|
||||
var _ grpc.ServiceRegistrar = (*autocliRegistrar)(nil)
|
||||
|
||||
// autocliRegistrar allows us to call RegisterServices and introspect the services
|
||||
type autocliRegistrar struct {
|
||||
msgServer autocliServiceRegistrar
|
||||
queryServer autocliServiceRegistrar
|
||||
registryCache *protoregistry.Files
|
||||
err error
|
||||
}
|
||||
|
||||
func (a *autocliRegistrar) RegisterService(sd *grpc.ServiceDesc, ss interface{}) {
|
||||
if a.registryCache == nil {
|
||||
a.registryCache, a.err = proto.MergedRegistry()
|
||||
if a.err != nil {
|
||||
a.err = fmt.Errorf("failed to build registry cache: %w", a.err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
fullName := protoreflect.FullName(sd.ServiceName)
|
||||
desc, err := a.registryCache.FindDescriptorByName(fullName)
|
||||
if err != nil {
|
||||
a.err = fmt.Errorf("failed to find descriptor for %q: %w", fullName, err)
|
||||
return
|
||||
}
|
||||
|
||||
if protobuf.HasExtension(desc.Options(), cosmosmsg.E_Service) {
|
||||
a.msgServer.RegisterService(sd, ss)
|
||||
} else {
|
||||
a.queryServer.RegisterService(sd, ss)
|
||||
}
|
||||
}
|
||||
|
||||
func (a *autocliRegistrar) Error() error {
|
||||
return a.err
|
||||
}
|
||||
|
||||
// autocliServiceRegistrar is used to capture the service name for registered services
|
||||
type autocliServiceRegistrar struct {
|
||||
serviceName string
|
||||
}
|
||||
|
||||
func (a *autocliServiceRegistrar) RegisterService(sd *grpc.ServiceDesc, _ interface{}) {
|
||||
a.serviceName = sd.ServiceName
|
||||
}
|
||||
|
||||
var _ autocliv1.QueryServer = &AutoCLIQueryService{}
|
||||
@ -1,21 +0,0 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/core/comet"
|
||||
corecontext "cosmossdk.io/core/context"
|
||||
)
|
||||
|
||||
var _ comet.Service = &ContextAwareCometInfoService{}
|
||||
|
||||
type ContextAwareCometInfoService struct{}
|
||||
|
||||
// CometInfo implements comet.Service.
|
||||
func (c *ContextAwareCometInfoService) CometInfo(ctx context.Context) comet.Info {
|
||||
ci, ok := ctx.Value(corecontext.CometInfoKey).(comet.Info)
|
||||
if !ok {
|
||||
panic("comet.Info not found in context")
|
||||
}
|
||||
return ci
|
||||
}
|
||||
@ -1,33 +0,0 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/cosmos/gogoproto/proto"
|
||||
"google.golang.org/protobuf/types/descriptorpb"
|
||||
|
||||
reflectionv1 "cosmossdk.io/api/cosmos/reflection/v1"
|
||||
)
|
||||
|
||||
// ReflectionService implements the cosmos.reflection.v1 service.
|
||||
type ReflectionService struct {
|
||||
reflectionv1.UnimplementedReflectionServiceServer
|
||||
files *descriptorpb.FileDescriptorSet
|
||||
}
|
||||
|
||||
func NewReflectionService() (*ReflectionService, error) {
|
||||
fds, err := proto.MergedGlobalFileDescriptors()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &ReflectionService{files: fds}, nil
|
||||
}
|
||||
|
||||
func (r ReflectionService) FileDescriptors(_ context.Context, _ *reflectionv1.FileDescriptorsRequest) (*reflectionv1.FileDescriptorsResponse, error) {
|
||||
return &reflectionv1.FileDescriptorsResponse{
|
||||
Files: r.files.File,
|
||||
}, nil
|
||||
}
|
||||
|
||||
var _ reflectionv1.ReflectionServiceServer = &ReflectionService{}
|
||||
@ -1,23 +0,0 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
corecontext "cosmossdk.io/core/context"
|
||||
"cosmossdk.io/core/transaction"
|
||||
)
|
||||
|
||||
var _ transaction.Service = &ContextAwareTransactionService{}
|
||||
|
||||
// ContextAwareTransactionService implements the transaction.Service interface.
|
||||
// It is used to retrieve the execution mode in the context.
|
||||
type ContextAwareTransactionService struct{}
|
||||
|
||||
// ExecMode returns the execution mode stored in the context.
|
||||
func (c ContextAwareTransactionService) ExecMode(ctx context.Context) transaction.ExecMode {
|
||||
return ctx.Value(corecontext.ExecModeKey).(transaction.ExecMode)
|
||||
}
|
||||
|
||||
func NewContextAwareTransactionService() transaction.Service {
|
||||
return &ContextAwareTransactionService{}
|
||||
}
|
||||
@ -1,56 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"cosmossdk.io/core/store"
|
||||
"cosmossdk.io/server/v2/stf"
|
||||
storev2 "cosmossdk.io/store/v2"
|
||||
"cosmossdk.io/store/v2/proof"
|
||||
)
|
||||
|
||||
// NewKVStoreService creates a new KVStoreService.
|
||||
// This wrapper is kept for backwards compatibility.
|
||||
// When migrating from runtime to runtime/v2, use runtimev2.NewKVStoreService(storeKey.Name()) instead of runtime.NewKVStoreService(storeKey).
|
||||
func NewKVStoreService(storeKey string) store.KVStoreService {
|
||||
return stf.NewKVStoreService([]byte(storeKey))
|
||||
}
|
||||
|
||||
type Store interface {
|
||||
// GetLatestVersion returns the latest version that consensus has been made on
|
||||
GetLatestVersion() (uint64, error)
|
||||
// StateLatest returns a readonly view over the latest
|
||||
// committed state of the store. Alongside the version
|
||||
// associated with it.
|
||||
StateLatest() (uint64, store.ReaderMap, error)
|
||||
|
||||
// StateAt returns a readonly view over the provided
|
||||
// state. Must error when the version does not exist.
|
||||
StateAt(version uint64) (store.ReaderMap, error)
|
||||
|
||||
// SetInitialVersion sets the initial version of the store.
|
||||
SetInitialVersion(uint64) error
|
||||
|
||||
// WorkingHash writes the provided changeset to the state and returns
|
||||
// the working hash of the state.
|
||||
WorkingHash(changeset *store.Changeset) (store.Hash, error)
|
||||
|
||||
// Commit commits the provided changeset and returns the new state root of the state.
|
||||
Commit(changeset *store.Changeset) (store.Hash, error)
|
||||
|
||||
// Query is a key/value query directly to the underlying database. This skips the appmanager
|
||||
Query(storeKey []byte, version uint64, key []byte, prove bool) (storev2.QueryResult, error)
|
||||
|
||||
// GetStateStorage returns the SS backend.
|
||||
GetStateStorage() storev2.VersionedDatabase
|
||||
|
||||
// GetStateCommitment returns the SC backend.
|
||||
GetStateCommitment() storev2.Committer
|
||||
|
||||
// LoadVersion loads the RootStore to the given version.
|
||||
LoadVersion(version uint64) error
|
||||
|
||||
// LoadLatestVersion behaves identically to LoadVersion except it loads the
|
||||
// latest version implicitly.
|
||||
LoadLatestVersion() error
|
||||
|
||||
LastCommitID() (proof.CommitID, error)
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"cosmossdk.io/core/store"
|
||||
)
|
||||
|
||||
type failingStoreService struct{}
|
||||
|
||||
func (failingStoreService) OpenKVStore(ctx context.Context) store.KVStore {
|
||||
panic("kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenMemoryStore(ctx context.Context) store.KVStore {
|
||||
panic("memory kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
|
||||
func (failingStoreService) OpenTransientStore(ctx context.Context) store.KVStore {
|
||||
panic("transient kv store service not available for this module: verify runtime `skip_store_keys` app config if not expected")
|
||||
}
|
||||
@ -1,66 +0,0 @@
|
||||
package runtime
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/reflect/protoregistry"
|
||||
|
||||
msg "cosmossdk.io/api/cosmos/msg/v1"
|
||||
"cosmossdk.io/x/tx/signing"
|
||||
)
|
||||
|
||||
const (
|
||||
ModuleName = "runtime"
|
||||
FlagHome = "home"
|
||||
)
|
||||
|
||||
// ValidateProtoAnnotations validates that the proto annotations are correct.
|
||||
// More specifically, it verifies:
|
||||
// - all services named "Msg" have `(cosmos.msg.v1.service) = true`,
|
||||
//
|
||||
// More validations can be added here in the future.
|
||||
//
|
||||
// If `protoFiles` is nil, then protoregistry.GlobalFile will be used.
|
||||
func validateProtoAnnotations(protoFiles signing.ProtoFileResolver) error {
|
||||
if protoFiles == nil {
|
||||
protoFiles = protoregistry.GlobalFiles
|
||||
}
|
||||
|
||||
var serviceErrs []error
|
||||
protoFiles.RangeFiles(func(fd protoreflect.FileDescriptor) bool {
|
||||
for i := 0; i < fd.Services().Len(); i++ {
|
||||
sd := fd.Services().Get(i)
|
||||
if sd.Name() == "Msg" {
|
||||
// We use the heuristic that services name Msg are exactly the
|
||||
// ones that need the proto annotations check.
|
||||
err := validateMsgServiceAnnotations(sd)
|
||||
if err != nil {
|
||||
serviceErrs = append(serviceErrs, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
return errors.Join(serviceErrs...)
|
||||
}
|
||||
|
||||
// validateMsgServiceAnnotations validates that the service has the
|
||||
// `(cosmos.msg.v1.service) = true` proto annotation.
|
||||
func validateMsgServiceAnnotations(sd protoreflect.ServiceDescriptor) error {
|
||||
ext := proto.GetExtension(sd.Options(), msg.E_Service)
|
||||
isService, ok := ext.(bool)
|
||||
if !ok {
|
||||
return fmt.Errorf("expected bool, got %T", ext)
|
||||
}
|
||||
|
||||
if !isService {
|
||||
return fmt.Errorf("service %s does not have cosmos.msg.v1.service proto annotation", sd.FullName())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -9,7 +9,7 @@ require (
|
||||
cosmossdk.io/depinject v1.0.0
|
||||
cosmossdk.io/log v1.3.1
|
||||
cosmossdk.io/math v1.3.0
|
||||
cosmossdk.io/runtime/v2 v2.0.0-00010101000000-000000000000
|
||||
cosmossdk.io/runtime/v2 v2.0.0-20240801110532-c55e8d71014b // main
|
||||
cosmossdk.io/server/v2 v2.0.0-20240731205446-aee9803a0af6 // main
|
||||
cosmossdk.io/server/v2/cometbft v0.0.0-00010101000000-000000000000
|
||||
cosmossdk.io/store/v2 v2.0.0-20240731205446-aee9803a0af6 // indirect; main
|
||||
@ -293,7 +293,6 @@ replace (
|
||||
replace (
|
||||
cosmossdk.io/api => ../../api
|
||||
cosmossdk.io/core/testing => ../../core/testing
|
||||
cosmossdk.io/runtime/v2 => ../../runtime/v2
|
||||
cosmossdk.io/server/v2/cometbft => ../../server/v2/cometbft
|
||||
cosmossdk.io/store => cosmossdk.io/store v1.0.0-rc.0.0.20240731205446-aee9803a0af6 // main
|
||||
|
||||
|
||||
@ -202,6 +202,8 @@ cosmossdk.io/log v1.3.1 h1:UZx8nWIkfbbNEWusZqzAx3ZGvu54TZacWib3EzUYmGI=
|
||||
cosmossdk.io/log v1.3.1/go.mod h1:2/dIomt8mKdk6vl3OWJcPk2be3pGOS8OQaLUM/3/tCM=
|
||||
cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE=
|
||||
cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k=
|
||||
cosmossdk.io/runtime/v2 v2.0.0-20240801110532-c55e8d71014b h1:1xgRbIPLToBCoclz8I7sOFWGRP3X3R4sEID4GmOGgvM=
|
||||
cosmossdk.io/runtime/v2 v2.0.0-20240801110532-c55e8d71014b/go.mod h1:08wVxHFbXSjlB0JUxTxdtLihqSj8rf8k6FuF4tJUJUU=
|
||||
cosmossdk.io/schema v0.1.1 h1:I0M6pgI7R10nq+/HCQfbO6BsGBZA8sQy+duR1Y3aKcA=
|
||||
cosmossdk.io/schema v0.1.1/go.mod h1:RDAhxIeNB4bYqAlF4NBJwRrgtnciMcyyg0DOKnhNZQQ=
|
||||
cosmossdk.io/server/v2 v2.0.0-20240731205446-aee9803a0af6 h1:r2BXi/s99Mq1ShLmP4QTlcUbMvVPKTMQztSbevu6Xeo=
|
||||
|
||||
Loading…
Reference in New Issue
Block a user