Skip to content

Commit 24b17bd

Browse files
authored
refactor: remove SendTransfer, require IBC transfers to be initiated with MsgTransfer (#2446)
## Description closes: #1918 --- Before we can merge this PR, please make sure that all the following items have been checked off. If any of the checklist items are not applicable, please leave them but write a little note why. - [x] Targeted PR against correct branch (see [CONTRIBUTING.md](https://github.com/cosmos/ibc-go/blob/master/CONTRIBUTING.md#pr-targeting)) - [x] Linked to Github issue with discussion and accepted design OR link to spec that describes this work. - [x] Code follows the [module structure standards](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules/structure.md). - [x] Wrote unit and integration [tests](https://github.com/cosmos/ibc-go/blob/master/CONTRIBUTING.md#testing) - [x] Updated relevant documentation (`docs/`) or specification (`x/<module>/spec/`) - [x] Added relevant `godoc` [comments](https://blog.golang.org/godoc-documenting-go-code). - [x] Added a relevant changelog entry to the `Unreleased` section in `CHANGELOG.md` - [x] Re-reviewed `Files changed` in the Github PR explorer - [x] Review `Codecov Report` in the comment section below once CI passes
1 parent 4c45212 commit 24b17bd

File tree

6 files changed

+117
-138
lines changed

6 files changed

+117
-138
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
4242

4343
### API Breaking
4444

45+
* (apps/transfer) [\#2446](https://github.com/cosmos/ibc-go/pull/2446) Remove `SendTransfer` function in favor of a private `sendTransfer` function. All IBC transfers must be initiated with `MsgTransfer`.
4546
* (apps/29-fee) [\#2395](https://github.com/cosmos/ibc-go/pull/2395) Remove param space from ics29 NewKeeper function. The field was unused.
4647
* (apps/27-interchain-accounts) [\#2133](https://github.com/cosmos/ibc-go/pull/2133) Generates genesis protos in a separate directory to avoid circular import errors. The protobuf package name has changed for the genesis types.
4748
* (light-clients/tendermint)[\#1768](https://github.com/cosmos/ibc-go/pull/1768) Removed `AllowUpdateAfterExpiry`, `AllowUpdateAfterMisbehaviour` booleans as they are deprecated (see ADR026)

modules/apps/transfer/keeper/mbt_relay_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -339,16 +339,18 @@ func (suite *KeeperTestSuite) TestModelBasedRelay() {
339339
if !ok {
340340
panic("MBT failed to parse amount from string")
341341
}
342-
err = suite.chainB.GetSimApp().TransferKeeper.SendTransfer(
343-
suite.chainB.GetContext(),
342+
msg := types.NewMsgTransfer(
344343
tc.packet.SourcePort,
345344
tc.packet.SourceChannel,
346345
sdk.NewCoin(denom, amount),
347-
sender,
346+
sender.String(),
348347
tc.packet.Data.Receiver,
349-
clienttypes.NewHeight(1, 110),
350-
0,
351-
nil)
348+
suite.chainA.GetTimeoutHeight(), 0, // only use timeout height
349+
nil,
350+
)
351+
352+
_, err = suite.chainB.GetSimApp().TransferKeeper.Transfer(sdk.WrapSDKContext(suite.chainB.GetContext()), msg)
353+
352354
}
353355
case "OnRecvPacket":
354356
err = suite.chainB.GetSimApp().TransferKeeper.OnRecvPacket(suite.chainB.GetContext(), packet, tc.packet.Data)

modules/apps/transfer/keeper/msg_server.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
sdk "github.com/cosmos/cosmos-sdk/types"
7+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
78

89
"github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
910
)
@@ -14,11 +15,19 @@ var _ types.MsgServer = Keeper{}
1415
func (k Keeper) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*types.MsgTransferResponse, error) {
1516
ctx := sdk.UnwrapSDKContext(goCtx)
1617

18+
if !k.GetSendEnabled(ctx) {
19+
return nil, types.ErrSendDisabled
20+
}
21+
1722
sender, err := sdk.AccAddressFromBech32(msg.Sender)
1823
if err != nil {
1924
return nil, err
2025
}
2126

27+
if k.bankKeeper.BlockedAddr(sender) {
28+
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to send funds", sender)
29+
}
30+
2231
sequence, err := k.sendTransfer(
2332
ctx, msg.SourcePort, msg.SourceChannel, msg.Token, sender, msg.Receiver, msg.TimeoutHeight, msg.TimeoutTimestamp,
2433
msg.Metadata)

modules/apps/transfer/keeper/msg_server_test.go

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,17 @@ func (suite *KeeperTestSuite) TestMsgTransfer() {
1919
func() {},
2020
true,
2121
},
22+
{
23+
"send transfers disabled",
24+
func() {
25+
suite.chainA.GetSimApp().TransferKeeper.SetParams(suite.chainA.GetContext(),
26+
types.Params{
27+
SendEnabled: false,
28+
},
29+
)
30+
},
31+
false,
32+
},
2233
{
2334
"invalid sender",
2435
func() {
@@ -43,31 +54,33 @@ func (suite *KeeperTestSuite) TestMsgTransfer() {
4354
}
4455

4556
for _, tc := range testCases {
46-
suite.SetupTest()
57+
suite.Run(tc.name, func() {
58+
suite.SetupTest()
4759

48-
path := NewTransferPath(suite.chainA, suite.chainB)
49-
suite.coordinator.Setup(path)
60+
path := NewTransferPath(suite.chainA, suite.chainB)
61+
suite.coordinator.Setup(path)
5062

51-
coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
52-
msg = types.NewMsgTransfer(
53-
path.EndpointA.ChannelConfig.PortID,
54-
path.EndpointA.ChannelID,
55-
coin, suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(),
56-
suite.chainB.GetTimeoutHeight(), 0, // only use timeout height
57-
[]byte("custom metadata"),
58-
)
63+
coin := sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(100))
64+
msg = types.NewMsgTransfer(
65+
path.EndpointA.ChannelConfig.PortID,
66+
path.EndpointA.ChannelID,
67+
coin, suite.chainA.SenderAccount.GetAddress().String(), suite.chainB.SenderAccount.GetAddress().String(),
68+
suite.chainB.GetTimeoutHeight(), 0, // only use timeout height
69+
[]byte("custom metadata"),
70+
)
5971

60-
tc.malleate()
72+
tc.malleate()
6173

62-
res, err := suite.chainA.GetSimApp().TransferKeeper.Transfer(sdk.WrapSDKContext(suite.chainA.GetContext()), msg)
74+
res, err := suite.chainA.GetSimApp().TransferKeeper.Transfer(sdk.WrapSDKContext(suite.chainA.GetContext()), msg)
6375

64-
if tc.expPass {
65-
suite.Require().NotEqual(res.Sequence, uint64(0))
66-
suite.Require().NoError(err)
67-
suite.Require().NotNil(res)
68-
} else {
69-
suite.Require().Error(err)
70-
suite.Require().Nil(res)
71-
}
76+
if tc.expPass {
77+
suite.Require().NoError(err)
78+
suite.Require().NotNil(res)
79+
suite.Require().NotEqual(res.Sequence, uint64(0))
80+
} else {
81+
suite.Require().Error(err)
82+
suite.Require().Nil(res)
83+
}
84+
})
7285
}
7386
}

modules/apps/transfer/keeper/relay.go

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
coretypes "github.com/cosmos/ibc-go/v6/modules/core/types"
1717
)
1818

19-
// SendTransfer handles transfer sending logic. There are 2 possible cases:
19+
// sendTransfer handles transfer sending logic. There are 2 possible cases:
2020
//
2121
// 1. Sender chain is acting as the source zone. The coins are transferred
2222
// to an escrow address (i.e locked) on the sender chain and then transferred
@@ -48,34 +48,6 @@ import (
4848
// 4. A -> C : sender chain is sink zone. Denom upon receiving: 'C/B/denom'
4949
// 5. C -> B : sender chain is sink zone. Denom upon receiving: 'B/denom'
5050
// 6. B -> A : sender chain is sink zone. Denom upon receiving: 'denom'
51-
//
52-
// Note: An IBC Transfer must be initiated using a MsgTransfer via the Transfer rpc handler
53-
func (k Keeper) SendTransfer(
54-
ctx sdk.Context,
55-
sourcePort,
56-
sourceChannel string,
57-
token sdk.Coin,
58-
sender sdk.AccAddress,
59-
receiver string,
60-
timeoutHeight clienttypes.Height,
61-
timeoutTimestamp uint64,
62-
metadata []byte,
63-
) error {
64-
_, err := k.sendTransfer(
65-
ctx,
66-
sourcePort,
67-
sourceChannel,
68-
token,
69-
sender,
70-
receiver,
71-
timeoutHeight,
72-
timeoutTimestamp,
73-
metadata,
74-
)
75-
return err
76-
}
77-
78-
// sendTransfer handles transfer sending logic.
7951
func (k Keeper) sendTransfer(
8052
ctx sdk.Context,
8153
sourcePort,
@@ -87,14 +59,6 @@ func (k Keeper) sendTransfer(
8759
timeoutTimestamp uint64,
8860
metadata []byte,
8961
) (uint64, error) {
90-
if !k.GetSendEnabled(ctx) {
91-
return 0, types.ErrSendDisabled
92-
}
93-
94-
if k.bankKeeper.BlockedAddr(sender) {
95-
return 0, sdkerrors.Wrapf(sdkerrors.ErrUnauthorized, "%s is not allowed to send funds", sender)
96-
}
97-
9862
channel, found := k.channelKeeper.GetChannel(ctx, sourcePort, sourceChannel)
9963
if !found {
10064
return 0, sdkerrors.Wrapf(channeltypes.ErrChannelNotFound, "port ID (%s) channel ID (%s)", sourcePort, sourceChannel)

0 commit comments

Comments
 (0)