Skip to content

Commit

Permalink
feat: Improve TransferV2 API
Browse files Browse the repository at this point in the history
  • Loading branch information
kulikthebird committed Feb 11, 2025
1 parent 04c0f51 commit 78aca0f
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 39 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/CosmWasm/wasmd
go 1.23.1

require (
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250203131529-d31a37c53d81
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250207160143-733babc9015a
github.com/cosmos/cosmos-proto v1.0.0-beta.5
github.com/cosmos/cosmos-sdk v0.50.11
github.com/cosmos/gogogateway v1.2.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250203131529-d31a37c53d81 h1:G8P/Fah2W0Cf/FDBM3IczkVg9Ym6GsTpbIUbegPi50w=
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250203131529-d31a37c53d81/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg=
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250207160143-733babc9015a h1:UF88iJZK+/MsImDRFrjma+yXPOfDl3mcCzxiTr0dmSk=
github.com/CosmWasm/wasmvm/v2 v2.2.2-0.20250207160143-733babc9015a/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZbT4ztOl6bg=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q=
github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
Expand Down
Binary file modified tests/e2e/testdata/ibc_callbacks.wasm
Binary file not shown.
75 changes: 51 additions & 24 deletions x/wasm/keeper/handler_plugin_encoders.go
Original file line number Diff line number Diff line change
Expand Up @@ -326,18 +326,52 @@ func EncodeIBCMsg(portSource types.ICS20TransferPortSource) func(ctx sdk.Context
if err != nil {
return nil, errorsmod.Wrap(err, "amount")
}
msg := &ibctransfertypes.MsgTransfer{
SourcePort: portSource.GetPort(ctx),
SourceChannel: msg.TransferV2.ChannelID,
Tokens: tokens,
Sender: sender.String(),
Receiver: msg.TransferV2.ToAddress,
TimeoutHeight: ConvertWasmIBCTimeoutHeightToCosmosHeight(msg.TransferV2.Timeout.Block),
TimeoutTimestamp: msg.TransferV2.Timeout.Timestamp,
Memo: msg.TransferV2.Memo,
Forwarding: ConvertWasmForwardingToIbcForwarding(msg.TransferV2.Forwarding),
msgTransferV2 := msg.TransferV2.TransferType
switch {
case msgTransferV2.Direct != nil:
msg := &ibctransfertypes.MsgTransfer{
SourcePort: portSource.GetPort(ctx),
SourceChannel: msgTransferV2.Direct.ChannelID,
Tokens: tokens,
Sender: sender.String(),
Receiver: msg.TransferV2.ToAddress,
TimeoutHeight: ConvertWasmIBCTimeoutHeightToCosmosHeight(msgTransferV2.Direct.IBCTimeout.Block),
TimeoutTimestamp: msgTransferV2.Direct.IBCTimeout.Timestamp,
Memo: msg.TransferV2.Memo,
}
return []sdk.Msg{msg}, nil
case msgTransferV2.MultiHop != nil:
msg := &ibctransfertypes.MsgTransfer{
SourcePort: portSource.GetPort(ctx),
SourceChannel: msgTransferV2.MultiHop.ChannelID,
Tokens: tokens,
Sender: sender.String(),
Receiver: msg.TransferV2.ToAddress,
TimeoutTimestamp: uint64(msgTransferV2.MultiHop.Timeout),
Memo: msg.TransferV2.Memo,
Forwarding: &ibctransfertypes.Forwarding{
Hops: ConvertWasmHopsToIbcHops(msgTransferV2.MultiHop.Hops),
Unwind: false,
},
}
return []sdk.Msg{msg}, nil
case msgTransferV2.Unwinding != nil:
msg := &ibctransfertypes.MsgTransfer{
SourcePort: portSource.GetPort(ctx),
Tokens: tokens,
Sender: sender.String(),
Receiver: msg.TransferV2.ToAddress,
TimeoutTimestamp: uint64(msgTransferV2.Unwinding.Timeout),
Memo: msg.TransferV2.Memo,
Forwarding: &ibctransfertypes.Forwarding{
Hops: ConvertWasmHopsToIbcHops(msgTransferV2.Unwinding.Hops),
Unwind: true,
},
}
return []sdk.Msg{msg}, nil
default:
return nil, errorsmod.Wrap(types.ErrUnknownMsg, "unknown variant of IBC TransferV2 message")
}
return []sdk.Msg{msg}, nil
case msg.PayPacketFee != nil:
fee, err := ConvertIBCFee(&msg.PayPacketFee.Fee)
if err != nil {
Expand Down Expand Up @@ -440,20 +474,13 @@ func ConvertWasmCoinsToSdkCoins(coins []wasmvmtypes.Coin) (sdk.Coins, error) {
}

// ConvertWasmHopsToIbcHops converts the wasm []hop type to IBC type []hop
func ConvertWasmForwardingToIbcForwarding(forwarding *wasmvmtypes.Forwarding) *ibctransfertypes.Forwarding {
if forwarding != nil {
forwardingHops := []ibctransfertypes.Hop{}
for _, hop := range forwarding.Hops {
newHop := ibctransfertypes.NewHop(hop.PortID, hop.ChannelID)
forwardingHops = append(forwardingHops, newHop)
}
return &ibctransfertypes.Forwarding{
Hops: forwardingHops,
Unwind: forwarding.Unwind,
}
} else {
return nil
func ConvertWasmHopsToIbcHops(hops []wasmvmtypes.Hop) []ibctransfertypes.Hop {
forwardingHops := []ibctransfertypes.Hop{}
for _, hop := range hops {
newHop := ibctransfertypes.NewHop(hop.PortID, hop.ChannelID)
forwardingHops = append(forwardingHops, newHop)
}
return forwardingHops
}

// ConvertWasmCoinToSdkCoin converts a wasm vm type coin to sdk type coin
Expand Down
81 changes: 69 additions & 12 deletions x/wasm/keeper/handler_plugin_encoders_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -694,13 +694,18 @@ func TestEncodeIbcMsg(t *testing.T) {
},
},
},
"TransferV2 without forwarding": {
"TransferV2 direct": {
sender: addr1,
srcContractIBCPort: "myIBCPort",
srcMsg: wasmvmtypes.CosmosMsg{
IBC: &wasmvmtypes.IBCMsg{
TransferV2: &wasmvmtypes.TransferV2Msg{
ChannelID: "myChanID",
TransferType: wasmvmtypes.TransferV2Type{
Direct: &wasmvmtypes.DirectType{
ChannelID: "myChanID",
IBCTimeout: wasmvmtypes.IBCTimeout{Timestamp: 100, Block: &wasmvmtypes.IBCTimeoutBlock{Revision: 22, Height: 10}},
},
},
ToAddress: addr2.String(),
Tokens: []wasmvmtypes.Coin{
{
Expand All @@ -712,8 +717,7 @@ func TestEncodeIbcMsg(t *testing.T) {
Amount: "12",
},
},
Timeout: wasmvmtypes.IBCTimeout{Timestamp: 100},
Memo: "myMemo",
Memo: "myMemo",
},
},
},
Expand All @@ -737,6 +741,7 @@ func TestEncodeIbcMsg(t *testing.T) {
Sender: addr1.String(),
Receiver: addr2.String(),
TimeoutTimestamp: 100,
TimeoutHeight: clienttypes.Height{RevisionNumber: 22, RevisionHeight: 10},
Memo: "myMemo",
},
},
Expand All @@ -747,7 +752,13 @@ func TestEncodeIbcMsg(t *testing.T) {
srcMsg: wasmvmtypes.CosmosMsg{
IBC: &wasmvmtypes.IBCMsg{
TransferV2: &wasmvmtypes.TransferV2Msg{
ChannelID: "myChanID",
TransferType: wasmvmtypes.TransferV2Type{
MultiHop: &wasmvmtypes.MultiHopType{
ChannelID: "myChanID",
Timeout: 100,
Hops: []wasmvmtypes.Hop{{ChannelID: "chnl1", PortID: "port1"}},
},
},
ToAddress: addr2.String(),
Tokens: []wasmvmtypes.Coin{
{
Expand All @@ -759,12 +770,7 @@ func TestEncodeIbcMsg(t *testing.T) {
Amount: "12",
},
},
Timeout: wasmvmtypes.IBCTimeout{Timestamp: 100},
Memo: "myMemo",
Forwarding: &wasmvmtypes.Forwarding{
Hops: []wasmvmtypes.Hop{{ChannelID: "chnl1", PortID: "port1"}},
Unwind: false,
},
Memo: "myMemo",
},
},
},
Expand All @@ -789,7 +795,58 @@ func TestEncodeIbcMsg(t *testing.T) {
Receiver: addr2.String(),
TimeoutTimestamp: 100,
Memo: "myMemo",
Forwarding: &ibctransfertypes.Forwarding{Hops: []ibctransfertypes.Hop{{ChannelId: "chnl1", PortId: "port1"}}},
Forwarding: &ibctransfertypes.Forwarding{Hops: []ibctransfertypes.Hop{{ChannelId: "chnl1", PortId: "port1"}}, Unwind: false},
},
},
},
"TransferV2 with unwinding": {
sender: addr1,
srcContractIBCPort: "myIBCPort",
srcMsg: wasmvmtypes.CosmosMsg{
IBC: &wasmvmtypes.IBCMsg{
TransferV2: &wasmvmtypes.TransferV2Msg{
TransferType: wasmvmtypes.TransferV2Type{
Unwinding: &wasmvmtypes.UnwindingType{
Timeout: 100,
Hops: []wasmvmtypes.Hop{{ChannelID: "chnl1", PortID: "port1"}},
},
},
ToAddress: addr2.String(),
Tokens: []wasmvmtypes.Coin{
{
Denom: "TK1",
Amount: "1",
},
{
Denom: "TK2",
Amount: "12",
},
},
Memo: "myMemo",
},
},
},
transferPortSource: wasmtesting.MockIBCTransferKeeper{GetPortFn: func(ctx sdk.Context) string {
return "myTransferPort"
}},
output: []sdk.Msg{
&ibctransfertypes.MsgTransfer{
SourcePort: "myTransferPort",
Tokens: []sdk.Coin{
{
Denom: "TK1",
Amount: sdkmath.NewInt(1),
},
{
Denom: "TK2",
Amount: sdkmath.NewInt(12),
},
},
Sender: addr1.String(),
Receiver: addr2.String(),
TimeoutTimestamp: 100,
Memo: "myMemo",
Forwarding: &ibctransfertypes.Forwarding{Hops: []ibctransfertypes.Hop{{ChannelId: "chnl1", PortId: "port1"}}, Unwind: true},
},
},
},
Expand Down

0 comments on commit 78aca0f

Please sign in to comment.