@@ -64,6 +64,7 @@ import (
6464 icahost "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host"
6565 icahostkeeper "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/keeper"
6666 icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types"
67+ ibccallbacks "github.com/cosmos/ibc-go/v10/modules/apps/callbacks"
6768 ibctransfer "github.com/cosmos/ibc-go/v10/modules/apps/transfer"
6869 ibctransferkeeper "github.com/cosmos/ibc-go/v10/modules/apps/transfer/keeper"
6970 ibctransfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types"
@@ -115,12 +116,9 @@ type AppKeepers struct {
115116 PacketForwardKeeper * packetforwardkeeper.Keeper
116117
117118 // Modules
118- TransferModule ibctransfer.AppModule
119119 TMLightClientModule ibctm.LightClientModule
120120 // IBC hooks
121- IBCHooksKeeper * ibchookskeeper.Keeper
122- ICS20WasmHooks * ibchooks.WasmHooks
123- HooksICS4Wrapper * ibchooks.ICS4Middleware
121+ IBCHooksKeeper * ibchookskeeper.Keeper
124122}
125123
126124func NewAppKeeper (
@@ -315,42 +313,30 @@ func NewAppKeeper(
315313 authtypes .NewModuleAddress (govtypes .ModuleName ).String (),
316314 )
317315
318- // Configure the hooks keeper
319- hooksKeeper := ibchookskeeper .NewKeeper (appKeepers .keys [ibchookstypes .StoreKey ])
320- appKeepers .IBCHooksKeeper = & hooksKeeper
321- wasmHooks := ibchooks .NewWasmHooks (& hooksKeeper , appKeepers .WasmKeeper , constants .Bech32PrefixAccAddr )
322- appKeepers .ICS20WasmHooks = & wasmHooks
323- hooksICS4Wrapper := ibchooks .NewICS4Middleware (
324- appKeepers .IBCKeeper .ChannelKeeper ,
325- appKeepers .ICS20WasmHooks ,
326- )
327- appKeepers .HooksICS4Wrapper = & hooksICS4Wrapper
328-
329316 appKeepers .PacketForwardKeeper = packetforwardkeeper .NewKeeper (
330317 appCodec ,
331318 runtime .NewKVStoreService (appKeepers .keys [packetforwardtypes .StoreKey ]),
332319 appKeepers .TransferKeeper , // Will be zero-value here. Reference is set later on with SetTransferKeeper.
333320 appKeepers .IBCKeeper .ChannelKeeper ,
334321 appKeepers .BankKeeper ,
335- appKeepers .HooksICS4Wrapper ,
322+ appKeepers .IBCKeeper . ChannelKeeper , // ICS4Wrapper
336323 authtypes .NewModuleAddress (govtypes .ModuleName ).String (),
337324 )
338325
339326 transferKeeper := ibctransferkeeper .NewKeeper (
340327 appCodec ,
341328 runtime .NewKVStoreService (appKeepers .keys [ibctransfertypes .StoreKey ]),
342329 appKeepers .GetSubspace (ibctransfertypes .ModuleName ),
343- // The ICS4Wrapper is replaced by the PacketForwardKeeper
330+ // The ICS4Wrapper is replaced by the callback stack later in the code
344331 // so that sending can be overridden by the middleware
345- appKeepers .PacketForwardKeeper ,
332+ appKeepers .IBCKeeper . ChannelKeeper , // ICS4Wrapper, replaced by the stack
346333 appKeepers .IBCKeeper .ChannelKeeper ,
347334 bApp .MsgServiceRouter (),
348335 appKeepers .AccountKeeper ,
349336 appKeepers .BankKeeper ,
350337 authtypes .NewModuleAddress (govtypes .ModuleName ).String (),
351338 )
352339 appKeepers .TransferKeeper = & transferKeeper
353- appKeepers .TransferModule = ibctransfer .NewAppModule (* appKeepers .TransferKeeper )
354340 appKeepers .PacketForwardKeeper .SetTransferKeeper (* appKeepers .TransferKeeper )
355341
356342 icaHostKeeper := icahostkeeper .NewKeeper (
@@ -399,8 +385,6 @@ func NewAppKeeper(
399385 ),
400386 )
401387
402- transferIBCModule := ibctransfer .NewIBCModule (* appKeepers .TransferKeeper )
403-
404388 evidenceKeeper := evidencekeeper .NewKeeper (
405389 appCodec ,
406390 runtime .NewKVStoreService (appKeepers .keys [evidencetypes .StoreKey ]),
@@ -442,27 +426,37 @@ func NewAppKeeper(
442426 )
443427 appKeepers .WasmKeeper = & wasmKeeper
444428 // Set ics20 wasm hooks the initialised wasmkeeper
445- appKeepers .ICS20WasmHooks .ContractKeeper = appKeepers .WasmKeeper
429+ // Configure the hooks keeper
430+ hooksKeeper := ibchookskeeper .NewKeeper (appKeepers .keys [ibchookstypes .StoreKey ])
431+ appKeepers .IBCHooksKeeper = & hooksKeeper
432+ wasmIBCHooks := ibchooks .NewWasmHooks (& hooksKeeper , appKeepers .WasmKeeper , constants .Bech32PrefixAccAddr )
433+ hooksICS4Wrapper := ibchooks .NewICS4Middleware (
434+ appKeepers .IBCKeeper .ChannelKeeper ,
435+ & wasmIBCHooks ,
436+ )
446437
447- var icaHostStack ibctypes.IBCModule
448- icaHostStack = icahost .NewIBCModule (* appKeepers .ICAHostKeeper )
438+ wasmStack := wasm .NewIBCHandler (appKeepers .WasmKeeper , appKeepers .IBCKeeper .ChannelKeeper , appKeepers .IBCKeeper .ChannelKeeper )
439+ //SendPacket --> Transfer -> callbacks -> ibchooks -> IBC-Core (ICS4Wrappers)
440+ //RecvPacket --> IBC-Core -> PFM -> ibcHooks -> callback -> Transfer (AddRoute)
441+ maxCallbackGas := uint64 (10_000_000 ) // const
442+
443+ var transferStack ibctypes.IBCModule = ibctransfer .NewIBCModule (* appKeepers .TransferKeeper )
444+ cbStack := ibccallbacks .NewIBCMiddleware (transferStack , & hooksICS4Wrapper , wasmStack , maxCallbackGas )
445+ transferStack = ibchooks .NewIBCMiddleware (cbStack , & hooksICS4Wrapper )
449446
450- //SendPacket --> Transfer -> PFM -> ibcHooks -> IBC-Core (ICS4Wrappers)
451- //RecvPacket --> IBC-Core -> ibcHooks -> PFM -> Transfer (AddRoute)
452- var transferStack ibctypes.IBCModule = transferIBCModule
453447 transferStack = packetforward .NewIBCMiddleware (
454448 transferStack ,
455449 appKeepers .PacketForwardKeeper ,
456450 0 , // no retries on timeout
457451 packetforwardkeeper .DefaultForwardTransferPacketTimeoutTimestamp ,
458452 )
459- transferStack = ibchooks .NewIBCMiddleware (transferStack , appKeepers .HooksICS4Wrapper )
453+
454+ appKeepers .TransferKeeper .WithICS4Wrapper (cbStack ) // does not matter to use transfer stack, as pfm send is no-op
460455
461456 // Information will flow: ibc-port -> icaController.
462457 icaControllerStack := icacontroller .NewIBCMiddleware (* appKeepers .ICAControllerKeeper )
463458
464- var wasmStack ibctypes.IBCModule
465- wasmStack = wasm .NewIBCHandler (appKeepers .WasmKeeper , appKeepers .IBCKeeper .ChannelKeeper , appKeepers .IBCKeeper .ChannelKeeper )
459+ icaHostStack := icahost .NewIBCModule (* appKeepers .ICAHostKeeper )
466460
467461 ibcRouter := ibctypes .NewRouter ().
468462 AddRoute (ibctransfertypes .ModuleName , transferStack ).
0 commit comments