Skip to content

Commit 0b09ae1

Browse files
committed
Add extension point for custom ibc port name
1 parent 7c8f1e8 commit 0b09ae1

15 files changed

+83
-35
lines changed

x/wasm/alias.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,6 @@ var (
8989
// Deprecated: Do not use.
9090
NewQuerier = keeper.Querier
9191
// Deprecated: Do not use.
92-
ContractFromPortID = keeper.ContractFromPortID
93-
// Deprecated: Do not use.
9492
WithWasmEngine = keeper.WithWasmEngine
9593
// Deprecated: Do not use.
9694
NewCountTXDecorator = keeper.NewCountTXDecorator

x/wasm/ibc.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414

1515
sdk "github.com/cosmos/cosmos-sdk/types"
1616

17-
"github.com/CosmWasm/wasmd/x/wasm/keeper"
1817
"github.com/CosmWasm/wasmd/x/wasm/types"
1918
)
2019

@@ -51,7 +50,7 @@ func (i IBCHandler) OnChanOpenInit(
5150
if err := ValidateChannelParams(channelID); err != nil {
5251
return "", err
5352
}
54-
contractAddr, err := keeper.ContractFromPortID(portID)
53+
contractAddr, err := i.keeper.ContractFromPortID(portID)
5554
if err != nil {
5655
return "", errorsmod.Wrapf(err, "contract port id")
5756
}
@@ -103,7 +102,7 @@ func (i IBCHandler) OnChanOpenTry(
103102
return "", err
104103
}
105104

106-
contractAddr, err := keeper.ContractFromPortID(portID)
105+
contractAddr, err := i.keeper.ContractFromPortID(portID)
107106
if err != nil {
108107
return "", errorsmod.Wrapf(err, "contract port id")
109108
}
@@ -151,7 +150,7 @@ func (i IBCHandler) OnChanOpenAck(
151150
counterpartyChannelID string,
152151
counterpartyVersion string,
153152
) error {
154-
contractAddr, err := keeper.ContractFromPortID(portID)
153+
contractAddr, err := i.keeper.ContractFromPortID(portID)
155154
if err != nil {
156155
return errorsmod.Wrapf(err, "contract port id")
157156
}
@@ -177,7 +176,7 @@ func (i IBCHandler) OnChanOpenAck(
177176

178177
// OnChanOpenConfirm implements the IBCModule interface
179178
func (i IBCHandler) OnChanOpenConfirm(ctx sdk.Context, portID, channelID string) error {
180-
contractAddr, err := keeper.ContractFromPortID(portID)
179+
contractAddr, err := i.keeper.ContractFromPortID(portID)
181180
if err != nil {
182181
return errorsmod.Wrapf(err, "contract port id")
183182
}
@@ -199,7 +198,7 @@ func (i IBCHandler) OnChanOpenConfirm(ctx sdk.Context, portID, channelID string)
199198

200199
// OnChanCloseInit implements the IBCModule interface
201200
func (i IBCHandler) OnChanCloseInit(ctx sdk.Context, portID, channelID string) error {
202-
contractAddr, err := keeper.ContractFromPortID(portID)
201+
contractAddr, err := i.keeper.ContractFromPortID(portID)
203202
if err != nil {
204203
return errorsmod.Wrapf(err, "contract port id")
205204
}
@@ -227,7 +226,7 @@ func (i IBCHandler) OnChanCloseInit(ctx sdk.Context, portID, channelID string) e
227226
// OnChanCloseConfirm implements the IBCModule interface
228227
func (i IBCHandler) OnChanCloseConfirm(ctx sdk.Context, portID, channelID string) error {
229228
// counterparty has closed the channel
230-
contractAddr, err := keeper.ContractFromPortID(portID)
229+
contractAddr, err := i.keeper.ContractFromPortID(portID)
231230
if err != nil {
232231
return errorsmod.Wrapf(err, "contract port id")
233232
}
@@ -268,7 +267,7 @@ func (i IBCHandler) OnRecvPacket(
268267
packet channeltypes.Packet,
269268
relayer sdk.AccAddress,
270269
) ibcexported.Acknowledgement {
271-
contractAddr, err := keeper.ContractFromPortID(packet.DestinationPort)
270+
contractAddr, err := i.keeper.ContractFromPortID(packet.DestinationPort)
272271
if err != nil {
273272
// this must not happen as ports were registered before
274273
panic(errorsmod.Wrapf(err, "contract port id"))
@@ -296,7 +295,7 @@ func (i IBCHandler) OnAcknowledgementPacket(
296295
acknowledgement []byte,
297296
relayer sdk.AccAddress,
298297
) error {
299-
contractAddr, err := keeper.ContractFromPortID(packet.SourcePort)
298+
contractAddr, err := i.keeper.ContractFromPortID(packet.SourcePort)
300299
if err != nil {
301300
return errorsmod.Wrapf(err, "contract port id")
302301
}
@@ -314,7 +313,7 @@ func (i IBCHandler) OnAcknowledgementPacket(
314313

315314
// OnTimeoutPacket implements the IBCModule interface
316315
func (i IBCHandler) OnTimeoutPacket(ctx sdk.Context, packet channeltypes.Packet, relayer sdk.AccAddress) error {
317-
contractAddr, err := keeper.ContractFromPortID(packet.SourcePort)
316+
contractAddr, err := i.keeper.ContractFromPortID(packet.SourcePort)
318317
if err != nil {
319318
return errorsmod.Wrapf(err, "contract port id")
320319
}

x/wasm/ibc_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ func TestOnRecvPacket(t *testing.T) {
107107
ctx.EventManager().EmitEvent(myCustomEvent)
108108
return spec.contractRsp, spec.contractOkMsgExecErr
109109
},
110+
ContractFromPortIDFn: keeper.DefaultIBCPortNameGenerator{}.ContractFromPortID,
110111
}
111112
h := NewIBCHandler(mock, nil, nil)
112113
em := &sdk.EventManager{}
@@ -200,7 +201,15 @@ var _ types.IBCContractKeeper = &IBCContractKeeperMock{}
200201

201202
type IBCContractKeeperMock struct {
202203
types.IBCContractKeeper
203-
OnRecvPacketFn func(ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.IBCPacketReceiveMsg) (ibcexported.Acknowledgement, error)
204+
OnRecvPacketFn func(ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.IBCPacketReceiveMsg) (ibcexported.Acknowledgement, error)
205+
ContractFromPortIDFn func(portID string) (sdk.AccAddress, error)
206+
}
207+
208+
func (m IBCContractKeeperMock) ContractFromPortID(portID string) (sdk.AccAddress, error) {
209+
if m.ContractFromPortIDFn == nil {
210+
panic("not expected to be called")
211+
}
212+
return m.ContractFromPortIDFn(portID)
204213
}
205214

206215
func (m IBCContractKeeperMock) OnRecvPacket(ctx sdk.Context, contractAddr sdk.AccAddress, msg wasmvmtypes.IBCPacketReceiveMsg) (ibcexported.Acknowledgement, error) {

x/wasm/keeper/handler_plugin.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,10 @@ func NewDefaultMessageHandler(
4545
bankKeeper types.Burner,
4646
cdc codec.Codec,
4747
portSource types.ICS20TransferPortSource,
48+
ibcPortAllocator IBCPortNameGenerator,
4849
customEncoders ...*MessageEncoders,
4950
) Messenger {
50-
encoders := DefaultEncoders(cdc, portSource)
51+
encoders := DefaultEncoders(cdc, portSource, ibcPortAllocator)
5152
for _, e := range customEncoders {
5253
encoders = encoders.Merge(e)
5354
}

x/wasm/keeper/handler_plugin_encoders.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,17 @@ type MessageEncoders struct {
4444
Gov func(sender sdk.AccAddress, msg *wasmvmtypes.GovMsg) ([]sdk.Msg, error)
4545
}
4646

47-
func DefaultEncoders(unpacker codectypes.AnyUnpacker, portSource types.ICS20TransferPortSource) MessageEncoders {
47+
// DefaultEncoders setup the wasm module default message encoders
48+
func DefaultEncoders(
49+
unpacker codectypes.AnyUnpacker,
50+
portSource types.ICS20TransferPortSource,
51+
ibcPortAllocator IBCPortNameGenerator,
52+
) MessageEncoders {
4853
return MessageEncoders{
4954
Bank: EncodeBankMsg,
5055
Custom: NoCustomMsg,
5156
Distribution: EncodeDistributionMsg,
52-
IBC: EncodeIBCMsg(portSource),
57+
IBC: EncodeIBCMsg(portSource, ibcPortAllocator),
5358
Staking: EncodeStakingMsg,
5459
Stargate: EncodeStargateMsg(unpacker),
5560
Wasm: EncodeWasmMsg,
@@ -295,12 +300,15 @@ func EncodeWasmMsg(sender sdk.AccAddress, msg *wasmvmtypes.WasmMsg) ([]sdk.Msg,
295300
}
296301
}
297302

298-
func EncodeIBCMsg(portSource types.ICS20TransferPortSource) func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error) {
303+
func EncodeIBCMsg(
304+
portSource types.ICS20TransferPortSource,
305+
ibcPortAllocator IBCPortNameGenerator,
306+
) func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error) {
299307
return func(ctx sdk.Context, sender sdk.AccAddress, contractIBCPortID string, msg *wasmvmtypes.IBCMsg) ([]sdk.Msg, error) {
300308
switch {
301309
case msg.CloseChannel != nil:
302310
return []sdk.Msg{&channeltypes.MsgChannelCloseInit{
303-
PortId: PortIDForContract(sender),
311+
PortId: ibcPortAllocator.PortIDForContract(sender),
304312
ChannelId: msg.CloseChannel.ChannelID,
305313
Signer: sender.String(),
306314
}}, nil

x/wasm/keeper/handler_plugin_encoders_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ func TestEncoding(t *testing.T) {
553553
for name, tc := range cases {
554554
t.Run(name, func(t *testing.T) {
555555
var ctx sdk.Context
556-
encoder := DefaultEncoders(encodingConfig.Codec, tc.transferPortSource)
556+
encoder := DefaultEncoders(encodingConfig.Codec, tc.transferPortSource, DefaultIBCPortNameGenerator{})
557557
res, err := encoder.Encode(ctx, tc.sender, tc.srcContractIBCPort, tc.srcMsg)
558558
if tc.expError {
559559
assert.Error(t, err)
@@ -773,7 +773,7 @@ func TestEncodeGovMsg(t *testing.T) {
773773
for name, tc := range cases {
774774
t.Run(name, func(t *testing.T) {
775775
var ctx sdk.Context
776-
encoder := DefaultEncoders(encodingConfig.Codec, tc.transferPortSource)
776+
encoder := DefaultEncoders(encodingConfig.Codec, tc.transferPortSource, DefaultIBCPortNameGenerator{})
777777
res, gotEncErr := encoder.Encode(ctx, tc.sender, "myIBCPort", tc.srcMsg)
778778
if tc.expError {
779779
assert.Error(t, gotEncErr)

x/wasm/keeper/ibc.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,32 @@ func (k Keeper) bindIbcPort(ctx sdk.Context, portID string) error {
2121
return k.ClaimCapability(ctx, portCap, host.PortPath(portID))
2222
}
2323

24-
// ensureIbcPort is like registerIbcPort, but it checks if we already hold the port
24+
// ensureIBCPort is like registerIbcPort, but it checks if we already hold the port
2525
// before calling register, so this is safe to call multiple times.
2626
// Returns success if we already registered or just registered and error if we cannot
2727
// (lack of permissions or someone else has it)
28-
func (k Keeper) ensureIbcPort(ctx sdk.Context, contractAddr sdk.AccAddress) (string, error) {
29-
portID := PortIDForContract(contractAddr)
28+
func (k Keeper) ensureIBCPort(ctx sdk.Context, contractAddr sdk.AccAddress) (string, error) {
29+
portID := k.ibcPortNameGenerator.PortIDForContract(contractAddr)
3030
if _, ok := k.capabilityKeeper.GetCapability(ctx, host.PortPath(portID)); ok {
3131
return portID, nil
3232
}
3333
return portID, k.bindIbcPort(ctx, portID)
3434
}
3535

36+
type IBCPortNameGenerator interface {
37+
PortIDForContract(addr sdk.AccAddress) string
38+
ContractFromPortID(portID string) (sdk.AccAddress, error)
39+
}
40+
3641
const portIDPrefix = "wasm."
3742

38-
func PortIDForContract(addr sdk.AccAddress) string {
43+
type DefaultIBCPortNameGenerator struct{}
44+
45+
func (DefaultIBCPortNameGenerator) PortIDForContract(addr sdk.AccAddress) string {
3946
return portIDPrefix + addr.String()
4047
}
4148

42-
func ContractFromPortID(portID string) (sdk.AccAddress, error) {
49+
func (DefaultIBCPortNameGenerator) ContractFromPortID(portID string) (sdk.AccAddress, error) {
4350
if !strings.HasPrefix(portID, portIDPrefix) {
4451
return nil, errorsmod.Wrapf(types.ErrInvalid, "without prefix")
4552
}

x/wasm/keeper/ibc_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func TestBindingPortForIBCContractOnInstantiate(t *testing.T) {
3636
require.NoError(t, err)
3737
require.NotEqual(t, example.Contract, addr)
3838

39-
portID2 := PortIDForContract(addr)
39+
portID2 := keepers.WasmKeeper.ibcPortNameGenerator.PortIDForContract(addr)
4040
owner, _, err = keepers.IBCKeeper.PortKeeper.LookupModuleByPort(ctx, portID2)
4141
require.NoError(t, err)
4242
require.Equal(t, "wasm", owner)
@@ -72,7 +72,7 @@ func TestContractFromPortID(t *testing.T) {
7272
}
7373
for name, spec := range specs {
7474
t.Run(name, func(t *testing.T) {
75-
gotAddr, gotErr := ContractFromPortID(spec.srcPort)
75+
gotAddr, gotErr := DefaultIBCPortNameGenerator{}.ContractFromPortID(spec.srcPort)
7676
if spec.expErr {
7777
require.Error(t, gotErr)
7878
return

x/wasm/keeper/keeper.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ type Keeper struct {
106106

107107
// the address capable of executing a MsgUpdateParams message. Typically, this
108108
// should be the x/gov module account.
109-
authority string
109+
authority string
110+
ibcPortNameGenerator IBCPortNameGenerator
110111
}
111112

112113
func (k Keeper) getUploadAccessConfig(ctx context.Context) types.AccessConfig {
@@ -334,7 +335,7 @@ func (k Keeper) instantiate(
334335
}
335336
if report.HasIBCEntryPoints {
336337
// register IBC port
337-
ibcPort, err := k.ensureIbcPort(sdkCtx, contractAddress)
338+
ibcPort, err := k.ensureIBCPort(sdkCtx, contractAddress)
338339
if err != nil {
339340
return nil, nil, err
340341
}
@@ -457,7 +458,7 @@ func (k Keeper) migrate(
457458
return nil, errorsmod.Wrap(types.ErrMigrationFailed, "requires ibc callbacks")
458459
case report.HasIBCEntryPoints && contractInfo.IBCPortID == "":
459460
// add ibc port
460-
ibcPort, err := k.ensureIbcPort(sdkCtx, contractAddress)
461+
ibcPort, err := k.ensureIBCPort(sdkCtx, contractAddress)
461462
if err != nil {
462463
return nil, err
463464
}
@@ -1194,6 +1195,10 @@ func (k Keeper) importContract(ctx context.Context, contractAddr sdk.AccAddress,
11941195
return k.importContractState(ctx, contractAddr, state)
11951196
}
11961197

1198+
func (k Keeper) ContractFromPortID(portID string) (sdk.AccAddress, error) {
1199+
return k.ibcPortNameGenerator.ContractFromPortID(portID)
1200+
}
1201+
11971202
func (k Keeper) newQueryHandler(ctx sdk.Context, contractAddress sdk.AccAddress) QueryHandler {
11981203
return NewQueryHandler(ctx, k.wasmVMQueryHandler, contractAddress, k.gasRegister)
11991204
}

x/wasm/keeper/keeper_cgo.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ func NewKeeper(
4747
accountPruner: NewVestingCoinBurner(bankKeeper),
4848
portKeeper: portKeeper,
4949
capabilityKeeper: capabilityKeeper,
50-
messenger: NewDefaultMessageHandler(router, ics4Wrapper, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource),
5150
queryGasLimit: wasmConfig.SmartQueryGasLimit,
5251
gasRegister: types.NewDefaultWasmGasRegister(),
5352
maxQueryStackSize: types.DefaultMaxQueryStackSize,
@@ -56,8 +55,11 @@ func NewKeeper(
5655
propagateGovAuthorization: map[types.AuthorizationPolicyAction]struct{}{
5756
types.AuthZActionInstantiate: {},
5857
},
59-
authority: authority,
58+
authority: authority,
59+
ibcPortNameGenerator: DefaultIBCPortNameGenerator{},
6060
}
61+
keeper.messenger = NewDefaultMessageHandler(router, ics4Wrapper, channelKeeper, capabilityKeeper, bankKeeper, cdc, portSource, keeper.ibcPortNameGenerator)
62+
6163
keeper.wasmVMQueryHandler = DefaultQueryPlugins(bankKeeper, stakingKeeper, distrKeeper, channelKeeper, keeper)
6264
preOpts, postOpts := splitOpts(opts)
6365
for _, o := range preOpts {

0 commit comments

Comments
 (0)