From cf29e1daca121ad040536ad97fc322ec2b1848c7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 12:35:00 +0100 Subject: [PATCH 01/11] Most of code port from mock module to ICS 20 --- x/ibc/20-transfer/alias.go | 1 + x/ibc/20-transfer/client/cli/tx.go | 62 ++++++++++ x/ibc/20-transfer/handler.go | 25 +++- x/ibc/20-transfer/keeper/relay.go | 18 +++ x/ibc/20-transfer/types/errors.go | 2 + x/ibc/20-transfer/types/expected_keepers.go | 2 + x/ibc/20-transfer/types/msgs.go | 71 +++++++++-- x/ibc/mock/bank/alias.go | 26 ----- x/ibc/mock/bank/client/cli/tx.go | 85 -------------- x/ibc/mock/bank/handler.go | 26 ----- x/ibc/mock/bank/internal/keeper/keeper.go | 44 ------- x/ibc/mock/bank/internal/types/codec.go | 19 --- x/ibc/mock/bank/internal/types/errors.go | 15 --- .../bank/internal/types/expected_keepers.go | 25 ---- x/ibc/mock/bank/internal/types/keys.go | 15 --- x/ibc/mock/bank/internal/types/msgs.go | 61 ---------- x/ibc/mock/bank/module.go | 110 ------------------ 17 files changed, 173 insertions(+), 434 deletions(-) delete mode 100644 x/ibc/mock/bank/alias.go delete mode 100644 x/ibc/mock/bank/client/cli/tx.go delete mode 100644 x/ibc/mock/bank/handler.go delete mode 100644 x/ibc/mock/bank/internal/keeper/keeper.go delete mode 100644 x/ibc/mock/bank/internal/types/codec.go delete mode 100644 x/ibc/mock/bank/internal/types/errors.go delete mode 100644 x/ibc/mock/bank/internal/types/expected_keepers.go delete mode 100644 x/ibc/mock/bank/internal/types/keys.go delete mode 100644 x/ibc/mock/bank/internal/types/msgs.go delete mode 100644 x/ibc/mock/bank/module.go diff --git a/x/ibc/20-transfer/alias.go b/x/ibc/20-transfer/alias.go index ba4008d57374..66028740581e 100644 --- a/x/ibc/20-transfer/alias.go +++ b/x/ibc/20-transfer/alias.go @@ -56,6 +56,7 @@ type ( ConnectionKeeper = types.ConnectionKeeper SupplyKeeper = types.SupplyKeeper MsgTransfer = types.MsgTransfer + MsgRecvPacket = types.MsgRecvPacket PacketData = types.PacketData PacketDataAlias = types.PacketDataAlias ) diff --git a/x/ibc/20-transfer/client/cli/tx.go b/x/ibc/20-transfer/client/cli/tx.go index e9e12f28d4a8..2f6e4e42f965 100644 --- a/x/ibc/20-transfer/client/cli/tx.go +++ b/x/ibc/20-transfer/client/cli/tx.go @@ -1,16 +1,24 @@ package cli import ( + "fmt" + "io/ioutil" + "os" + "strconv" + "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/context" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/client/utils" + channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" + "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ) // IBC transfer flags @@ -26,6 +34,7 @@ func GetTxCmd(cdc *codec.Codec) *cobra.Command { } txCmd.AddCommand( GetTransferTxCmd(cdc), + GetMsgRecvPacketCmd(cdc), ) return txCmd @@ -68,3 +77,56 @@ func GetTransferTxCmd(cdc *codec.Codec) *cobra.Command { cmd.Flags().Bool(FlagSource, false, "Pass flag for sending token from the source chain") return cmd } + +// GetMsgRecvPacketCmd returns the command to create a MsgRecvTransferPacket transaction +func GetMsgRecvPacketCmd(cdc *codec.Codec) *cobra.Command { + cmd := &cobra.Command{ + Use: "recv-packet [/path/to/packet-data.json] [/path/to/proof.json] [height]", + Short: "Creates and sends a SendPacket message", + Args: cobra.ExactArgs(3), + RunE: func(cmd *cobra.Command, args []string) error { + txBldr := auth.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc)) + cliCtx := context.NewCLIContext().WithCodec(cdc).WithBroadcastMode(flags.BroadcastBlock) + + var packet channel.Packet + if err := cdc.UnmarshalJSON([]byte(args[0]), &packet); err != nil { + fmt.Fprintf(os.Stderr, "failed to unmarshall input into struct, checking for file...\n") + contents, err := ioutil.ReadFile(args[0]) + if err != nil { + return fmt.Errorf("error opening packet file: %v", err) + } + + if err := cdc.UnmarshalJSON(contents, packet); err != nil { + return fmt.Errorf("error unmarshalling packet file: %v", err) + } + } + + var proof commitment.Proof + if err := cdc.UnmarshalJSON([]byte(args[1]), &proof); err != nil { + fmt.Fprintf(os.Stderr, "failed to unmarshall input into struct, checking for file...\n") + contents, err := ioutil.ReadFile(args[1]) + if err != nil { + return fmt.Errorf("error opening proofs file: %v", err) + } + if err := cdc.UnmarshalJSON(contents, &proof); err != nil { + return fmt.Errorf("error unmarshalling proofs file: %v", err) + } + } + + height, err := strconv.ParseUint(args[2], 10, 64) + if err != nil { + return fmt.Errorf("error height: %v", err) + } + + msg := types.NewMsgRecvPacket(packet, []commitment.Proof{proof}, height, cliCtx.GetFromAddress()) + if err := msg.ValidateBasic(); err != nil { + return err + } + + return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) + }, + } + + cmd = client.PostCommands(cmd)[0] + return cmd +} diff --git a/x/ibc/20-transfer/handler.go b/x/ibc/20-transfer/handler.go index 52f47fab9257..13c3cd9c742d 100644 --- a/x/ibc/20-transfer/handler.go +++ b/x/ibc/20-transfer/handler.go @@ -5,8 +5,31 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" ) +func NewHandler(k Keeper) sdk.Handler { + return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { + switch msg := msg.(type) { + case MsgRecvPacket: + return handleMsgRecvPacket(ctx, k, msg) + case MsgTransfer: + return handleMsgTransfer(ctx, k, msg) + default: + return sdk.ErrUnknownRequest("failed to parse message").Result() + } + } +} + +// handleMsgRecvPacket defines the sdk.Handler for MsgRecvPacket +func handleMsgRecvPacket(ctx sdk.Context, k Keeper, msg MsgRecvPacket) (res sdk.Result) { + err := k.ReceivePacket(ctx, msg.Packet, msg.Proofs[0], msg.Height) + if err != nil { + return sdk.ResultFromError(err) + } + + return sdk.Result{Events: ctx.EventManager().Events()} +} + // HandleMsgTransfer defines the sdk.Handler for MsgTransfer -func HandleMsgTransfer(ctx sdk.Context, k Keeper, msg MsgTransfer) (res sdk.Result) { +func handleMsgTransfer(ctx sdk.Context, k Keeper, msg MsgTransfer) (res sdk.Result) { err := k.SendTransfer(ctx, msg.SourcePort, msg.SourceChannel, msg.Amount, msg.Sender, msg.Receiver, msg.Source) if err != nil { return sdk.ResultFromError(err) diff --git a/x/ibc/20-transfer/keeper/relay.go b/x/ibc/20-transfer/keeper/relay.go index 2b481299606a..343813cb1d8d 100644 --- a/x/ibc/20-transfer/keeper/relay.go +++ b/x/ibc/20-transfer/keeper/relay.go @@ -5,8 +5,10 @@ import ( "strings" sdk "github.com/cosmos/cosmos-sdk/types" + channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" + "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ) // SendTransfer handles transfer sending logic @@ -50,6 +52,22 @@ func (k Keeper) SendTransfer( return k.createOutgoingPacket(ctx, sequence, sourcePort, sourceChannel, destinationPort, destinationChannel, coins, sender, receiver, isSourceChain) } +// ReceivePacket handles receiving packet +func (k Keeper) ReceivePacket(ctx sdk.Context, packet channelexported.PacketI, proof commitment.ProofI, height uint64) error { + _, err := k.channelKeeper.RecvPacket(ctx, packet, proof, height, nil, k.storeKey) + if err != nil { + return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeErrReceivePacket, "failed to receive packet") + } + + var data types.PacketData + err = data.UnmarshalJSON(packet.Data()) + if err != nil { + return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeInvalidPacketData, "invalid packet data") + } + + return k.ReceiveTransfer(ctx, packet.SourcePort(), packet.SourceChannel(), packet.DestPort(), packet.DestChannel(), data) +} + // ReceiveTransfer handles transfer receiving logic func (k Keeper) ReceiveTransfer( ctx sdk.Context, diff --git a/x/ibc/20-transfer/types/errors.go b/x/ibc/20-transfer/types/errors.go index 090804150095..0f927acffd68 100644 --- a/x/ibc/20-transfer/types/errors.go +++ b/x/ibc/20-transfer/types/errors.go @@ -16,6 +16,8 @@ const ( CodeInvalidChannelOrder sdk.CodeType = 104 CodeInvalidPort sdk.CodeType = 105 CodeInvalidVersion sdk.CodeType = 106 + CodeProofMissing sdk.CodeType = 107 + CodeErrReceivePacket sdk.CodeType = 108 ) // ErrInvalidAddress implements sdk.Error diff --git a/x/ibc/20-transfer/types/expected_keepers.go b/x/ibc/20-transfer/types/expected_keepers.go index 2e855dfd8079..252eb8060645 100644 --- a/x/ibc/20-transfer/types/expected_keepers.go +++ b/x/ibc/20-transfer/types/expected_keepers.go @@ -6,6 +6,7 @@ import ( connection "github.com/cosmos/cosmos-sdk/x/ibc/03-connection" channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel" channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" + commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" supplyexported "github.com/cosmos/cosmos-sdk/x/supply/exported" ) @@ -19,6 +20,7 @@ type ChannelKeeper interface { GetChannel(ctx sdk.Context, srcPort, srcChan string) (channel channel.Channel, found bool) GetNextSequenceSend(ctx sdk.Context, portID, channelID string) (uint64, bool) SendPacket(ctx sdk.Context, packet channelexported.PacketI, portCapability sdk.CapabilityKey) error + RecvPacket(ctx sdk.Context, packet channelexported.PacketI, proof commitment.ProofI, proofHeight uint64, acknowledgement []byte, portCapability sdk.CapabilityKey) (channelexported.PacketI, error) } // ClientKeeper defines the expected IBC client keeper diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index e2d4a725b6d1..0967e94f3e39 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -5,16 +5,17 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/cosmos-sdk/x/ibc/24-host" + + channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" + "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ibctypes "github.com/cosmos/cosmos-sdk/x/ibc/types" ) -type MsgTransfer struct { - SourcePort string `json:"source_port" yaml:"source_port"` // the port on which the packet will be sent - SourceChannel string `json:"source_channel" yaml:"source_channel"` // the channel by which the packet will be sent - Amount sdk.Coins `json:"amount" yaml:"amount"` // the tokens to be transferred - Sender sdk.AccAddress `json:"sender" yaml:"sender"` // the sender address - Receiver sdk.AccAddress `json:"receiver" yaml:"receiver"` // the recipient address on the destination chain - Source bool `json:"source" yaml:"source"` // indicates if the sending chain is the source chain of the tokens to be transferred +type MsgRecvPacket struct { + Packet channel.PacketI `json:"packet" yaml:"packet"` + Proofs []commitment.Proof `json:"proofs" yaml:"proofs"` + Height uint64 `json:"height" yaml:"height"` + Signer sdk.AccAddress `json:"signer" yaml:"signer"` } // NewMsgTransfer creates a new MsgTransfer instance @@ -73,3 +74,59 @@ func (msg MsgTransfer) GetSignBytes() []byte { func (msg MsgTransfer) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Sender} } + +type MsgTransfer struct { + SourcePort string `json:"source_port" yaml:"source_port"` // the port on which the packet will be sent + SourceChannel string `json:"source_channel" yaml:"source_channel"` // the channel by which the packet will be sent + Amount sdk.Coins `json:"amount" yaml:"amount"` // the tokens to be transferred + Sender sdk.AccAddress `json:"sender" yaml:"sender"` // the sender address + Receiver sdk.AccAddress `json:"receiver" yaml:"receiver"` // the recipient address on the destination chain + Source bool `json:"source" yaml:"source"` // indicates if the sending chain is the source chain of the tokens to be transferred +} + +// NewMsgRecvPacket creates a new MsgRecvPacket instance +func NewMsgRecvPacket(packet channel.PacketI, proofs []commitment.Proof, height uint64, signer sdk.AccAddress) MsgRecvPacket { + return MsgRecvPacket{ + Packet: packet, + Proofs: proofs, + Height: height, + Signer: signer, + } +} + +// Route implements sdk.Msg +func (MsgRecvPacket) Route() string { + return RouterKey +} + +// Type implements sdk.Msg +func (MsgRecvPacket) Type() string { + return "recv_packet" +} + +// ValidateBasic implements sdk.Msg +func (msg MsgRecvPacket) ValidateBasic() sdk.Error { + if msg.Proofs == nil { + return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeProofMissing, "proof missing") + } + + if msg.Signer.Empty() { + return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeInvalidAddress, "invalid signer") + } + + if err := msg.Packet.ValidateBasic(); err != nil { + return err + } + + return nil +} + +// GetSignBytes implements sdk.Msg +func (msg MsgRecvPacket) GetSignBytes() []byte { + return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) +} + +// GetSigners implements sdk.Msg +func (msg MsgRecvPacket) GetSigners() []sdk.AccAddress { + return []sdk.AccAddress{msg.Signer} +} diff --git a/x/ibc/mock/bank/alias.go b/x/ibc/mock/bank/alias.go deleted file mode 100644 index 7447068ba7e7..000000000000 --- a/x/ibc/mock/bank/alias.go +++ /dev/null @@ -1,26 +0,0 @@ -package mockbank - -import ( - "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank/internal/keeper" - "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank/internal/types" -) - -type ( - MsgRecvPacket = types.MsgRecvPacket - Keeper = keeper.Keeper -) - -const ( - ModuleName = types.ModuleName - StoreKey = types.StoreKey - QuerierRoute = types.QuerierRoute - RouterKey = types.RouterKey -) - -// nolint -var ( - RegisterCdc = types.RegisterCodec - - NewKeeper = keeper.NewKeeper - NewMsgRecvPacket = types.NewMsgRecvPacket -) diff --git a/x/ibc/mock/bank/client/cli/tx.go b/x/ibc/mock/bank/client/cli/tx.go deleted file mode 100644 index 4bb1fb2fc7d3..000000000000 --- a/x/ibc/mock/bank/client/cli/tx.go +++ /dev/null @@ -1,85 +0,0 @@ -package cli - -import ( - "fmt" - "io/ioutil" - "os" - "strconv" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/auth" - "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel" - commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" - "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank/internal/types" - "github.com/spf13/cobra" -) - -func GetTxCmd(cdc *codec.Codec) *cobra.Command { - txCmd := &cobra.Command{ - Use: "ibcmockbank", - Short: "IBC mockbank module transaction subcommands", - } - txCmd.AddCommand( - GetMsgRecvPacketCmd(cdc), - ) - - return txCmd -} - -// GetMsgRecvPacketCmd returns the command to create a MsgRecvTransferPacket transaction -func GetMsgRecvPacketCmd(cdc *codec.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "recv-packet [/path/to/packet-data.json] [/path/to/proof.json] [height]", - Short: "Creates and sends a SendPacket message", - Args: cobra.ExactArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - txBldr := auth.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc)) - cliCtx := context.NewCLIContext().WithCodec(cdc).WithBroadcastMode(flags.BroadcastBlock) - - var packet channel.Packet - if err := cdc.UnmarshalJSON([]byte(args[0]), &packet); err != nil { - fmt.Fprintf(os.Stderr, "failed to unmarshall input into struct, checking for file...\n") - contents, err := ioutil.ReadFile(args[0]) - if err != nil { - return fmt.Errorf("error opening packet file: %v", err) - } - - if err := cdc.UnmarshalJSON(contents, packet); err != nil { - return fmt.Errorf("error unmarshalling packet file: %v", err) - } - } - - var proof commitment.Proof - if err := cdc.UnmarshalJSON([]byte(args[1]), &proof); err != nil { - fmt.Fprintf(os.Stderr, "failed to unmarshall input into struct, checking for file...\n") - contents, err := ioutil.ReadFile(args[1]) - if err != nil { - return fmt.Errorf("error opening proofs file: %v", err) - } - if err := cdc.UnmarshalJSON(contents, &proof); err != nil { - return fmt.Errorf("error unmarshalling proofs file: %v", err) - } - } - - height, err := strconv.ParseUint(args[2], 10, 64) - if err != nil { - return fmt.Errorf("error height: %v", err) - } - - msg := types.NewMsgRecvPacket(packet, []commitment.Proof{proof}, height, cliCtx.GetFromAddress()) - if err := msg.ValidateBasic(); err != nil { - return err - } - - return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg}) - }, - } - - cmd = client.PostCommands(cmd)[0] - return cmd -} diff --git a/x/ibc/mock/bank/handler.go b/x/ibc/mock/bank/handler.go deleted file mode 100644 index 2ed32c4c837e..000000000000 --- a/x/ibc/mock/bank/handler.go +++ /dev/null @@ -1,26 +0,0 @@ -package mockbank - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -func NewHandler(k Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { - switch msg := msg.(type) { - case MsgRecvPacket: - return handleMsgRecvPacket(ctx, k, msg) - default: - return sdk.ErrUnknownRequest("failed to parse message").Result() - } - } -} - -// handleMsgRecvPacket defines the sdk.Handler for MsgRecvPacket -func handleMsgRecvPacket(ctx sdk.Context, k Keeper, msg MsgRecvPacket) (res sdk.Result) { - err := k.ReceivePacket(ctx, msg.Packet, msg.Proofs[0], msg.Height) - if err != nil { - return sdk.ResultFromError(err) - } - - return sdk.Result{Events: ctx.EventManager().Events()} -} diff --git a/x/ibc/mock/bank/internal/keeper/keeper.go b/x/ibc/mock/bank/internal/keeper/keeper.go deleted file mode 100644 index bdcabcf53e94..000000000000 --- a/x/ibc/mock/bank/internal/keeper/keeper.go +++ /dev/null @@ -1,44 +0,0 @@ -package keeper - -import ( - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" - transfer "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer" - commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" - "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank/internal/types" -) - -type Keeper struct { - cdc *codec.Codec - key sdk.StoreKey - ck types.ChannelKeeper - bk types.IbcBankKeeper -} - -func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, ck types.ChannelKeeper, bk types.IbcBankKeeper) Keeper { - return Keeper{ - cdc: cdc, - key: key, - ck: ck, - bk: bk, - } -} - -// ReceivePacket handles receiving packet -func (k Keeper) ReceivePacket(ctx sdk.Context, packet channelexported.PacketI, proof commitment.ProofI, height uint64) error { - _, err := k.ck.RecvPacket(ctx, packet, proof, height, nil, k.key) - if err != nil { - return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeErrReceivePacket, "failed to receive packet") - } - - // only process ICS20 token transfer packet data now, - // that should be done in routing module. - var data transfer.PacketData - err = data.UnmarshalJSON(packet.Data()) - if err != nil { - return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeInvalidPacketData, "invalid packet data") - } - - return k.bk.ReceiveTransfer(ctx, packet.SourcePort(), packet.SourceChannel(), packet.DestPort(), packet.DestChannel(), data) -} diff --git a/x/ibc/mock/bank/internal/types/codec.go b/x/ibc/mock/bank/internal/types/codec.go deleted file mode 100644 index ba05f5bb00f7..000000000000 --- a/x/ibc/mock/bank/internal/types/codec.go +++ /dev/null @@ -1,19 +0,0 @@ -package types - -import ( - "github.com/cosmos/cosmos-sdk/codec" - channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel" - commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" -) - -func RegisterCodec(cdc *codec.Codec) { - cdc.RegisterConcrete(MsgRecvPacket{}, "ibcmockbank/MsgRecvPacket", nil) -} - -var ModuleCdc = codec.New() - -func init() { - RegisterCodec(ModuleCdc) - channel.RegisterCodec(ModuleCdc) - commitment.RegisterCodec(ModuleCdc) -} diff --git a/x/ibc/mock/bank/internal/types/errors.go b/x/ibc/mock/bank/internal/types/errors.go deleted file mode 100644 index 09cfc89784ff..000000000000 --- a/x/ibc/mock/bank/internal/types/errors.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" -) - -// ibcmockbank errors reserve 100 ~ 199. -const ( - DefaultCodespace sdk.CodespaceType = ModuleName - - CodeInvalidAddress sdk.CodeType = 101 - CodeErrReceivePacket sdk.CodeType = 102 - CodeProofMissing sdk.CodeType = 103 - CodeInvalidPacketData sdk.CodeType = 104 -) diff --git a/x/ibc/mock/bank/internal/types/expected_keepers.go b/x/ibc/mock/bank/internal/types/expected_keepers.go deleted file mode 100644 index 4c6e8e149169..000000000000 --- a/x/ibc/mock/bank/internal/types/expected_keepers.go +++ /dev/null @@ -1,25 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" - transfer "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer" - commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" -) - -// IbcBankKeeper expected IBC transfer keeper -type IbcBankKeeper interface { - ReceiveTransfer(ctx sdk.Context, srcPort, srcChannel, destPort, destChannel string, data transfer.PacketData) error -} - -// ChannelKeeper expected IBC channel keeper -type ChannelKeeper interface { - RecvPacket( - ctx sdk.Context, - packet exported.PacketI, - proof commitment.ProofI, - proofHeight uint64, - acknowledgement []byte, - portCapability sdk.CapabilityKey, - ) (exported.PacketI, error) -} diff --git a/x/ibc/mock/bank/internal/types/keys.go b/x/ibc/mock/bank/internal/types/keys.go deleted file mode 100644 index 2ffaa38eaa29..000000000000 --- a/x/ibc/mock/bank/internal/types/keys.go +++ /dev/null @@ -1,15 +0,0 @@ -package types - -const ( - // ModuleName is the name of the module - ModuleName = "ibcmockbank" - - // StoreKey is the string store representation - StoreKey = ModuleName - - // QuerierRoute is the querier route for the module - QuerierRoute = ModuleName - - // RouterKey is the msg router key for the module - RouterKey = ModuleName -) diff --git a/x/ibc/mock/bank/internal/types/msgs.go b/x/ibc/mock/bank/internal/types/msgs.go deleted file mode 100644 index 61d414591e34..000000000000 --- a/x/ibc/mock/bank/internal/types/msgs.go +++ /dev/null @@ -1,61 +0,0 @@ -package types - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" - commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" -) - -type MsgRecvPacket struct { - Packet channel.PacketI `json:"packet" yaml:"packet"` - Proofs []commitment.Proof `json:"proofs" yaml:"proofs"` - Height uint64 `json:"height" yaml:"height"` - Signer sdk.AccAddress `json:"signer" yaml:"signer"` -} - -// NewMsgRecvPacket creates a new MsgRecvPacket instance -func NewMsgRecvPacket(packet channel.PacketI, proofs []commitment.Proof, height uint64, signer sdk.AccAddress) MsgRecvPacket { - return MsgRecvPacket{ - Packet: packet, - Proofs: proofs, - Height: height, - Signer: signer, - } -} - -// Route implements sdk.Msg -func (MsgRecvPacket) Route() string { - return RouterKey -} - -// Type implements sdk.Msg -func (MsgRecvPacket) Type() string { - return "recv_packet" -} - -// ValidateBasic implements sdk.Msg -func (msg MsgRecvPacket) ValidateBasic() sdk.Error { - if msg.Proofs == nil { - return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeProofMissing, "proof missing") - } - - if msg.Signer.Empty() { - return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeInvalidAddress, "invalid signer") - } - - if err := msg.Packet.ValidateBasic(); err != nil { - return err - } - - return nil -} - -// GetSignBytes implements sdk.Msg -func (msg MsgRecvPacket) GetSignBytes() []byte { - return sdk.MustSortJSON(ModuleCdc.MustMarshalJSON(msg)) -} - -// GetSigners implements sdk.Msg -func (msg MsgRecvPacket) GetSigners() []sdk.AccAddress { - return []sdk.AccAddress{msg.Signer} -} diff --git a/x/ibc/mock/bank/module.go b/x/ibc/mock/bank/module.go deleted file mode 100644 index e033d1de5666..000000000000 --- a/x/ibc/mock/bank/module.go +++ /dev/null @@ -1,110 +0,0 @@ -package mockbank - -import ( - "encoding/json" - - "github.com/gorilla/mux" - "github.com/spf13/cobra" - - abci "github.com/tendermint/tendermint/abci/types" - - "github.com/cosmos/cosmos-sdk/client/context" - "github.com/cosmos/cosmos-sdk/codec" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank/client/cli" -) - -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} -) - -type AppModuleBasic struct{} - -var _ module.AppModuleBasic = AppModuleBasic{} - -func (AppModuleBasic) Name() string { - return ModuleName -} - -func (AppModuleBasic) RegisterCodec(cdc *codec.Codec) { - RegisterCdc(cdc) -} - -func (AppModuleBasic) DefaultGenesis() json.RawMessage { - return nil -} - -func (AppModuleBasic) ValidateGenesis(bz json.RawMessage) error { - return nil -} - -func (AppModuleBasic) RegisterRESTRoutes(ctx context.CLIContext, rtr *mux.Router) { - //noop -} - -func (AppModuleBasic) GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(cdc) -} - -func (AppModuleBasic) GetQueryCmd(cdc *codec.Codec) *cobra.Command { - return nil -} - -type AppModule struct { - AppModuleBasic - k Keeper -} - -func NewAppModule(k Keeper) AppModule { - return AppModule{ - AppModuleBasic: AppModuleBasic{}, - k: k, - } -} - -func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) { - -} - -func (AppModule) Name() string { - return ModuleName -} - -func (AppModule) Route() string { - return ModuleName -} - -func (am AppModule) NewHandler() sdk.Handler { - return NewHandler(am.k) -} - -func (am AppModule) QuerierRoute() string { - return ModuleName -} - -func (am AppModule) NewQuerierHandler() sdk.Querier { - return nil -} - -func (am AppModule) InitGenesis(ctx sdk.Context, data json.RawMessage) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} - -func (am AppModule) ExportGenesis(ctx sdk.Context) json.RawMessage { - return nil -} - -func (am AppModule) BeginBlock(ctx sdk.Context, req abci.RequestBeginBlock) { - -} - -func (am AppModule) EndBlock(ctx sdk.Context, req abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} - -// GetTxCmd returns the root tx command for the ibc-channel module. -func GetTxCmd(cdc *codec.Codec) *cobra.Command { - return cli.GetTxCmd(cdc) -} From 2010cc464f384aa9c5b1299e8940765d8a779210 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 12:49:26 +0100 Subject: [PATCH 02/11] A few minor fixes --- x/ibc/20-transfer/handler.go | 17 ++--------------- x/ibc/client/cli/cli.go | 2 -- x/ibc/handler.go | 3 +++ 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/x/ibc/20-transfer/handler.go b/x/ibc/20-transfer/handler.go index 13c3cd9c742d..49fe077acbe2 100644 --- a/x/ibc/20-transfer/handler.go +++ b/x/ibc/20-transfer/handler.go @@ -5,21 +5,8 @@ import ( "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" ) -func NewHandler(k Keeper) sdk.Handler { - return func(ctx sdk.Context, msg sdk.Msg) sdk.Result { - switch msg := msg.(type) { - case MsgRecvPacket: - return handleMsgRecvPacket(ctx, k, msg) - case MsgTransfer: - return handleMsgTransfer(ctx, k, msg) - default: - return sdk.ErrUnknownRequest("failed to parse message").Result() - } - } -} - // handleMsgRecvPacket defines the sdk.Handler for MsgRecvPacket -func handleMsgRecvPacket(ctx sdk.Context, k Keeper, msg MsgRecvPacket) (res sdk.Result) { +func HandleMsgRecvPacket(ctx sdk.Context, k Keeper, msg MsgRecvPacket) (res sdk.Result) { err := k.ReceivePacket(ctx, msg.Packet, msg.Proofs[0], msg.Height) if err != nil { return sdk.ResultFromError(err) @@ -29,7 +16,7 @@ func handleMsgRecvPacket(ctx sdk.Context, k Keeper, msg MsgRecvPacket) (res sdk. } // HandleMsgTransfer defines the sdk.Handler for MsgTransfer -func handleMsgTransfer(ctx sdk.Context, k Keeper, msg MsgTransfer) (res sdk.Result) { +func HandleMsgTransfer(ctx sdk.Context, k Keeper, msg MsgTransfer) (res sdk.Result) { err := k.SendTransfer(ctx, msg.SourcePort, msg.SourceChannel, msg.Amount, msg.Sender, msg.Receiver, msg.Source) if err != nil { return sdk.ResultFromError(err) diff --git a/x/ibc/client/cli/cli.go b/x/ibc/client/cli/cli.go index 5e58be761800..90ec11a8740f 100644 --- a/x/ibc/client/cli/cli.go +++ b/x/ibc/client/cli/cli.go @@ -8,7 +8,6 @@ import ( ibcclient "github.com/cosmos/cosmos-sdk/x/ibc/02-client" connection "github.com/cosmos/cosmos-sdk/x/ibc/03-connection" transfer "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer" - mockbank "github.com/cosmos/cosmos-sdk/x/ibc/mock/bank" "github.com/cosmos/cosmos-sdk/x/ibc/types" ) @@ -26,7 +25,6 @@ func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command { ibcclient.GetTxCmd(cdc, storeKey), connection.GetTxCmd(cdc, storeKey), transfer.GetTxCmd(cdc), - mockbank.GetTxCmd(cdc), ) return ibcTxCmd } diff --git a/x/ibc/handler.go b/x/ibc/handler.go index 3e432e57e2c5..a0af5394b667 100644 --- a/x/ibc/handler.go +++ b/x/ibc/handler.go @@ -61,6 +61,9 @@ func NewHandler(k Keeper) sdk.Handler { case transfer.MsgTransfer: return transfer.HandleMsgTransfer(ctx, k.TransferKeeper, msg) + case transfer.MsgRecvPacket: + return transfer.HandleMsgRecvPacket(ctx, k.TransferKeeper, msg) + default: errMsg := fmt.Sprintf("unrecognized IBC message type: %T", msg) return sdk.ErrUnknownRequest(errMsg).Result() From 953d3cb67eba1bf156c177b67d13b6b14fdabc7e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 12:53:49 +0100 Subject: [PATCH 03/11] Apply suggestions from code review Co-Authored-By: Bot from GolangCI <42910462+golangcibot@users.noreply.github.com> --- x/ibc/20-transfer/client/cli/tx.go | 2 +- x/ibc/20-transfer/keeper/relay.go | 2 +- x/ibc/20-transfer/types/msgs.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x/ibc/20-transfer/client/cli/tx.go b/x/ibc/20-transfer/client/cli/tx.go index 2f6e4e42f965..9ed230e0b38b 100644 --- a/x/ibc/20-transfer/client/cli/tx.go +++ b/x/ibc/20-transfer/client/cli/tx.go @@ -18,7 +18,7 @@ import ( "github.com/cosmos/cosmos-sdk/x/auth/client/utils" channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" - "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" + commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ) // IBC transfer flags diff --git a/x/ibc/20-transfer/keeper/relay.go b/x/ibc/20-transfer/keeper/relay.go index 343813cb1d8d..dac94c076063 100644 --- a/x/ibc/20-transfer/keeper/relay.go +++ b/x/ibc/20-transfer/keeper/relay.go @@ -8,7 +8,7 @@ import ( channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" channeltypes "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" - "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" + commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ) // SendTransfer handles transfer sending logic diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index 0967e94f3e39..7ec1ce597e59 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -7,7 +7,7 @@ import ( host "github.com/cosmos/cosmos-sdk/x/ibc/24-host" channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" - "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" + commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ibctypes "github.com/cosmos/cosmos-sdk/x/ibc/types" ) From 2eac8cc05163231b810b6a80f94dbeac8eebc384 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 12:55:21 +0100 Subject: [PATCH 04/11] Fix suggestions from autolinter --- x/ibc/20-transfer/keeper/relay.go | 2 +- x/ibc/20-transfer/types/msgs.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x/ibc/20-transfer/keeper/relay.go b/x/ibc/20-transfer/keeper/relay.go index dac94c076063..b0d60f1330b0 100644 --- a/x/ibc/20-transfer/keeper/relay.go +++ b/x/ibc/20-transfer/keeper/relay.go @@ -56,7 +56,7 @@ func (k Keeper) SendTransfer( func (k Keeper) ReceivePacket(ctx sdk.Context, packet channelexported.PacketI, proof commitment.ProofI, height uint64) error { _, err := k.channelKeeper.RecvPacket(ctx, packet, proof, height, nil, k.storeKey) if err != nil { - return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeErrReceivePacket, "failed to receive packet") + return sdk.NewError(types.DefaultCodespace, types.CodeErrReceivePacket, "failed to receive packet") } var data types.PacketData diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index 7ec1ce597e59..a95153fcb47d 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -107,11 +107,11 @@ func (MsgRecvPacket) Type() string { // ValidateBasic implements sdk.Msg func (msg MsgRecvPacket) ValidateBasic() sdk.Error { if msg.Proofs == nil { - return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeProofMissing, "proof missing") + return sdk.NewError(DefaultCodespace, CodeProofMissing, "proof missing") } if msg.Signer.Empty() { - return sdk.NewError(sdk.CodespaceType(DefaultCodespace), CodeInvalidAddress, "invalid signer") + return sdk.NewError(DefaultCodespace, CodeInvalidAddress, "invalid signer") } if err := msg.Packet.ValidateBasic(); err != nil { From 308a9b45c357d21ef370b90f6e5aa6f37933ce71 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 13:05:49 +0100 Subject: [PATCH 05/11] Apply suggestions from code review Co-Authored-By: Federico Kunze <31522760+fedekunze@users.noreply.github.com> --- x/ibc/20-transfer/client/cli/tx.go | 4 ++-- x/ibc/20-transfer/types/msgs.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x/ibc/20-transfer/client/cli/tx.go b/x/ibc/20-transfer/client/cli/tx.go index 9ed230e0b38b..99be5e6387c3 100644 --- a/x/ibc/20-transfer/client/cli/tx.go +++ b/x/ibc/20-transfer/client/cli/tx.go @@ -16,7 +16,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth" "github.com/cosmos/cosmos-sdk/x/auth/client/utils" - channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/types" + channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" "github.com/cosmos/cosmos-sdk/x/ibc/20-transfer/types" commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ) @@ -88,7 +88,7 @@ func GetMsgRecvPacketCmd(cdc *codec.Codec) *cobra.Command { txBldr := auth.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc)) cliCtx := context.NewCLIContext().WithCodec(cdc).WithBroadcastMode(flags.BroadcastBlock) - var packet channel.Packet + var packet channelexported.PacketI if err := cdc.UnmarshalJSON([]byte(args[0]), &packet); err != nil { fmt.Fprintf(os.Stderr, "failed to unmarshall input into struct, checking for file...\n") contents, err := ioutil.ReadFile(args[0]) diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index a95153fcb47d..1e5afa4e8fc4 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -6,13 +6,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" host "github.com/cosmos/cosmos-sdk/x/ibc/24-host" - channel "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" + channelexported "github.com/cosmos/cosmos-sdk/x/ibc/04-channel/exported" commitment "github.com/cosmos/cosmos-sdk/x/ibc/23-commitment" ibctypes "github.com/cosmos/cosmos-sdk/x/ibc/types" ) type MsgRecvPacket struct { - Packet channel.PacketI `json:"packet" yaml:"packet"` + Packet channelexported.PacketI `json:"packet" yaml:"packet"` Proofs []commitment.Proof `json:"proofs" yaml:"proofs"` Height uint64 `json:"height" yaml:"height"` Signer sdk.AccAddress `json:"signer" yaml:"signer"` @@ -85,7 +85,7 @@ type MsgTransfer struct { } // NewMsgRecvPacket creates a new MsgRecvPacket instance -func NewMsgRecvPacket(packet channel.PacketI, proofs []commitment.Proof, height uint64, signer sdk.AccAddress) MsgRecvPacket { +func NewMsgRecvPacket(packet channelexported.PacketI, proofs []commitment.Proof, height uint64, signer sdk.AccAddress) MsgRecvPacket { return MsgRecvPacket{ Packet: packet, Proofs: proofs, From 8d7fe1a962c8a75f32162373e3bb775666c446c9 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 14:22:57 +0100 Subject: [PATCH 06/11] Fix order of messages --- x/ibc/20-transfer/types/msgs.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index 1e5afa4e8fc4..aba0b5b60c96 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -11,11 +11,13 @@ import ( ibctypes "github.com/cosmos/cosmos-sdk/x/ibc/types" ) -type MsgRecvPacket struct { - Packet channelexported.PacketI `json:"packet" yaml:"packet"` - Proofs []commitment.Proof `json:"proofs" yaml:"proofs"` - Height uint64 `json:"height" yaml:"height"` - Signer sdk.AccAddress `json:"signer" yaml:"signer"` +type MsgTransfer struct { + SourcePort string `json:"source_port" yaml:"source_port"` // the port on which the packet will be sent + SourceChannel string `json:"source_channel" yaml:"source_channel"` // the channel by which the packet will be sent + Amount sdk.Coins `json:"amount" yaml:"amount"` // the tokens to be transferred + Sender sdk.AccAddress `json:"sender" yaml:"sender"` // the sender address + Receiver sdk.AccAddress `json:"receiver" yaml:"receiver"` // the recipient address on the destination chain + Source bool `json:"source" yaml:"source"` // indicates if the sending chain is the source chain of the tokens to be transferred } // NewMsgTransfer creates a new MsgTransfer instance @@ -75,13 +77,11 @@ func (msg MsgTransfer) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Sender} } -type MsgTransfer struct { - SourcePort string `json:"source_port" yaml:"source_port"` // the port on which the packet will be sent - SourceChannel string `json:"source_channel" yaml:"source_channel"` // the channel by which the packet will be sent - Amount sdk.Coins `json:"amount" yaml:"amount"` // the tokens to be transferred - Sender sdk.AccAddress `json:"sender" yaml:"sender"` // the sender address - Receiver sdk.AccAddress `json:"receiver" yaml:"receiver"` // the recipient address on the destination chain - Source bool `json:"source" yaml:"source"` // indicates if the sending chain is the source chain of the tokens to be transferred +type MsgRecvPacket struct { + Packet channelexported.PacketI `json:"packet" yaml:"packet"` + Proofs []commitment.Proof `json:"proofs" yaml:"proofs"` + Height uint64 `json:"height" yaml:"height"` + Signer sdk.AccAddress `json:"signer" yaml:"signer"` } // NewMsgRecvPacket creates a new MsgRecvPacket instance From 096f59a44d478f759749081ca55b28bb7467f5f7 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 14:27:36 +0100 Subject: [PATCH 07/11] Add invalid height error code, check non-nil proof --- x/ibc/20-transfer/types/errors.go | 1 + x/ibc/20-transfer/types/msgs.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/x/ibc/20-transfer/types/errors.go b/x/ibc/20-transfer/types/errors.go index 0f927acffd68..f2ffdf03ae8f 100644 --- a/x/ibc/20-transfer/types/errors.go +++ b/x/ibc/20-transfer/types/errors.go @@ -18,6 +18,7 @@ const ( CodeInvalidVersion sdk.CodeType = 106 CodeProofMissing sdk.CodeType = 107 CodeErrReceivePacket sdk.CodeType = 108 + CodeInvalidHeight sdk.CodeType = 109 ) // ErrInvalidAddress implements sdk.Error diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index aba0b5b60c96..9ba3df0c6d5a 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -106,10 +106,20 @@ func (MsgRecvPacket) Type() string { // ValidateBasic implements sdk.Msg func (msg MsgRecvPacket) ValidateBasic() sdk.Error { + if msg.Height < 0 { + return sdk.NewError(DefaultCodespace, CodeInvalidHeight, "invalid height") + } + if msg.Proofs == nil { return sdk.NewError(DefaultCodespace, CodeProofMissing, "proof missing") } + for _, proof := range msg.Proofs { + if proof.Proof == nil { + return sdk.NewError(DefaultCodespace, CodeProofMissing, "proof missing") + } + } + if msg.Signer.Empty() { return sdk.NewError(DefaultCodespace, CodeInvalidAddress, "invalid signer") } From e6c80d54fe8695288d7f5ae3c03669aba191bf6f Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 14:28:11 +0100 Subject: [PATCH 08/11] Fix linter error --- x/ibc/20-transfer/keeper/relay.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/ibc/20-transfer/keeper/relay.go b/x/ibc/20-transfer/keeper/relay.go index b0d60f1330b0..93d1de47f512 100644 --- a/x/ibc/20-transfer/keeper/relay.go +++ b/x/ibc/20-transfer/keeper/relay.go @@ -62,7 +62,7 @@ func (k Keeper) ReceivePacket(ctx sdk.Context, packet channelexported.PacketI, p var data types.PacketData err = data.UnmarshalJSON(packet.Data()) if err != nil { - return sdk.NewError(sdk.CodespaceType(types.DefaultCodespace), types.CodeInvalidPacketData, "invalid packet data") + return sdk.NewError(types.DefaultCodespace, types.CodeInvalidPacketData, "invalid packet data") } return k.ReceiveTransfer(ctx, packet.SourcePort(), packet.SourceChannel(), packet.DestPort(), packet.DestChannel(), data) From 2be5fd40ff69bdc01dcddb76e47b3915d82acee6 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 14:31:48 +0100 Subject: [PATCH 09/11] Return the underlying error --- x/ibc/20-transfer/keeper/relay.go | 2 +- x/ibc/20-transfer/types/errors.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/x/ibc/20-transfer/keeper/relay.go b/x/ibc/20-transfer/keeper/relay.go index 93d1de47f512..9dbe829b10f1 100644 --- a/x/ibc/20-transfer/keeper/relay.go +++ b/x/ibc/20-transfer/keeper/relay.go @@ -56,7 +56,7 @@ func (k Keeper) SendTransfer( func (k Keeper) ReceivePacket(ctx sdk.Context, packet channelexported.PacketI, proof commitment.ProofI, height uint64) error { _, err := k.channelKeeper.RecvPacket(ctx, packet, proof, height, nil, k.storeKey) if err != nil { - return sdk.NewError(types.DefaultCodespace, types.CodeErrReceivePacket, "failed to receive packet") + return err } var data types.PacketData diff --git a/x/ibc/20-transfer/types/errors.go b/x/ibc/20-transfer/types/errors.go index f2ffdf03ae8f..51f95d560a01 100644 --- a/x/ibc/20-transfer/types/errors.go +++ b/x/ibc/20-transfer/types/errors.go @@ -17,8 +17,7 @@ const ( CodeInvalidPort sdk.CodeType = 105 CodeInvalidVersion sdk.CodeType = 106 CodeProofMissing sdk.CodeType = 107 - CodeErrReceivePacket sdk.CodeType = 108 - CodeInvalidHeight sdk.CodeType = 109 + CodeInvalidHeight sdk.CodeType = 108 ) // ErrInvalidAddress implements sdk.Error From 6ffe5f174f54d399aa4445e126cf2a003b4bcfdf Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 30 Oct 2019 14:32:34 +0100 Subject: [PATCH 10/11] Tendermint starts at height 1 --- x/ibc/20-transfer/types/msgs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index 9ba3df0c6d5a..6c69a59739a2 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -106,7 +106,7 @@ func (MsgRecvPacket) Type() string { // ValidateBasic implements sdk.Msg func (msg MsgRecvPacket) ValidateBasic() sdk.Error { - if msg.Height < 0 { + if msg.Height < 1 { return sdk.NewError(DefaultCodespace, CodeInvalidHeight, "invalid height") } From b41901a2cd0762278db47c88693df85cae0fb28a Mon Sep 17 00:00:00 2001 From: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Date: Wed, 30 Oct 2019 14:40:46 +0100 Subject: [PATCH 11/11] Apply suggestions from code review --- x/ibc/20-transfer/types/msgs.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/x/ibc/20-transfer/types/msgs.go b/x/ibc/20-transfer/types/msgs.go index 6c69a59739a2..4df5cf270407 100644 --- a/x/ibc/20-transfer/types/msgs.go +++ b/x/ibc/20-transfer/types/msgs.go @@ -124,11 +124,7 @@ func (msg MsgRecvPacket) ValidateBasic() sdk.Error { return sdk.NewError(DefaultCodespace, CodeInvalidAddress, "invalid signer") } - if err := msg.Packet.ValidateBasic(); err != nil { - return err - } - - return nil + return msg.Packet.ValidateBasic() } // GetSignBytes implements sdk.Msg