@@ -95,6 +95,12 @@ import (
9595 upgradeclient "github.com/cosmos/cosmos-sdk/x/upgrade/client"
9696 upgradekeeper "github.com/cosmos/cosmos-sdk/x/upgrade/keeper"
9797 upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
98+ packetforward "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/router"
99+ packetforwardkeeper "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/router/keeper"
100+ packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v7/router/types"
101+ ibchooks "github.com/cosmos/ibc-apps/modules/ibc-hooks/v7"
102+ ibchookskeeper "github.com/cosmos/ibc-apps/modules/ibc-hooks/v7/keeper"
103+ ibchookstypes "github.com/cosmos/ibc-apps/modules/ibc-hooks/v7/types"
98104 ica "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts"
99105 icacontroller "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller"
100106 icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper"
@@ -235,6 +241,8 @@ var (
235241 transfer.AppModuleBasic {},
236242 ica.AppModuleBasic {},
237243 ibcfee.AppModuleBasic {},
244+ ibchooks.AppModuleBasic {},
245+ packetforward.AppModuleBasic {},
238246 )
239247
240248 // module account permissions
@@ -300,6 +308,9 @@ type WasmApp struct {
300308 TransferKeeper ibctransferkeeper.Keeper
301309 WasmKeeper wasm.Keeper
302310 AbstractAccountKeeper aakeeper.Keeper
311+ IBCHooksKeeper * ibchookskeeper.Keeper
312+ ContractKeeper * wasmkeeper.PermissionedKeeper
313+ PacketForwardKeeper * packetforwardkeeper.Keeper
303314
304315 XionKeeper xionkeeper.Keeper
305316
@@ -310,6 +321,10 @@ type WasmApp struct {
310321 ScopedIBCFeeKeeper capabilitykeeper.ScopedKeeper
311322 ScopedWasmKeeper capabilitykeeper.ScopedKeeper
312323
324+ // IBC middleware wrappers
325+ Ics20WasmHooks * ibchooks.WasmHooks
326+ HooksICS4Wrapper ibchooks.ICS4Middleware
327+
313328 // the module manager
314329 ModuleManager * module.Manager
315330
@@ -353,6 +368,7 @@ func NewWasmApp(
353368 ibcexported .StoreKey , ibctransfertypes .StoreKey , ibcfeetypes .StoreKey ,
354369 wasm .StoreKey , icahosttypes .StoreKey , aatypes .StoreKey ,
355370 icacontrollertypes .StoreKey , globalfee .StoreKey , xiontypes .StoreKey ,
371+ ibchookstypes .StoreKey , packetforwardtypes .StoreKey ,
356372 )
357373
358374 tkeys := sdk .NewTransientStoreKeys (paramstypes .TStoreKey )
@@ -560,27 +576,56 @@ func NewWasmApp(
560576 app .AccountKeeper ,
561577 authtypes .NewModuleAddress (govtypes .ModuleName ).String ())
562578
579+ // Configure the hooks keeper
580+ hooksKeeper := ibchookskeeper .NewKeeper (
581+ keys [ibchookstypes .StoreKey ],
582+ )
583+ app .IBCHooksKeeper = & hooksKeeper
584+
585+ xionPrefix := sdk .GetConfig ().GetBech32AccountAddrPrefix ()
586+ wasmHooks := ibchooks .NewWasmHooks (app .IBCHooksKeeper , nil , xionPrefix ) // The contract keeper needs to be set later
587+ app .Ics20WasmHooks = & wasmHooks
588+ app .HooksICS4Wrapper = ibchooks .NewICS4Middleware (
589+ app .IBCKeeper .ChannelKeeper ,
590+ app .Ics20WasmHooks ,
591+ )
592+
563593 // IBC Fee Module keeper
564594 app .IBCFeeKeeper = ibcfeekeeper .NewKeeper (
565595 appCodec , keys [ibcfeetypes .StoreKey ],
566- app .IBCKeeper . ChannelKeeper , // may be replaced with IBC middleware
596+ app .HooksICS4Wrapper , // replaced with IBC middleware
567597 app .IBCKeeper .ChannelKeeper ,
568598 & app .IBCKeeper .PortKeeper , app .AccountKeeper , app .BankKeeper ,
569599 )
570600
601+ // Initialize packet forward middleware router
602+ app .PacketForwardKeeper = packetforwardkeeper .NewKeeper (
603+ appCodec ,
604+ keys [packetforwardtypes .StoreKey ],
605+ app .GetSubspace (packetforwardtypes .ModuleName ),
606+ app .TransferKeeper , // Will be zero-value here. Reference is set later on with SetTransferKeeper.
607+ app .IBCKeeper .ChannelKeeper ,
608+ app .DistrKeeper ,
609+ app .BankKeeper ,
610+ app .IBCKeeper .ChannelKeeper ,
611+ )
612+
571613 // Create Transfer Keepers
572614 app .TransferKeeper = ibctransferkeeper .NewKeeper (
573615 appCodec ,
574616 keys [ibctransfertypes .StoreKey ],
575617 app .GetSubspace (ibctransfertypes .ModuleName ),
576- app .IBCFeeKeeper , // ISC4 Wrapper: fee IBC middleware
618+ // The ICS4Wrapper is replaced by the PacketForwardKeeper instead of the channel so that sending can be overridden by the middleware
619+ app .PacketForwardKeeper ,
577620 app .IBCKeeper .ChannelKeeper ,
578621 & app .IBCKeeper .PortKeeper ,
579622 app .AccountKeeper ,
580623 app .BankKeeper ,
581624 scopedTransferKeeper ,
582625 )
583626
627+ app .PacketForwardKeeper .SetTransferKeeper (app .TransferKeeper )
628+
584629 app .ICAHostKeeper = icahostkeeper .NewKeeper (
585630 appCodec ,
586631 keys [icahosttypes .StoreKey ],
@@ -653,6 +698,14 @@ func NewWasmApp(
653698 var transferStack porttypes.IBCModule
654699 transferStack = transfer .NewIBCModule (app .TransferKeeper )
655700 transferStack = ibcfee .NewIBCMiddleware (transferStack , app .IBCFeeKeeper )
701+ transferStack = ibchooks .NewIBCMiddleware (transferStack , & app .HooksICS4Wrapper )
702+ transferStack = packetforward .NewIBCMiddleware (
703+ transferStack ,
704+ app .PacketForwardKeeper ,
705+ 0 ,
706+ packetforwardkeeper .DefaultForwardTransferPacketTimeoutTimestamp ,
707+ packetforwardkeeper .DefaultRefundTransferPacketTimeoutTimestamp ,
708+ )
656709
657710 // Create Interchain Accounts Stack
658711 // SendPacket, since it is originating from the application to core IBC:
@@ -723,6 +776,8 @@ func NewWasmApp(
723776 transfer .NewAppModule (app .TransferKeeper ),
724777 ibcfee .NewAppModule (app .IBCFeeKeeper ),
725778 ica .NewAppModule (& app .ICAControllerKeeper , & app .ICAHostKeeper ),
779+ ibchooks .NewAppModule (app .AccountKeeper ),
780+ packetforward .NewAppModule (app .PacketForwardKeeper ),
726781 crisis .NewAppModule (app .CrisisKeeper , skipGenesisInvariants , app .GetSubspace (crisistypes .ModuleName )), // always be last to make sure that it checks for all invariants and not only part of them
727782 )
728783
@@ -748,6 +803,8 @@ func NewWasmApp(
748803 ibcfeetypes .ModuleName ,
749804 wasm .ModuleName ,
750805 aatypes .ModuleName ,
806+ ibchookstypes .ModuleName ,
807+ packetforwardtypes .ModuleName ,
751808 )
752809
753810 app .ModuleManager .SetOrderEndBlockers (
@@ -767,6 +824,8 @@ func NewWasmApp(
767824 ibcfeetypes .ModuleName ,
768825 wasm .ModuleName ,
769826 aatypes .ModuleName ,
827+ ibchookstypes .ModuleName ,
828+ packetforwardtypes .ModuleName ,
770829 )
771830
772831 // NOTE: The genutils module must occur after staking so that pools are
@@ -791,6 +850,8 @@ func NewWasmApp(
791850 // wasm after ibc transfer
792851 wasm .ModuleName ,
793852 aatypes .ModuleName ,
853+ ibchookstypes .ModuleName ,
854+ packetforwardtypes .ModuleName ,
794855 }
795856 app .ModuleManager .SetOrderInitGenesis (genesisModuleOrder ... )
796857 app .ModuleManager .SetOrderExportGenesis (genesisModuleOrder ... )
@@ -857,6 +918,10 @@ func NewWasmApp(
857918 app .ScopedICAHostKeeper = scopedICAHostKeeper
858919 app .ScopedICAControllerKeeper = scopedICAControllerKeeper
859920
921+ // set the contract keeper for the Ics20WasmHooks
922+ app .ContractKeeper = wasmkeeper .NewDefaultPermissionKeeper (app .WasmKeeper )
923+ app .Ics20WasmHooks .ContractKeeper = & app .WasmKeeper
924+
860925 // In v0.46, the SDK introduces _postHandlers_. PostHandlers are like
861926 // antehandlers, but are run _after_ the `runMsgs` execution. They are also
862927 // defined as a chain, and have the same signature as antehandlers.
@@ -1148,6 +1213,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
11481213 paramsKeeper .Subspace (xiontypes .ModuleName )
11491214 paramsKeeper .Subspace (wasm .ModuleName )
11501215 paramsKeeper .Subspace (aatypes .ModuleName )
1216+ paramsKeeper .Subspace (packetforwardtypes .ModuleName )
11511217
11521218 return paramsKeeper
11531219}
0 commit comments