mirror of
https://github.com/planetmint/planetmint-go.git
synced 2025-07-05 12:12:29 +00:00
469 lines
17 KiB
Go
469 lines
17 KiB
Go
package app
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
_ "cosmossdk.io/api/cosmos/tx/config/v1" // import for side-effects
|
|
"cosmossdk.io/depinject"
|
|
"cosmossdk.io/log"
|
|
storetypes "cosmossdk.io/store/types"
|
|
_ "cosmossdk.io/x/circuit" // import for side-effects
|
|
circuitkeeper "cosmossdk.io/x/circuit/keeper"
|
|
_ "cosmossdk.io/x/evidence" // import for side-effects
|
|
evidencekeeper "cosmossdk.io/x/evidence/keeper"
|
|
feegrantkeeper "cosmossdk.io/x/feegrant/keeper"
|
|
_ "cosmossdk.io/x/feegrant/module" // import for side-effects
|
|
nftkeeper "cosmossdk.io/x/nft/keeper"
|
|
_ "cosmossdk.io/x/nft/module" // import for side-effects
|
|
_ "cosmossdk.io/x/upgrade" // import for side-effects
|
|
upgradekeeper "cosmossdk.io/x/upgrade/keeper"
|
|
dbm "github.com/cosmos/cosmos-db"
|
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
|
"github.com/cosmos/cosmos-sdk/runtime"
|
|
"github.com/cosmos/cosmos-sdk/server"
|
|
"github.com/cosmos/cosmos-sdk/server/api"
|
|
"github.com/cosmos/cosmos-sdk/server/config"
|
|
servertypes "github.com/cosmos/cosmos-sdk/server/types"
|
|
"github.com/cosmos/cosmos-sdk/types/module"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
_ "github.com/cosmos/cosmos-sdk/x/auth" // import for side-effects
|
|
authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
|
|
authsims "github.com/cosmos/cosmos-sdk/x/auth/simulation"
|
|
_ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects
|
|
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
_ "github.com/cosmos/cosmos-sdk/x/auth/vesting" // import for side-effects
|
|
authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/authz/module" // import for side-effects
|
|
_ "github.com/cosmos/cosmos-sdk/x/bank" // import for side-effects
|
|
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/consensus" // import for side-effects
|
|
consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/crisis" // import for side-effects
|
|
crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side-effects
|
|
distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
|
|
"github.com/cosmos/cosmos-sdk/x/genutil"
|
|
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
|
"github.com/cosmos/cosmos-sdk/x/gov"
|
|
govclient "github.com/cosmos/cosmos-sdk/x/gov/client"
|
|
govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
|
|
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
|
|
groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/group/module" // import for side-effects
|
|
_ "github.com/cosmos/cosmos-sdk/x/mint" // import for side-effects
|
|
mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/params" // import for side-effects
|
|
paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
|
|
paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
|
|
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
|
|
_ "github.com/cosmos/cosmos-sdk/x/slashing" // import for side-effects
|
|
slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
|
|
_ "github.com/cosmos/cosmos-sdk/x/staking" // import for side-effects
|
|
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
|
|
_ "github.com/cosmos/ibc-go/modules/capability" // import for side-effects
|
|
capabilitykeeper "github.com/cosmos/ibc-go/modules/capability/keeper"
|
|
_ "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts" // import for side-effects
|
|
icacontrollerkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/controller/keeper"
|
|
icahostkeeper "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/host/keeper"
|
|
_ "github.com/cosmos/ibc-go/v8/modules/apps/29-fee" // import for side-effects
|
|
ibcfeekeeper "github.com/cosmos/ibc-go/v8/modules/apps/29-fee/keeper"
|
|
ibctransferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper"
|
|
ibckeeper "github.com/cosmos/ibc-go/v8/modules/core/keeper"
|
|
|
|
machinemodulekeeper "github.com/planetmint/planetmint-go/x/machine/keeper"
|
|
// this line is used by starport scaffolding # stargate/app/moduleImport
|
|
|
|
docs "github.com/planetmint/planetmint-go/docs"
|
|
)
|
|
|
|
const (
|
|
AccountAddressPrefix = "plmnt"
|
|
Name = "planetmint-go"
|
|
)
|
|
|
|
var (
|
|
// DefaultNodeHome default home directories for the application daemon
|
|
DefaultNodeHome string
|
|
)
|
|
|
|
var (
|
|
_ runtime.AppI = (*App)(nil)
|
|
_ servertypes.Application = (*App)(nil)
|
|
)
|
|
|
|
// App extends an ABCI application, but with most of its parameters exported.
|
|
// They are exported for convenience in creating helper functions, as object
|
|
// capabilities aren't needed for testing.
|
|
type App struct {
|
|
*runtime.App
|
|
legacyAmino *codec.LegacyAmino
|
|
appCodec codec.Codec
|
|
txConfig client.TxConfig
|
|
interfaceRegistry codectypes.InterfaceRegistry
|
|
|
|
// keepers
|
|
AccountKeeper authkeeper.AccountKeeper
|
|
BankKeeper bankkeeper.Keeper
|
|
StakingKeeper *stakingkeeper.Keeper
|
|
DistrKeeper distrkeeper.Keeper
|
|
ConsensusParamsKeeper consensuskeeper.Keeper
|
|
|
|
SlashingKeeper slashingkeeper.Keeper
|
|
MintKeeper mintkeeper.Keeper
|
|
GovKeeper *govkeeper.Keeper
|
|
CrisisKeeper *crisiskeeper.Keeper
|
|
UpgradeKeeper *upgradekeeper.Keeper
|
|
ParamsKeeper paramskeeper.Keeper
|
|
AuthzKeeper authzkeeper.Keeper
|
|
EvidenceKeeper evidencekeeper.Keeper
|
|
FeeGrantKeeper feegrantkeeper.Keeper
|
|
GroupKeeper groupkeeper.Keeper
|
|
NFTKeeper nftkeeper.Keeper
|
|
CircuitBreakerKeeper circuitkeeper.Keeper
|
|
|
|
// IBC
|
|
IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
|
|
CapabilityKeeper *capabilitykeeper.Keeper
|
|
IBCFeeKeeper ibcfeekeeper.Keeper
|
|
ICAControllerKeeper icacontrollerkeeper.Keeper
|
|
ICAHostKeeper icahostkeeper.Keeper
|
|
TransferKeeper ibctransferkeeper.Keeper
|
|
|
|
// Scoped IBC
|
|
ScopedIBCKeeper capabilitykeeper.ScopedKeeper
|
|
ScopedIBCTransferKeeper capabilitykeeper.ScopedKeeper
|
|
ScopedICAControllerKeeper capabilitykeeper.ScopedKeeper
|
|
ScopedICAHostKeeper capabilitykeeper.ScopedKeeper
|
|
|
|
MachineKeeper machinemodulekeeper.Keeper
|
|
// this line is used by starport scaffolding # stargate/app/keeperDeclaration
|
|
|
|
// simulation manager
|
|
sm *module.SimulationManager
|
|
}
|
|
|
|
func init() {
|
|
userHomeDir, err := os.UserHomeDir()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
DefaultNodeHome = filepath.Join(userHomeDir, "."+Name)
|
|
}
|
|
|
|
// getGovProposalHandlers return the chain proposal handlers.
|
|
func getGovProposalHandlers() []govclient.ProposalHandler {
|
|
var govProposalHandlers []govclient.ProposalHandler
|
|
// this line is used by starport scaffolding # stargate/app/govProposalHandlers
|
|
|
|
govProposalHandlers = append(govProposalHandlers,
|
|
paramsclient.ProposalHandler,
|
|
// this line is used by starport scaffolding # stargate/app/govProposalHandler
|
|
)
|
|
|
|
return govProposalHandlers
|
|
}
|
|
|
|
// AppConfig returns the default app config.
|
|
func AppConfig() depinject.Config {
|
|
return depinject.Configs(
|
|
appConfig,
|
|
// Loads the app config from a YAML file.
|
|
// appconfig.LoadYAML(AppConfigYAML),
|
|
depinject.Supply(
|
|
// supply custom module basics
|
|
map[string]module.AppModuleBasic{
|
|
genutiltypes.ModuleName: genutil.NewAppModuleBasic(genutiltypes.DefaultMessageValidator),
|
|
govtypes.ModuleName: gov.NewAppModuleBasic(getGovProposalHandlers()),
|
|
// this line is used by starport scaffolding # stargate/appConfig/moduleBasic
|
|
},
|
|
),
|
|
)
|
|
}
|
|
|
|
// New returns a reference to an initialized App.
|
|
func New(
|
|
logger log.Logger,
|
|
db dbm.DB,
|
|
traceStore io.Writer,
|
|
loadLatest bool,
|
|
appOpts servertypes.AppOptions,
|
|
baseAppOptions ...func(*baseapp.BaseApp),
|
|
) (*App, error) {
|
|
var (
|
|
app = &App{}
|
|
appBuilder *runtime.AppBuilder
|
|
|
|
// merge the AppConfig and other configuration in one config
|
|
appConfig = depinject.Configs(
|
|
AppConfig(),
|
|
depinject.Supply(
|
|
// Supply the application options
|
|
appOpts,
|
|
// Supply with IBC keeper getter for the IBC modules with App Wiring.
|
|
// The IBC Keeper cannot be passed because it has not been initiated yet.
|
|
// Passing the getter, the app IBC Keeper will always be accessible.
|
|
// This needs to be removed after IBC supports App Wiring.
|
|
app.GetIBCKeeper,
|
|
app.GetCapabilityScopedKeeper,
|
|
// Supply the logger
|
|
logger,
|
|
|
|
// ADVANCED CONFIGURATION
|
|
//
|
|
// AUTH
|
|
//
|
|
// For providing a custom function required in auth to generate custom account types
|
|
// add it below. By default the auth module uses simulation.RandomGenesisAccounts.
|
|
//
|
|
// authtypes.RandomGenesisAccountsFn(simulation.RandomGenesisAccounts),
|
|
//
|
|
// For providing a custom a base account type add it below.
|
|
// By default the auth module uses authtypes.ProtoBaseAccount().
|
|
//
|
|
// func() sdk.AccountI { return authtypes.ProtoBaseAccount() },
|
|
//
|
|
// For providing a different address codec, add it below.
|
|
// By default the auth module uses a Bech32 address codec,
|
|
// with the prefix defined in the auth module configuration.
|
|
//
|
|
// func() address.Codec { return <- custom address codec type -> }
|
|
|
|
//
|
|
// STAKING
|
|
//
|
|
// For provinding a different validator and consensus address codec, add it below.
|
|
// By default the staking module uses the bech32 prefix provided in the auth config,
|
|
// and appends "valoper" and "valcons" for validator and consensus addresses respectively.
|
|
// When providing a custom address codec in auth, custom address codecs must be provided here as well.
|
|
//
|
|
// func() runtime.ValidatorAddressCodec { return <- custom validator address codec type -> }
|
|
// func() runtime.ConsensusAddressCodec { return <- custom consensus address codec type -> }
|
|
|
|
//
|
|
// MINT
|
|
//
|
|
|
|
// For providing a custom inflation function for x/mint add here your
|
|
// custom function that implements the minttypes.InflationCalculationFn
|
|
// interface.
|
|
),
|
|
)
|
|
)
|
|
|
|
if err := depinject.Inject(appConfig,
|
|
&appBuilder,
|
|
&app.appCodec,
|
|
&app.legacyAmino,
|
|
&app.txConfig,
|
|
&app.interfaceRegistry,
|
|
&app.AccountKeeper,
|
|
&app.BankKeeper,
|
|
&app.StakingKeeper,
|
|
&app.DistrKeeper,
|
|
&app.ConsensusParamsKeeper,
|
|
&app.SlashingKeeper,
|
|
&app.MintKeeper,
|
|
&app.GovKeeper,
|
|
&app.CrisisKeeper,
|
|
&app.UpgradeKeeper,
|
|
&app.ParamsKeeper,
|
|
&app.AuthzKeeper,
|
|
&app.EvidenceKeeper,
|
|
&app.FeeGrantKeeper,
|
|
&app.NFTKeeper,
|
|
&app.GroupKeeper,
|
|
&app.CircuitBreakerKeeper,
|
|
&app.MachineKeeper,
|
|
// this line is used by starport scaffolding # stargate/app/keeperDefinition
|
|
); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Below we could construct and set an application specific mempool and
|
|
// ABCI 1.0 PrepareProposal and ProcessProposal handlers. These defaults are
|
|
// already set in the SDK's BaseApp, this shows an example of how to override
|
|
// them.
|
|
//
|
|
// Example:
|
|
//
|
|
// app.App = appBuilder.Build(...)
|
|
// nonceMempool := mempool.NewSenderNonceMempool()
|
|
// abciPropHandler := NewDefaultProposalHandler(nonceMempool, app.App.BaseApp)
|
|
//
|
|
// app.App.BaseApp.SetMempool(nonceMempool)
|
|
// app.App.BaseApp.SetPrepareProposal(abciPropHandler.PrepareProposalHandler())
|
|
// app.App.BaseApp.SetProcessProposal(abciPropHandler.ProcessProposalHandler())
|
|
//
|
|
// Alternatively, you can construct BaseApp options, append those to
|
|
// baseAppOptions and pass them to the appBuilder.
|
|
//
|
|
// Example:
|
|
//
|
|
// prepareOpt = func(app *baseapp.BaseApp) {
|
|
// abciPropHandler := baseapp.NewDefaultProposalHandler(nonceMempool, app)
|
|
// app.SetPrepareProposal(abciPropHandler.PrepareProposalHandler())
|
|
// }
|
|
// baseAppOptions = append(baseAppOptions, prepareOpt)
|
|
//
|
|
// create and set vote extension handler
|
|
// voteExtOp := func(bApp *baseapp.BaseApp) {
|
|
// voteExtHandler := NewVoteExtensionHandler()
|
|
// voteExtHandler.SetHandlers(bApp)
|
|
// }
|
|
|
|
app.App = appBuilder.Build(db, traceStore, baseAppOptions...)
|
|
|
|
// Register legacy modules
|
|
if err := app.registerIBCModules(appOpts); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// register streaming services
|
|
if err := app.RegisterStreamingServices(appOpts, app.kvStoreKeys()); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
/**** Module Options ****/
|
|
|
|
app.ModuleManager.RegisterInvariants(app.CrisisKeeper)
|
|
|
|
// create the simulation manager and define the order of the modules for deterministic simulations
|
|
//
|
|
// NOTE: this is not required apps that don't use the simulator for fuzz testing transactions
|
|
overrideModules := map[string]module.AppModuleSimulation{
|
|
authtypes.ModuleName: auth.NewAppModule(app.appCodec, app.AccountKeeper, authsims.RandomGenesisAccounts, app.GetSubspace(authtypes.ModuleName)),
|
|
}
|
|
app.sm = module.NewSimulationManagerFromAppModules(app.ModuleManager.Modules, overrideModules)
|
|
app.sm.RegisterStoreDecoders()
|
|
|
|
// A custom InitChainer can be set if extra pre-init-genesis logic is required.
|
|
// By default, when using app wiring enabled module, this is not required.
|
|
// For instance, the upgrade module will set automatically the module version map in its init genesis thanks to app wiring.
|
|
// However, when registering a module manually (i.e. that does not support app wiring), the module version map
|
|
// must be set manually as follow. The upgrade module will de-duplicate the module version map.
|
|
//
|
|
// app.SetInitChainer(func(ctx sdk.Context, req *abci.RequestInitChain) (*abci.ResponseInitChain, error) {
|
|
// app.UpgradeKeeper.SetModuleVersionMap(ctx, app.ModuleManager.GetVersionMap())
|
|
// return app.App.InitChainer(ctx, req)
|
|
// })
|
|
|
|
if err := app.Load(loadLatest); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return app, nil
|
|
}
|
|
|
|
// LegacyAmino returns App's amino codec.
|
|
//
|
|
// NOTE: This is solely to be used for testing purposes as it may be desirable
|
|
// for modules to register their own custom testing types.
|
|
func (app *App) LegacyAmino() *codec.LegacyAmino {
|
|
return app.legacyAmino
|
|
}
|
|
|
|
// AppCodec returns App's app codec.
|
|
//
|
|
// NOTE: This is solely to be used for testing purposes as it may be desirable
|
|
// for modules to register their own custom testing types.
|
|
func (app *App) AppCodec() codec.Codec {
|
|
return app.appCodec
|
|
}
|
|
|
|
// GetKey returns the KVStoreKey for the provided store key.
|
|
func (app *App) GetKey(storeKey string) *storetypes.KVStoreKey {
|
|
kvStoreKey, ok := app.UnsafeFindStoreKey(storeKey).(*storetypes.KVStoreKey)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
return kvStoreKey
|
|
}
|
|
|
|
// GetMemKey returns the MemoryStoreKey for the provided store key.
|
|
func (app *App) GetMemKey(storeKey string) *storetypes.MemoryStoreKey {
|
|
key, ok := app.UnsafeFindStoreKey(storeKey).(*storetypes.MemoryStoreKey)
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
return key
|
|
}
|
|
|
|
// kvStoreKeys returns all the kv store keys registered inside App.
|
|
func (app *App) kvStoreKeys() map[string]*storetypes.KVStoreKey {
|
|
keys := make(map[string]*storetypes.KVStoreKey)
|
|
for _, k := range app.GetStoreKeys() {
|
|
if kv, ok := k.(*storetypes.KVStoreKey); ok {
|
|
keys[kv.Name()] = kv
|
|
}
|
|
}
|
|
|
|
return keys
|
|
}
|
|
|
|
// GetSubspace returns a param subspace for a given module name.
|
|
func (app *App) GetSubspace(moduleName string) paramstypes.Subspace {
|
|
subspace, _ := app.ParamsKeeper.GetSubspace(moduleName)
|
|
return subspace
|
|
}
|
|
|
|
// GetIBCKeeper returns the IBC keeper.
|
|
func (app *App) GetIBCKeeper() *ibckeeper.Keeper {
|
|
return app.IBCKeeper
|
|
}
|
|
|
|
// GetCapabilityScopedKeeper returns the capability scoped keeper.
|
|
func (app *App) GetCapabilityScopedKeeper(moduleName string) capabilitykeeper.ScopedKeeper {
|
|
return app.CapabilityKeeper.ScopeToModule(moduleName)
|
|
}
|
|
|
|
// SimulationManager implements the SimulationApp interface.
|
|
func (app *App) SimulationManager() *module.SimulationManager {
|
|
return app.sm
|
|
}
|
|
|
|
// RegisterAPIRoutes registers all application module routes with the provided
|
|
// API server.
|
|
func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) {
|
|
app.App.RegisterAPIRoutes(apiSvr, apiConfig)
|
|
// register swagger API in app.go so that other applications can override easily
|
|
if err := server.RegisterSwaggerAPI(apiSvr.ClientCtx, apiSvr.Router, apiConfig.Swagger); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// register app's OpenAPI routes.
|
|
docs.RegisterOpenAPIService(Name, apiSvr.Router)
|
|
}
|
|
|
|
// GetMaccPerms returns a copy of the module account permissions
|
|
//
|
|
// NOTE: This is solely to be used for testing purposes.
|
|
func GetMaccPerms() map[string][]string {
|
|
dup := make(map[string][]string)
|
|
for _, perms := range moduleAccPerms {
|
|
dup[perms.Account] = perms.Permissions
|
|
}
|
|
return dup
|
|
}
|
|
|
|
// BlockedAddresses returns all the app's blocked account addresses.
|
|
func BlockedAddresses() map[string]bool {
|
|
result := make(map[string]bool)
|
|
if len(blockAccAddrs) > 0 {
|
|
for _, addr := range blockAccAddrs {
|
|
result[addr] = true
|
|
}
|
|
} else {
|
|
for addr := range GetMaccPerms() {
|
|
result[addr] = true
|
|
}
|
|
}
|
|
return result
|
|
}
|