app.go 35 KB

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