Skip to content

Commit ee4549b

Browse files
authored
fix: fixed callbacks middleware wiring (#5950)
* test: mock callback is overridable * test: added ack test * imp: fixed most tests * test: fixed all tests * docs: updated integration docs for callbacks * docs: updated docs * docs: fix broken links
1 parent e69a833 commit ee4549b

File tree

17 files changed

+217
-111
lines changed

17 files changed

+217
-111
lines changed

docs/docs/04-middleware/02-callbacks/02-integration.md

+14-11
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,24 @@ The in-line comments describe the execution flow of packets between the applicat
3636
```go
3737
// Create Transfer Stack
3838
// SendPacket, since it is originating from the application to core IBC:
39-
// transferKeeper.SendPacket -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
39+
// transferKeeper.SendPacket -> callbacks.SendPacket -> feeKeeper.SendPacket -> channel.SendPacket
4040

4141
// RecvPacket, message that originates from core IBC and goes down to app, the flow is the other way
42-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> transfer.OnRecvPacket
42+
// channel.RecvPacket -> fee.OnRecvPacket -> callbacks.OnRecvPacket -> transfer.OnRecvPacket
4343

4444
// transfer stack contains (from top to bottom):
45-
// - IBC Callbacks Middleware
4645
// - IBC Fee Middleware
46+
// - IBC Callbacks Middleware
4747
// - Transfer
4848

4949
// create IBC module from bottom to top of stack
5050
var transferStack porttypes.IBCModule
5151
transferStack = transfer.NewIBCModule(app.TransferKeeper)
52-
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
53-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
5452
transferStack = ibccallbacks.NewIBCMiddleware(transferStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
53+
transferICS4Wrapper := transferStack.(porttypes.ICS4Wrapper)
54+
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
5555
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the transfer keeper
56-
app.TransferKeeper.WithICS4Wrapper(transferStack.(porttypes.ICS4Wrapper))
56+
app.TransferKeeper.WithICS4Wrapper(transferICS4Wrapper)
5757

5858
// Add transfer stack to IBC Router
5959
ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
@@ -70,16 +70,19 @@ The usage of `WithICS4Wrapper` after `transferStack`'s configuration is critical
7070
// SendPacket, since it is originating from the application to core IBC:
7171
// icaControllerKeeper.SendTx -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
7272

73+
// initialize ICA module with mock module as the authentication module on the controller side
7374
var icaControllerStack porttypes.IBCModule
74-
icaControllerStack = icacontroller.NewIBCMiddleware(nil, app.ICAControllerKeeper)
75-
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
76-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
75+
icaControllerStack = ibcmock.NewIBCModule(&mockModule, ibcmock.NewIBCApp("", scopedICAMockKeeper))
76+
app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule)
77+
icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
7778
icaControllerStack = ibccallbacks.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
79+
icaICS4Wrapper := icaControllerStack.(porttypes.ICS4Wrapper)
80+
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
7881
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper
79-
app.ICAControllerKeeper.WithICS4Wrapper(icaControllerStack.(porttypes.ICS4Wrapper))
82+
app.ICAControllerKeeper.WithICS4Wrapper(icaICS4Wrapper)
8083

8184
// RecvPacket, message that originates from core IBC and goes down to app, the flow is:
82-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
85+
// channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
8386

8487
var icaHostStack porttypes.IBCModule
8588
icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper)

docs/versioned_docs/version-v7.3.x/04-middleware/02-callbacks/02-integration.md

+14-11
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,24 @@ The in-line comments describe the execution flow of packets between the applicat
3636
```go
3737
// Create Transfer Stack
3838
// SendPacket, since it is originating from the application to core IBC:
39-
// transferKeeper.SendPacket -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
39+
// transferKeeper.SendPacket -> callbacks.SendPacket -> feeKeeper.SendPacket -> channel.SendPacket
4040

4141
// RecvPacket, message that originates from core IBC and goes down to app, the flow is the other way
42-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> transfer.OnRecvPacket
42+
// channel.RecvPacket -> fee.OnRecvPacket -> callbacks.OnRecvPacket -> transfer.OnRecvPacket
4343

4444
// transfer stack contains (from top to bottom):
45-
// - IBC Callbacks Middleware
4645
// - IBC Fee Middleware
46+
// - IBC Callbacks Middleware
4747
// - Transfer
4848

4949
// create IBC module from bottom to top of stack
5050
var transferStack porttypes.IBCModule
5151
transferStack = transfer.NewIBCModule(app.TransferKeeper)
52-
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
53-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
5452
transferStack = ibccallbacks.NewIBCMiddleware(transferStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
53+
transferICS4Wrapper := transferStack.(porttypes.ICS4Wrapper)
54+
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
5555
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the transfer keeper
56-
app.TransferKeeper.WithICS4Wrapper(transferStack.(porttypes.ICS4Wrapper))
56+
app.TransferKeeper.WithICS4Wrapper(transferICS4Wrapper)
5757

5858
// Add transfer stack to IBC Router
5959
ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
@@ -70,16 +70,19 @@ The usage of `WithICS4Wrapper` after `transferStack`'s configuration is critical
7070
// SendPacket, since it is originating from the application to core IBC:
7171
// icaControllerKeeper.SendTx -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
7272

73+
// initialize ICA module with mock module as the authentication module on the controller side
7374
var icaControllerStack porttypes.IBCModule
74-
icaControllerStack = icacontroller.NewIBCMiddleware(nil, app.ICAControllerKeeper)
75-
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
76-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
75+
icaControllerStack = ibcmock.NewIBCModule(&mockModule, ibcmock.NewIBCApp("", scopedICAMockKeeper))
76+
app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule)
77+
icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
7778
icaControllerStack = ibccallbacks.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
79+
icaICS4Wrapper := icaControllerStack.(porttypes.ICS4Wrapper)
80+
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
7881
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper
79-
app.ICAControllerKeeper.WithICS4Wrapper(icaControllerStack.(porttypes.ICS4Wrapper))
82+
app.ICAControllerKeeper.WithICS4Wrapper(icaICS4Wrapper)
8083

8184
// RecvPacket, message that originates from core IBC and goes down to app, the flow is:
82-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
85+
// channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
8386

8487
var icaHostStack porttypes.IBCModule
8588
icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper)

docs/versioned_docs/version-v8.1.x/04-middleware/02-callbacks/02-integration.md

+14-11
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,24 @@ The in-line comments describe the execution flow of packets between the applicat
3636
```go
3737
// Create Transfer Stack
3838
// SendPacket, since it is originating from the application to core IBC:
39-
// transferKeeper.SendPacket -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
39+
// transferKeeper.SendPacket -> callbacks.SendPacket -> feeKeeper.SendPacket -> channel.SendPacket
4040

4141
// RecvPacket, message that originates from core IBC and goes down to app, the flow is the other way
42-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> transfer.OnRecvPacket
42+
// channel.RecvPacket -> fee.OnRecvPacket -> callbacks.OnRecvPacket -> transfer.OnRecvPacket
4343

4444
// transfer stack contains (from top to bottom):
45-
// - IBC Callbacks Middleware
4645
// - IBC Fee Middleware
46+
// - IBC Callbacks Middleware
4747
// - Transfer
4848

4949
// create IBC module from bottom to top of stack
5050
var transferStack porttypes.IBCModule
5151
transferStack = transfer.NewIBCModule(app.TransferKeeper)
52-
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
53-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
5452
transferStack = ibccallbacks.NewIBCMiddleware(transferStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
53+
transferICS4Wrapper := transferStack.(porttypes.ICS4Wrapper)
54+
transferStack = ibcfee.NewIBCMiddleware(transferStack, app.IBCFeeKeeper)
5555
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the transfer keeper
56-
app.TransferKeeper.WithICS4Wrapper(transferStack.(porttypes.ICS4Wrapper))
56+
app.TransferKeeper.WithICS4Wrapper(transferICS4Wrapper)
5757

5858
// Add transfer stack to IBC Router
5959
ibcRouter.AddRoute(ibctransfertypes.ModuleName, transferStack)
@@ -70,16 +70,19 @@ The usage of `WithICS4Wrapper` after `transferStack`'s configuration is critical
7070
// SendPacket, since it is originating from the application to core IBC:
7171
// icaControllerKeeper.SendTx -> callbacks.SendPacket -> fee.SendPacket -> channel.SendPacket
7272

73+
// initialize ICA module with mock module as the authentication module on the controller side
7374
var icaControllerStack porttypes.IBCModule
74-
icaControllerStack = icacontroller.NewIBCMiddleware(nil, app.ICAControllerKeeper)
75-
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
76-
// maxCallbackGas is a hard-coded value that is passed to the callbacks middleware
75+
icaControllerStack = ibcmock.NewIBCModule(&mockModule, ibcmock.NewIBCApp("", scopedICAMockKeeper))
76+
app.ICAAuthModule = icaControllerStack.(ibcmock.IBCModule)
77+
icaControllerStack = icacontroller.NewIBCMiddleware(icaControllerStack, app.ICAControllerKeeper)
7778
icaControllerStack = ibccallbacks.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper, app.MockContractKeeper, maxCallbackGas)
79+
icaICS4Wrapper := icaControllerStack.(porttypes.ICS4Wrapper)
80+
icaControllerStack = ibcfee.NewIBCMiddleware(icaControllerStack, app.IBCFeeKeeper)
7881
// Since the callbacks middleware itself is an ics4wrapper, it needs to be passed to the ica controller keeper
79-
app.ICAControllerKeeper.WithICS4Wrapper(icaControllerStack.(porttypes.ICS4Wrapper))
82+
app.ICAControllerKeeper.WithICS4Wrapper(icaICS4Wrapper)
8083

8184
// RecvPacket, message that originates from core IBC and goes down to app, the flow is:
82-
// channel.RecvPacket -> callbacks.OnRecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
85+
// channel.RecvPacket -> fee.OnRecvPacket -> icaHost.OnRecvPacket
8386

8487
var icaHostStack porttypes.IBCModule
8588
icaHostStack = icahost.NewIBCModule(app.ICAHostKeeper)

modules/apps/27-interchain-accounts/controller/keeper/export_test.go

-6
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,8 @@ import (
88
sdk "github.com/cosmos/cosmos-sdk/types"
99

1010
icatypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/types"
11-
porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types"
1211
)
1312

14-
// GetICS4Wrapper is a getter for the keeper's ICS4Wrapper.
15-
func (k *Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
16-
return k.ics4Wrapper
17-
}
18-
1913
// GetAppMetadata is a wrapper around getAppMetadata to allow the function to be directly called in tests.
2014
func (k Keeper) GetAppMetadata(ctx sdk.Context, portID, channelID string) (icatypes.Metadata, error) {
2115
return k.getAppMetadata(ctx, portID, channelID)

modules/apps/27-interchain-accounts/controller/keeper/keeper.go

+5
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ func (k *Keeper) WithICS4Wrapper(wrapper porttypes.ICS4Wrapper) {
7272
k.ics4Wrapper = wrapper
7373
}
7474

75+
// GetICS4Wrapper returns the ICS4Wrapper.
76+
func (k Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
77+
return k.ics4Wrapper
78+
}
79+
7580
// Logger returns the application logger, scoped to the associated module
7681
func (Keeper) Logger(ctx sdk.Context) log.Logger {
7782
return ctx.Logger().With("module", fmt.Sprintf("x/%s-%s", exported.ModuleName, icatypes.ModuleName))

modules/apps/27-interchain-accounts/host/keeper/export_test.go

-6
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,8 @@ import (
88
sdk "github.com/cosmos/cosmos-sdk/types"
99

1010
icatypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/types"
11-
porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types"
1211
)
1312

14-
// GetICS4Wrapper is a getter for the keeper's ICS4Wrapper.
15-
func (k *Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
16-
return k.ics4Wrapper
17-
}
18-
1913
// GetAppMetadata is a wrapper around getAppMetadata to allow the function to be directly called in tests.
2014
func (k Keeper) GetAppMetadata(ctx sdk.Context, portID, channelID string) (icatypes.Metadata, error) {
2115
return k.getAppMetadata(ctx, portID, channelID)

modules/apps/27-interchain-accounts/host/keeper/keeper.go

+5
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ func (k *Keeper) WithICS4Wrapper(wrapper porttypes.ICS4Wrapper) {
8080
k.ics4Wrapper = wrapper
8181
}
8282

83+
// GetICS4Wrapper returns the ICS4Wrapper.
84+
func (k Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
85+
return k.ics4Wrapper
86+
}
87+
8388
// Logger returns the application logger, scoped to the associated module
8489
func (Keeper) Logger(ctx sdk.Context) log.Logger {
8590
return ctx.Logger().With("module", fmt.Sprintf("x/%s-%s", exported.ModuleName, icatypes.ModuleName))

modules/apps/29-fee/keeper/export_test.go

-6
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,8 @@ import (
44
sdk "github.com/cosmos/cosmos-sdk/types"
55

66
"github.com/cosmos/ibc-go/v8/modules/apps/29-fee/types"
7-
porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types"
87
)
98

10-
// GetICS4Wrapper is a getter for the keeper's ICS4Wrapper.
11-
func (k *Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
12-
return k.ics4Wrapper
13-
}
14-
159
// LegacyTotal is a wrapper for the legacyTotal function for testing.
1610
func LegacyTotal(f types.Fee) sdk.Coins {
1711
return legacyTotal(f)

modules/apps/29-fee/keeper/keeper.go

+5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ func (k *Keeper) WithICS4Wrapper(wrapper porttypes.ICS4Wrapper) {
5757
k.ics4Wrapper = wrapper
5858
}
5959

60+
// GetICS4Wrapper returns the ICS4Wrapper.
61+
func (k Keeper) GetICS4Wrapper() porttypes.ICS4Wrapper {
62+
return k.ics4Wrapper
63+
}
64+
6065
// Logger returns a module-specific logger.
6166
func (Keeper) Logger(ctx sdk.Context) log.Logger {
6267
return ctx.Logger().With("module", "x/"+ibcexported.ModuleName+"-"+types.ModuleName)

modules/apps/callbacks/export_test.go

-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
sdk "github.com/cosmos/cosmos-sdk/types"
99

1010
"github.com/cosmos/ibc-go/modules/apps/callbacks/types"
11-
porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types"
1211
)
1312

1413
// ProcessCallback is a wrapper around processCallback to allow the function to be directly called in tests.
@@ -18,8 +17,3 @@ func (im IBCMiddleware) ProcessCallback(
1817
) error {
1918
return im.processCallback(ctx, callbackType, callbackData, callbackExecutor)
2019
}
21-
22-
// GetICS4Wrapper is a getter for the IBCMiddleware's ICS4Wrapper.
23-
func (im *IBCMiddleware) GetICS4Wrapper() porttypes.ICS4Wrapper {
24-
return im.ics4Wrapper
25-
}

0 commit comments

Comments
 (0)