app.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. package app
  2. import (
  3. "io"
  4. "net/http"
  5. "os"
  6. "path/filepath"
  7. "github.com/cosmos/cosmos-sdk/baseapp"
  8. "github.com/cosmos/cosmos-sdk/client"
  9. "github.com/cosmos/cosmos-sdk/client/grpc/tmservice"
  10. "github.com/cosmos/cosmos-sdk/client/rpc"
  11. "github.com/cosmos/cosmos-sdk/codec"
  12. "github.com/cosmos/cosmos-sdk/codec/types"
  13. "github.com/cosmos/cosmos-sdk/server/api"
  14. "github.com/cosmos/cosmos-sdk/server/config"
  15. servertypes "github.com/cosmos/cosmos-sdk/server/types"
  16. sdk "github.com/cosmos/cosmos-sdk/types"
  17. "github.com/cosmos/cosmos-sdk/types/module"
  18. "github.com/cosmos/cosmos-sdk/version"
  19. "github.com/cosmos/cosmos-sdk/x/auth"
  20. "github.com/cosmos/cosmos-sdk/x/auth/ante"
  21. authrest "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
  22. authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper"
  23. authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
  24. authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
  25. "github.com/cosmos/cosmos-sdk/x/auth/vesting"
  26. vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
  27. "github.com/cosmos/cosmos-sdk/x/bank"
  28. bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
  29. banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
  30. "github.com/cosmos/cosmos-sdk/x/capability"
  31. capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
  32. capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
  33. "github.com/cosmos/cosmos-sdk/x/crisis"
  34. crisiskeeper "github.com/cosmos/cosmos-sdk/x/crisis/keeper"
  35. crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
  36. distr "github.com/cosmos/cosmos-sdk/x/distribution"
  37. distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client"
  38. distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
  39. distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
  40. "github.com/cosmos/cosmos-sdk/x/evidence"
  41. evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper"
  42. evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types"
  43. "github.com/cosmos/cosmos-sdk/x/feegrant"
  44. feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper"
  45. feegrantmodule "github.com/cosmos/cosmos-sdk/x/feegrant/module"
  46. "github.com/cosmos/cosmos-sdk/x/genutil"
  47. genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
  48. "github.com/cosmos/cosmos-sdk/x/gov"
  49. govclient "github.com/cosmos/cosmos-sdk/x/gov/client"
  50. govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper"
  51. govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
  52. "github.com/cosmos/cosmos-sdk/x/mint"
  53. mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper"
  54. minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
  55. "github.com/cosmos/cosmos-sdk/x/params"
  56. paramsclient "github.com/cosmos/cosmos-sdk/x/params/client"
  57. paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper"
  58. paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
  59. paramproposal "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
  60. "github.com/cosmos/cosmos-sdk/x/slashing"
  61. slashingkeeper "github.com/cosmos/cosmos-sdk/x/slashing/keeper"
  62. slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
  63. "github.com/cosmos/cosmos-sdk/x/staking"
  64. stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
  65. stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
  66. "github.com/cosmos/cosmos-sdk/x/upgrade"
  67. upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client"
  68. upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
  69. upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
  70. "github.com/cosmos/ibc-go/v3/modules/apps/transfer"
  71. ibctransferkeeper "github.com/cosmos/ibc-go/v3/modules/apps/transfer/keeper"
  72. ibctransfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types"
  73. ibc "github.com/cosmos/ibc-go/v3/modules/core"
  74. ibcclient "github.com/cosmos/ibc-go/v3/modules/core/02-client"
  75. ibcporttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types"
  76. ibchost "github.com/cosmos/ibc-go/v3/modules/core/24-host"
  77. ibckeeper "github.com/cosmos/ibc-go/v3/modules/core/keeper"
  78. "github.com/prometheus/client_golang/prometheus"
  79. "github.com/spf13/cast"
  80. abci "github.com/tendermint/tendermint/abci/types"
  81. tmjson "github.com/tendermint/tendermint/libs/json"
  82. "github.com/tendermint/tendermint/libs/log"
  83. tmos "github.com/tendermint/tendermint/libs/os"
  84. dbm "github.com/tendermint/tm-db"
  85. "github.com/CosmWasm/wasmd/x/wasm"
  86. wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper"
  87. "github.com/tendermint/spm/cosmoscmd"
  88. "github.com/tendermint/spm/openapiconsole"
  89. "github.com/wormhole-foundation/wormchain/docs"
  90. wormholemodule "github.com/wormhole-foundation/wormchain/x/wormhole"
  91. wormholemoduleante "github.com/wormhole-foundation/wormchain/x/wormhole/ante"
  92. wormholeclient "github.com/wormhole-foundation/wormchain/x/wormhole/client"
  93. wormholemodulekeeper "github.com/wormhole-foundation/wormchain/x/wormhole/keeper"
  94. wormholemoduletypes "github.com/wormhole-foundation/wormchain/x/wormhole/types"
  95. // this line is used by starport scaffolding # stargate/app/moduleImport
  96. )
  97. const (
  98. AccountAddressPrefix = "wormhole"
  99. Name = "wormchain"
  100. )
  101. // this line is used by starport scaffolding # stargate/wasm/app/enabledProposals
  102. func getGovProposalHandlers() []govclient.ProposalHandler {
  103. var govProposalHandlers []govclient.ProposalHandler
  104. // this line is used by starport scaffolding # stargate/app/govProposalHandlers
  105. govProposalHandlers = append(govProposalHandlers,
  106. paramsclient.ProposalHandler,
  107. distrclient.ProposalHandler,
  108. upgradeclient.ProposalHandler,
  109. upgradeclient.CancelProposalHandler,
  110. wormholeclient.GuardianSetUpdateProposalHandler,
  111. wormholeclient.WormholeGovernanceMessageProposalHandler,
  112. // this line is used by starport scaffolding # stargate/app/govProposalHandler
  113. )
  114. return govProposalHandlers
  115. }
  116. // GetWasmOpts build wasm options
  117. func GetWasmOpts(app *App, appOpts servertypes.AppOptions) []wasm.Option {
  118. var wasmOpts []wasm.Option
  119. if cast.ToBool(appOpts.Get("telemetry.enabled")) {
  120. wasmOpts = append(wasmOpts, wasmkeeper.WithVMCacheMetrics(prometheus.DefaultRegisterer))
  121. }
  122. // add the custom wormhole query handler
  123. wasmOpts = append(wasmOpts, wasmkeeper.WithQueryPlugins(wormholemodulekeeper.NewCustomQueryHandler(app.WormholeKeeper)))
  124. return wasmOpts
  125. }
  126. var (
  127. // DefaultNodeHome default home directories for the application daemon
  128. DefaultNodeHome string
  129. // ModuleBasics defines the module BasicManager is in charge of setting up basic,
  130. // non-dependant module elements, such as codec registration
  131. // and genesis verification.
  132. ModuleBasics = module.NewBasicManager(
  133. auth.AppModuleBasic{},
  134. genutil.AppModuleBasic{},
  135. bank.AppModuleBasic{},
  136. capability.AppModuleBasic{},
  137. staking.AppModuleBasic{},
  138. mint.AppModuleBasic{},
  139. distr.AppModuleBasic{},
  140. gov.NewAppModuleBasic(getGovProposalHandlers()...),
  141. params.AppModuleBasic{},
  142. crisis.AppModuleBasic{},
  143. slashing.AppModuleBasic{},
  144. feegrantmodule.AppModuleBasic{},
  145. ibc.AppModuleBasic{},
  146. upgrade.AppModuleBasic{},
  147. evidence.AppModuleBasic{},
  148. transfer.AppModuleBasic{},
  149. vesting.AppModuleBasic{},
  150. wormholemodule.AppModuleBasic{},
  151. // this line is used by starport scaffolding # stargate/app/moduleBasic
  152. wasm.AppModuleBasic{},
  153. )
  154. // module account permissions
  155. maccPerms = map[string][]string{
  156. authtypes.FeeCollectorName: nil,
  157. distrtypes.ModuleName: nil,
  158. minttypes.ModuleName: {authtypes.Minter},
  159. stakingtypes.BondedPoolName: {authtypes.Burner, authtypes.Staking},
  160. stakingtypes.NotBondedPoolName: {authtypes.Burner, authtypes.Staking},
  161. govtypes.ModuleName: {authtypes.Burner},
  162. ibctransfertypes.ModuleName: {authtypes.Minter, authtypes.Burner},
  163. wormholemoduletypes.ModuleName: nil,
  164. // this line is used by starport scaffolding # stargate/app/maccPerms
  165. wasm.ModuleName: {authtypes.Burner},
  166. }
  167. )
  168. var (
  169. _ cosmoscmd.CosmosApp = (*App)(nil)
  170. _ servertypes.Application = (*App)(nil)
  171. )
  172. func init() {
  173. userHomeDir, err := os.UserHomeDir()
  174. if err != nil {
  175. panic(err)
  176. }
  177. DefaultNodeHome = filepath.Join(userHomeDir, "."+Name)
  178. }
  179. // App extends an ABCI application, but with most of its parameters exported.
  180. // They are exported for convenience in creating helper functions, as object
  181. // capabilities aren't needed for testing.
  182. type App struct {
  183. *baseapp.BaseApp
  184. cdc *codec.LegacyAmino
  185. appCodec codec.Codec
  186. interfaceRegistry types.InterfaceRegistry
  187. invCheckPeriod uint
  188. // keys to access the substores
  189. keys map[string]*sdk.KVStoreKey
  190. tkeys map[string]*sdk.TransientStoreKey
  191. memKeys map[string]*sdk.MemoryStoreKey
  192. // keepers
  193. AccountKeeper authkeeper.AccountKeeper
  194. BankKeeper bankkeeper.Keeper
  195. CapabilityKeeper *capabilitykeeper.Keeper
  196. StakingKeeper stakingkeeper.Keeper
  197. SlashingKeeper slashingkeeper.Keeper
  198. MintKeeper mintkeeper.Keeper
  199. DistrKeeper distrkeeper.Keeper
  200. GovKeeper govkeeper.Keeper
  201. CrisisKeeper crisiskeeper.Keeper
  202. UpgradeKeeper upgradekeeper.Keeper
  203. ParamsKeeper paramskeeper.Keeper
  204. IBCKeeper *ibckeeper.Keeper // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
  205. EvidenceKeeper evidencekeeper.Keeper
  206. TransferKeeper ibctransferkeeper.Keeper
  207. FeeGrantKeeper feegrantkeeper.Keeper
  208. // make scoped keepers public for test purposes
  209. ScopedIBCKeeper capabilitykeeper.ScopedKeeper
  210. ScopedTransferKeeper capabilitykeeper.ScopedKeeper
  211. WormholeKeeper wormholemodulekeeper.Keeper
  212. // this line is used by starport scaffolding # stargate/app/keeperDeclaration
  213. wasmKeeper wasm.Keeper
  214. scopedWasmKeeper capabilitykeeper.ScopedKeeper
  215. // the module manager
  216. mm *module.Manager
  217. }
  218. // New returns a reference to an initialized Gaia.
  219. func New(
  220. logger log.Logger,
  221. db dbm.DB,
  222. traceStore io.Writer,
  223. loadLatest bool,
  224. skipUpgradeHeights map[int64]bool,
  225. homePath string,
  226. invCheckPeriod uint,
  227. encodingConfig cosmoscmd.EncodingConfig,
  228. appOpts servertypes.AppOptions,
  229. baseAppOptions ...func(*baseapp.BaseApp),
  230. ) cosmoscmd.App {
  231. appCodec := encodingConfig.Marshaler
  232. cdc := encodingConfig.Amino
  233. interfaceRegistry := encodingConfig.InterfaceRegistry
  234. bApp := baseapp.NewBaseApp(Name, logger, db, encodingConfig.TxConfig.TxDecoder(), baseAppOptions...)
  235. bApp.SetCommitMultiStoreTracer(traceStore)
  236. bApp.SetVersion(version.Version)
  237. bApp.SetInterfaceRegistry(interfaceRegistry)
  238. keys := sdk.NewKVStoreKeys(
  239. authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey,
  240. minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey,
  241. govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey, feegrant.StoreKey,
  242. evidencetypes.StoreKey, ibctransfertypes.StoreKey, capabilitytypes.StoreKey,
  243. wormholemoduletypes.StoreKey,
  244. // this line is used by starport scaffolding # stargate/app/storeKey
  245. wasm.StoreKey,
  246. )
  247. tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
  248. memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
  249. app := &App{
  250. BaseApp: bApp,
  251. cdc: cdc,
  252. appCodec: appCodec,
  253. interfaceRegistry: interfaceRegistry,
  254. invCheckPeriod: invCheckPeriod,
  255. keys: keys,
  256. tkeys: tkeys,
  257. memKeys: memKeys,
  258. }
  259. app.ParamsKeeper = initParamsKeeper(appCodec, cdc, keys[paramstypes.StoreKey], tkeys[paramstypes.TStoreKey])
  260. // set the BaseApp's parameter store
  261. bApp.SetParamStore(app.ParamsKeeper.Subspace(baseapp.Paramspace).WithKeyTable(paramskeeper.ConsensusParamsKeyTable()))
  262. // add capability keeper and ScopeToModule for ibc module
  263. app.CapabilityKeeper = capabilitykeeper.NewKeeper(appCodec, keys[capabilitytypes.StoreKey], memKeys[capabilitytypes.MemStoreKey])
  264. // grant capabilities for the ibc and ibc-transfer modules
  265. scopedIBCKeeper := app.CapabilityKeeper.ScopeToModule(ibchost.ModuleName)
  266. scopedTransferKeeper := app.CapabilityKeeper.ScopeToModule(ibctransfertypes.ModuleName)
  267. // this line is used by starport scaffolding # stargate/app/scopedKeeper
  268. scopedWasmKeeper := app.CapabilityKeeper.ScopeToModule(wasm.ModuleName)
  269. // add keepers
  270. app.AccountKeeper = authkeeper.NewAccountKeeper(
  271. appCodec, keys[authtypes.StoreKey], app.GetSubspace(authtypes.ModuleName), authtypes.ProtoBaseAccount, maccPerms,
  272. )
  273. app.BankKeeper = bankkeeper.NewBaseKeeper(
  274. appCodec, keys[banktypes.StoreKey], app.AccountKeeper, app.GetSubspace(banktypes.ModuleName), app.ModuleAccountAddrs(),
  275. )
  276. app.WormholeKeeper = *wormholemodulekeeper.NewKeeper(
  277. appCodec,
  278. keys[wormholemoduletypes.StoreKey],
  279. keys[wormholemoduletypes.MemStoreKey],
  280. app.AccountKeeper,
  281. app.BankKeeper,
  282. )
  283. stakingKeeper := stakingkeeper.NewKeeper(
  284. appCodec, keys[stakingtypes.StoreKey], app.AccountKeeper, app.BankKeeper, app.WormholeKeeper, app.GetSubspace(stakingtypes.ModuleName),
  285. )
  286. app.MintKeeper = mintkeeper.NewKeeper(
  287. appCodec, keys[minttypes.StoreKey], app.GetSubspace(minttypes.ModuleName), &stakingKeeper,
  288. app.AccountKeeper, app.BankKeeper, authtypes.FeeCollectorName,
  289. )
  290. app.DistrKeeper = distrkeeper.NewKeeper(
  291. appCodec, keys[distrtypes.StoreKey], app.GetSubspace(distrtypes.ModuleName), app.AccountKeeper, app.BankKeeper,
  292. &stakingKeeper, authtypes.FeeCollectorName, app.ModuleAccountAddrs(),
  293. )
  294. app.SlashingKeeper = slashingkeeper.NewKeeper(
  295. appCodec, keys[slashingtypes.StoreKey], &stakingKeeper, app.GetSubspace(slashingtypes.ModuleName),
  296. )
  297. app.CrisisKeeper = crisiskeeper.NewKeeper(
  298. app.GetSubspace(crisistypes.ModuleName), invCheckPeriod, app.BankKeeper, authtypes.FeeCollectorName,
  299. )
  300. app.FeeGrantKeeper = feegrantkeeper.NewKeeper(appCodec, keys[feegrant.StoreKey], app.AccountKeeper)
  301. app.UpgradeKeeper = upgradekeeper.NewKeeper(skipUpgradeHeights, keys[upgradetypes.StoreKey], appCodec, homePath, app.BaseApp)
  302. // register the staking hooks
  303. // NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
  304. app.StakingKeeper = *stakingKeeper.SetHooks(
  305. stakingtypes.NewMultiStakingHooks(app.DistrKeeper.Hooks(), app.SlashingKeeper.Hooks()),
  306. )
  307. // ... other modules keepers
  308. // Create IBC Keeper
  309. app.IBCKeeper = ibckeeper.NewKeeper(
  310. appCodec, keys[ibchost.StoreKey], app.GetSubspace(ibchost.ModuleName), app.StakingKeeper, app.UpgradeKeeper, scopedIBCKeeper,
  311. )
  312. // register the proposal types
  313. govRouter := govtypes.NewRouter()
  314. govRouter.AddRoute(govtypes.RouterKey, govtypes.ProposalHandler).
  315. AddRoute(paramproposal.RouterKey, params.NewParamChangeProposalHandler(app.ParamsKeeper)).
  316. AddRoute(distrtypes.RouterKey, distr.NewCommunityPoolSpendProposalHandler(app.DistrKeeper)).
  317. AddRoute(upgradetypes.RouterKey, upgrade.NewSoftwareUpgradeProposalHandler(app.UpgradeKeeper)).
  318. AddRoute(ibchost.RouterKey, ibcclient.NewClientProposalHandler(app.IBCKeeper.ClientKeeper))
  319. // Create Transfer Keepers
  320. app.TransferKeeper = ibctransferkeeper.NewKeeper(
  321. appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName),
  322. app.IBCKeeper.ChannelKeeper, app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
  323. app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,
  324. )
  325. transferModule := transfer.NewAppModule(app.TransferKeeper)
  326. transferIBCModule := transfer.NewIBCModule(app.TransferKeeper)
  327. // Create evidence Keeper for to register the IBC light client misbehaviour evidence route
  328. evidenceKeeper := evidencekeeper.NewKeeper(
  329. appCodec, keys[evidencetypes.StoreKey], &app.StakingKeeper, app.SlashingKeeper,
  330. )
  331. // If evidence needs to be handled for the app, set routes in router here and seal
  332. app.EvidenceKeeper = *evidenceKeeper
  333. govRouter.AddRoute(wormholemoduletypes.RouterKey, wormholemodule.NewWormholeGovernanceProposalHandler(app.WormholeKeeper))
  334. app.GovKeeper = govkeeper.NewKeeper(
  335. appCodec, keys[govtypes.StoreKey], app.GetSubspace(govtypes.ModuleName), app.AccountKeeper, app.BankKeeper,
  336. &stakingKeeper, govRouter,
  337. )
  338. // The last arguments can contain custom message handlers, and custom query handlers,
  339. // if we want to allow any custom callbacks
  340. supportedFeatures := "iterator,staking,stargate,wormhole"
  341. wasmDir := filepath.Join(homePath, "data")
  342. // Instantiate wasm keeper with stubs for other modules as we do not need
  343. // wasm to be able to write to other modules.
  344. app.wasmKeeper = wasm.NewKeeper(
  345. appCodec,
  346. keys[wasm.StoreKey],
  347. app.GetSubspace(wasm.ModuleName),
  348. app.AccountKeeper,
  349. app.BankKeeper,
  350. app.StakingKeeper,
  351. app.DistrKeeper,
  352. app.IBCKeeper.ChannelKeeper,
  353. &app.IBCKeeper.PortKeeper,
  354. scopedWasmKeeper,
  355. app.TransferKeeper,
  356. app.MsgServiceRouter(),
  357. app.GRPCQueryRouter(),
  358. wasmDir,
  359. wasm.DefaultWasmConfig(),
  360. // wasmConfig.ToWasmConfig(),
  361. supportedFeatures,
  362. GetWasmOpts(app, appOpts)...,
  363. )
  364. permissionedWasmKeeper := wasmkeeper.NewDefaultPermissionKeeper(app.wasmKeeper)
  365. app.WormholeKeeper.SetWasmdKeeper(permissionedWasmKeeper)
  366. // the wormhole module must be instantiated after the wasmd module
  367. wormholeModule := wormholemodule.NewAppModule(appCodec, app.WormholeKeeper)
  368. // this line is used by starport scaffolding # stargate/app/keeperDefinition
  369. // Create static IBC router, add transfer route, then set and seal it
  370. ibcRouter := ibcporttypes.NewRouter()
  371. ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferIBCModule)
  372. // this line is used by starport scaffolding # ibc/app/router
  373. app.IBCKeeper.SetRouter(ibcRouter)
  374. /**** Module Options ****/
  375. // NOTE: we may consider parsing `appOpts` inside module constructors. For the moment
  376. // we prefer to be more strict in what arguments the modules expect.
  377. var skipGenesisInvariants = cast.ToBool(appOpts.Get(crisis.FlagSkipGenesisInvariants))
  378. // NOTE: Any module instantiated in the module manager that is later modified
  379. // must be passed by reference here.
  380. app.mm = module.NewManager(
  381. genutil.NewAppModule(
  382. app.AccountKeeper, app.StakingKeeper, app.BaseApp.DeliverTx,
  383. encodingConfig.TxConfig,
  384. ),
  385. auth.NewAppModule(appCodec, app.AccountKeeper, nil),
  386. vesting.NewAppModule(app.AccountKeeper, app.BankKeeper),
  387. bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper),
  388. capability.NewAppModule(appCodec, *app.CapabilityKeeper),
  389. feegrantmodule.NewAppModule(appCodec, app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, app.interfaceRegistry),
  390. crisis.NewAppModule(&app.CrisisKeeper, skipGenesisInvariants),
  391. gov.NewAppModule(appCodec, app.GovKeeper, app.AccountKeeper, app.BankKeeper),
  392. mint.NewAppModule(appCodec, app.MintKeeper, app.AccountKeeper),
  393. slashing.NewAppModule(appCodec, app.SlashingKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper),
  394. distr.NewAppModule(appCodec, app.DistrKeeper, app.AccountKeeper, app.BankKeeper, app.StakingKeeper),
  395. staking.NewAppModule(appCodec, app.StakingKeeper, app.AccountKeeper, app.BankKeeper, app.WormholeKeeper),
  396. upgrade.NewAppModule(app.UpgradeKeeper),
  397. evidence.NewAppModule(app.EvidenceKeeper),
  398. ibc.NewAppModule(app.IBCKeeper),
  399. params.NewAppModule(app.ParamsKeeper),
  400. transferModule,
  401. wormholeModule,
  402. // this line is used by starport scaffolding # stargate/app/appModule
  403. wasm.NewAppModule(appCodec, &app.wasmKeeper, app.StakingKeeper, app.AccountKeeper, app.BankKeeper),
  404. )
  405. // During begin block slashing happens after distr.BeginBlocker so that
  406. // there is nothing left over in the validator fee pool, so as to keep the
  407. // CanWithdrawInvariant invariant.
  408. // NOTE: staking module is required if HistoricalEntries param > 0
  409. app.mm.SetOrderBeginBlockers(
  410. upgradetypes.ModuleName,
  411. capabilitytypes.ModuleName,
  412. minttypes.ModuleName,
  413. distrtypes.ModuleName,
  414. slashingtypes.ModuleName,
  415. evidencetypes.ModuleName,
  416. stakingtypes.ModuleName,
  417. vestingtypes.ModuleName,
  418. ibchost.ModuleName,
  419. ibctransfertypes.ModuleName,
  420. authtypes.ModuleName,
  421. banktypes.ModuleName,
  422. govtypes.ModuleName,
  423. crisistypes.ModuleName,
  424. genutiltypes.ModuleName,
  425. feegrant.ModuleName,
  426. paramstypes.ModuleName,
  427. wormholemoduletypes.ModuleName,
  428. // this line is used by starport scaffolding # stargate/app/beginBlockers
  429. wasm.ModuleName,
  430. )
  431. app.mm.SetOrderEndBlockers(
  432. crisistypes.ModuleName,
  433. govtypes.ModuleName,
  434. stakingtypes.ModuleName,
  435. capabilitytypes.ModuleName,
  436. authtypes.ModuleName,
  437. banktypes.ModuleName,
  438. distrtypes.ModuleName,
  439. slashingtypes.ModuleName,
  440. vestingtypes.ModuleName,
  441. minttypes.ModuleName,
  442. genutiltypes.ModuleName,
  443. evidencetypes.ModuleName,
  444. feegrant.ModuleName,
  445. paramstypes.ModuleName,
  446. upgradetypes.ModuleName,
  447. ibchost.ModuleName,
  448. ibctransfertypes.ModuleName,
  449. wormholemoduletypes.ModuleName,
  450. // this line is used by starport scaffolding # stargate/app/endBlockers
  451. wasm.ModuleName,
  452. )
  453. // NOTE: The genutils module must occur after staking so that pools are
  454. // properly initialized with tokens from genesis accounts.
  455. // NOTE: Capability module must occur first so that it can initialize any capabilities
  456. // so that other modules that want to create or claim capabilities afterwards in InitChain
  457. // can do so safely.
  458. // NOTE: The wormhole module must occur before staking so that the consensus
  459. // guardian set is properly initialised before the staking module allocates
  460. // voting power in its genesis handler
  461. app.mm.SetOrderInitGenesis(
  462. capabilitytypes.ModuleName,
  463. authtypes.ModuleName,
  464. banktypes.ModuleName,
  465. distrtypes.ModuleName,
  466. wormholemoduletypes.ModuleName,
  467. stakingtypes.ModuleName,
  468. vestingtypes.ModuleName,
  469. slashingtypes.ModuleName,
  470. govtypes.ModuleName,
  471. minttypes.ModuleName,
  472. crisistypes.ModuleName,
  473. ibchost.ModuleName,
  474. genutiltypes.ModuleName,
  475. evidencetypes.ModuleName,
  476. paramstypes.ModuleName,
  477. upgradetypes.ModuleName,
  478. ibctransfertypes.ModuleName,
  479. feegrant.ModuleName,
  480. // this line is used by starport scaffolding # stargate/app/initGenesis
  481. wasm.ModuleName,
  482. )
  483. app.mm.RegisterInvariants(&app.CrisisKeeper)
  484. app.mm.RegisterRoutes(app.Router(), app.QueryRouter(), encodingConfig.Amino)
  485. app.mm.RegisterServices(module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter()))
  486. // initialize stores
  487. app.MountKVStores(keys)
  488. app.MountTransientStores(tkeys)
  489. app.MountMemoryStores(memKeys)
  490. // initialize BaseApp
  491. app.SetInitChainer(app.InitChainer)
  492. app.SetBeginBlocker(app.BeginBlocker)
  493. anteHandlerSdk, err := ante.NewAnteHandler(
  494. ante.HandlerOptions{
  495. AccountKeeper: app.AccountKeeper,
  496. BankKeeper: app.BankKeeper,
  497. SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
  498. FeegrantKeeper: app.FeeGrantKeeper,
  499. SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
  500. },
  501. )
  502. if err != nil {
  503. panic(err)
  504. }
  505. wrappedAnteHandler := WrapAnteHandler(anteHandlerSdk, app.WormholeKeeper)
  506. app.SetAnteHandler(wrappedAnteHandler)
  507. app.SetEndBlocker(app.EndBlocker)
  508. if loadLatest {
  509. if err := app.LoadLatestVersion(); err != nil {
  510. tmos.Exit(err.Error())
  511. }
  512. }
  513. app.ScopedIBCKeeper = scopedIBCKeeper
  514. app.ScopedTransferKeeper = scopedTransferKeeper
  515. // this line is used by starport scaffolding # stargate/app/beforeInitReturn
  516. app.scopedWasmKeeper = scopedWasmKeeper
  517. return app
  518. }
  519. // Wrap the standard cosmos-sdk antehandlers with our wormhole allowlist antehandler.
  520. func WrapAnteHandler(originalHandler sdk.AnteHandler, wormKeeper wormholemodulekeeper.Keeper) sdk.AnteHandler {
  521. whHandler := wormholemoduleante.NewWormholeAllowlistDecorator(wormKeeper)
  522. return func(ctx sdk.Context, tx sdk.Tx, simulate bool) (sdk.Context, error) {
  523. newCtx, err := originalHandler(ctx, tx, simulate)
  524. if err != nil {
  525. return newCtx, err
  526. }
  527. return whHandler.AnteHandle(ctx, tx, simulate, func(ctx sdk.Context, tx sdk.Tx, simulate bool) (sdk.Context, error) {
  528. return ctx, nil
  529. })
  530. }
  531. }
  532. // Name returns the name of the App
  533. func (app *App) Name() string { return app.BaseApp.Name() }
  534. // BeginBlocker application updates every begin block
  535. func (app *App) BeginBlocker(ctx sdk.Context, req abci.RequestBeginBlock) abci.ResponseBeginBlock {
  536. return app.mm.BeginBlock(ctx, req)
  537. }
  538. // EndBlocker application updates every end block
  539. func (app *App) EndBlocker(ctx sdk.Context, req abci.RequestEndBlock) abci.ResponseEndBlock {
  540. return app.mm.EndBlock(ctx, req)
  541. }
  542. // InitChainer application update at chain initialization
  543. func (app *App) InitChainer(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
  544. var genesisState GenesisState
  545. if err := tmjson.Unmarshal(req.AppStateBytes, &genesisState); err != nil {
  546. panic(err)
  547. }
  548. app.UpgradeKeeper.SetModuleVersionMap(ctx, app.mm.GetVersionMap())
  549. return app.mm.InitGenesis(ctx, app.appCodec, genesisState)
  550. }
  551. // LoadHeight loads a particular height
  552. func (app *App) LoadHeight(height int64) error {
  553. return app.LoadVersion(height)
  554. }
  555. // ModuleAccountAddrs returns all the app's module account addresses.
  556. func (app *App) ModuleAccountAddrs() map[string]bool {
  557. modAccAddrs := make(map[string]bool)
  558. for acc := range maccPerms {
  559. modAccAddrs[authtypes.NewModuleAddress(acc).String()] = true
  560. }
  561. return modAccAddrs
  562. }
  563. // LegacyAmino returns SimApp's amino codec.
  564. //
  565. // NOTE: This is solely to be used for testing purposes as it may be desirable
  566. // for modules to register their own custom testing types.
  567. func (app *App) LegacyAmino() *codec.LegacyAmino {
  568. return app.cdc
  569. }
  570. // AppCodec returns Gaia's app codec.
  571. //
  572. // NOTE: This is solely to be used for testing purposes as it may be desirable
  573. // for modules to register their own custom testing types.
  574. func (app *App) AppCodec() codec.Codec {
  575. return app.appCodec
  576. }
  577. // InterfaceRegistry returns Gaia's InterfaceRegistry
  578. func (app *App) InterfaceRegistry() types.InterfaceRegistry {
  579. return app.interfaceRegistry
  580. }
  581. // GetKey returns the KVStoreKey for the provided store key.
  582. //
  583. // NOTE: This is solely to be used for testing purposes.
  584. func (app *App) GetKey(storeKey string) *sdk.KVStoreKey {
  585. return app.keys[storeKey]
  586. }
  587. // GetTKey returns the TransientStoreKey for the provided store key.
  588. //
  589. // NOTE: This is solely to be used for testing purposes.
  590. func (app *App) GetTKey(storeKey string) *sdk.TransientStoreKey {
  591. return app.tkeys[storeKey]
  592. }
  593. // GetMemKey returns the MemStoreKey for the provided mem key.
  594. //
  595. // NOTE: This is solely used for testing purposes.
  596. func (app *App) GetMemKey(storeKey string) *sdk.MemoryStoreKey {
  597. return app.memKeys[storeKey]
  598. }
  599. // GetSubspace returns a param subspace for a given module name.
  600. //
  601. // NOTE: This is solely to be used for testing purposes.
  602. func (app *App) GetSubspace(moduleName string) paramstypes.Subspace {
  603. subspace, _ := app.ParamsKeeper.GetSubspace(moduleName)
  604. return subspace
  605. }
  606. // RegisterAPIRoutes registers all application module routes with the provided
  607. // API server.
  608. func (app *App) RegisterAPIRoutes(apiSvr *api.Server, apiConfig config.APIConfig) {
  609. clientCtx := apiSvr.ClientCtx
  610. rpc.RegisterRoutes(clientCtx, apiSvr.Router)
  611. // Register legacy tx routes.
  612. authrest.RegisterTxRoutes(clientCtx, apiSvr.Router)
  613. // Register new tx routes from grpc-gateway.
  614. authtx.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
  615. // Register new tendermint queries routes from grpc-gateway.
  616. tmservice.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
  617. // Register legacy and grpc-gateway routes for all modules.
  618. ModuleBasics.RegisterRESTRoutes(clientCtx, apiSvr.Router)
  619. ModuleBasics.RegisterGRPCGatewayRoutes(clientCtx, apiSvr.GRPCGatewayRouter)
  620. // register app's OpenAPI routes.
  621. apiSvr.Router.Handle("/static/openapi.yml", http.FileServer(http.FS(docs.Docs)))
  622. apiSvr.Router.HandleFunc("/", openapiconsole.Handler(Name, "/static/openapi.yml"))
  623. }
  624. // RegisterTxService implements the Application.RegisterTxService method.
  625. func (app *App) RegisterTxService(clientCtx client.Context) {
  626. authtx.RegisterTxService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.BaseApp.Simulate, app.interfaceRegistry)
  627. }
  628. // RegisterTendermintService implements the Application.RegisterTendermintService method.
  629. func (app *App) RegisterTendermintService(clientCtx client.Context) {
  630. tmservice.RegisterTendermintService(app.BaseApp.GRPCQueryRouter(), clientCtx, app.interfaceRegistry)
  631. }
  632. // GetMaccPerms returns a copy of the module account permissions
  633. func GetMaccPerms() map[string][]string {
  634. dupMaccPerms := make(map[string][]string)
  635. for k, v := range maccPerms {
  636. dupMaccPerms[k] = v
  637. }
  638. return dupMaccPerms
  639. }
  640. // initParamsKeeper init params keeper and its subspaces
  641. func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino, key, tkey sdk.StoreKey) paramskeeper.Keeper {
  642. paramsKeeper := paramskeeper.NewKeeper(appCodec, legacyAmino, key, tkey)
  643. paramsKeeper.Subspace(authtypes.ModuleName)
  644. paramsKeeper.Subspace(banktypes.ModuleName)
  645. paramsKeeper.Subspace(stakingtypes.ModuleName)
  646. paramsKeeper.Subspace(minttypes.ModuleName)
  647. paramsKeeper.Subspace(distrtypes.ModuleName)
  648. paramsKeeper.Subspace(slashingtypes.ModuleName)
  649. paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypes.ParamKeyTable())
  650. paramsKeeper.Subspace(crisistypes.ModuleName)
  651. paramsKeeper.Subspace(ibctransfertypes.ModuleName)
  652. paramsKeeper.Subspace(ibchost.ModuleName)
  653. paramsKeeper.Subspace(wormholemoduletypes.ModuleName)
  654. // this line is used by starport scaffolding # stargate/app/paramSubspace
  655. paramsKeeper.Subspace(wasm.ModuleName)
  656. return paramsKeeper
  657. }