From 915addff6de35be7f7157f4ea045c7ff8ccd28e5 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 28 Jul 2023 12:47:17 +0200 Subject: [PATCH 01/15] refactor(core/exported): moved packet interfaces to packet.go --- modules/core/exported/channel.go | 33 ------------------------------- modules/core/exported/packet.go | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 33 deletions(-) create mode 100644 modules/core/exported/packet.go diff --git a/modules/core/exported/channel.go b/modules/core/exported/channel.go index ac52a3f34ba..a6ec511880b 100644 --- a/modules/core/exported/channel.go +++ b/modules/core/exported/channel.go @@ -17,36 +17,3 @@ type CounterpartyChannelI interface { GetChannelID() string ValidateBasic() error } - -// PacketI defines the standard interface for IBC packets -type PacketI interface { - GetSequence() uint64 - GetTimeoutHeight() Height - GetTimeoutTimestamp() uint64 - GetSourcePort() string - GetSourceChannel() string - GetDestPort() string - GetDestChannel() string - GetData() []byte - ValidateBasic() error -} - -// Acknowledgement defines the interface used to return acknowledgements in the OnRecvPacket callback. -// The Acknowledgement interface is used by core IBC to ensure partial state changes are not committed -// when packet receives have not properly succeeded (typically resulting in an error acknowledgement being returned). -// The interface also allows core IBC to obtain the acknowledgement bytes whose encoding is determined by each IBC application or middleware. -// Each custom acknowledgement type must implement this interface. -type Acknowledgement interface { - // Success determines if the IBC application state should be persisted when handling `RecvPacket`. - // During `OnRecvPacket` IBC application callback execution, all state changes are held in a cache store and committed if: - // - the acknowledgement.Success() returns true - // - a nil acknowledgement is returned (asynchronous acknowledgements) - // - // Note 1: IBC application callback events are always persisted so long as `RecvPacket` succeeds without error. - // - // Note 2: The return value should account for the success of the underlying IBC application or middleware. Thus the `acknowledgement.Success` is representative of the entire IBC stack's success when receiving a packet. The individual success of each acknowledgement associated with an IBC application or middleware must be determined by obtaining the actual acknowledgement type after decoding the acknowledgement bytes. - // - // See https://github.com/cosmos/ibc-go/blob/v7.0.0/docs/ibc/apps.md for further explanations. - Success() bool - Acknowledgement() []byte -} diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go new file mode 100644 index 00000000000..5bac4e86b2b --- /dev/null +++ b/modules/core/exported/packet.go @@ -0,0 +1,34 @@ +package exported + +// PacketI defines the standard interface for IBC packets +type PacketI interface { + GetSequence() uint64 + GetTimeoutHeight() Height + GetTimeoutTimestamp() uint64 + GetSourcePort() string + GetSourceChannel() string + GetDestPort() string + GetDestChannel() string + GetData() []byte + ValidateBasic() error +} + +// Acknowledgement defines the interface used to return acknowledgements in the OnRecvPacket callback. +// The Acknowledgement interface is used by core IBC to ensure partial state changes are not committed +// when packet receives have not properly succeeded (typically resulting in an error acknowledgement being returned). +// The interface also allows core IBC to obtain the acknowledgement bytes whose encoding is determined by each IBC application or middleware. +// Each custom acknowledgement type must implement this interface. +type Acknowledgement interface { + // Success determines if the IBC application state should be persisted when handling `RecvPacket`. + // During `OnRecvPacket` IBC application callback execution, all state changes are held in a cache store and committed if: + // - the acknowledgement.Success() returns true + // - a nil acknowledgement is returned (asynchronous acknowledgements) + // + // Note 1: IBC application callback events are always persisted so long as `RecvPacket` succeeds without error. + // + // Note 2: The return value should account for the success of the underlying IBC application or middleware. Thus the `acknowledgement.Success` is representative of the entire IBC stack's success when receiving a packet. The individual success of each acknowledgement associated with an IBC application or middleware must be determined by obtaining the actual acknowledgement type after decoding the acknowledgement bytes. + // + // See https://github.com/cosmos/ibc-go/blob/v7.0.0/docs/ibc/apps.md for further explanations. + Success() bool + Acknowledgement() []byte +} From ebe9706d2642fa81ae162a39c0887df01b2913b3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 28 Jul 2023 17:10:54 +0200 Subject: [PATCH 02/15] feat(core/exported): created PacketData interface --- modules/core/exported/packet.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go index 5bac4e86b2b..ba0621bc8f6 100644 --- a/modules/core/exported/packet.go +++ b/modules/core/exported/packet.go @@ -32,3 +32,10 @@ type Acknowledgement interface { Success() bool Acknowledgement() []byte } + +// PacketData defines an optional interface which PacketData's may implement. +type PacketData interface { + // GetPacketSender returns the sender address of the packet. + // If the packet sender is unknown or undefined, an empty string should be returned. + GetPacketSender(srcPortID string) string +} From e7ecc6c5f8bc04537d6df4aa34addad501017491 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 28 Jul 2023 17:16:34 +0200 Subject: [PATCH 03/15] feat(transfer): implemented PacketData for transfer --- modules/apps/transfer/types/packet.go | 10 ++++++++++ modules/apps/transfer/types/packet_test.go | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/modules/apps/transfer/types/packet.go b/modules/apps/transfer/types/packet.go index 66f3e5730e1..b0493b99fad 100644 --- a/modules/apps/transfer/types/packet.go +++ b/modules/apps/transfer/types/packet.go @@ -10,8 +10,11 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ibcerrors "github.com/cosmos/ibc-go/v7/modules/core/errors" + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ) +var _ ibcexported.PacketData = (*FungibleTokenPacketData)(nil) + var ( // DefaultRelativePacketTimeoutHeight is the default packet timeout height (in blocks) relative // to the current block height of the counterparty chain provided by the client state. The @@ -64,3 +67,10 @@ func (ftpd FungibleTokenPacketData) ValidateBasic() error { func (ftpd FungibleTokenPacketData) GetBytes() []byte { return sdk.MustSortJSON(mustProtoMarshalJSON(&ftpd)) } + +// GetPacketSender returns the sender address of the packet data. +// NOTE: The sender address is set at the source chain and not validated by +// a signature check in IBC. +func (ftpd FungibleTokenPacketData) GetPacketSender(srcPortID string) string { + return ftpd.Sender +} diff --git a/modules/apps/transfer/types/packet_test.go b/modules/apps/transfer/types/packet_test.go index 6c877d4fcb0..d84a1cd06d3 100644 --- a/modules/apps/transfer/types/packet_test.go +++ b/modules/apps/transfer/types/packet_test.go @@ -43,3 +43,15 @@ func TestFungibleTokenPacketDataValidateBasic(t *testing.T) { } } } + +func (suite *TypesTestSuite) TestGetPacketSender() { + packetData := types.FungibleTokenPacketData{ + Denom: denom, + Amount: amount, + Sender: sender, + Receiver: receiver, + Memo: "", + } + + suite.Require().Equal(sender, packetData.GetPacketSender(types.PortID)) +} From 862e98f92aa918391e7ae7f557dfdf21ed6871f7 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 28 Jul 2023 17:21:07 +0200 Subject: [PATCH 04/15] feat(ica): implemented PacketData --- .../27-interchain-accounts/types/packet.go | 17 ++++++++++ .../types/packet_test.go | 31 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/modules/apps/27-interchain-accounts/types/packet.go b/modules/apps/27-interchain-accounts/types/packet.go index 213497f6ac6..003fdec1952 100644 --- a/modules/apps/27-interchain-accounts/types/packet.go +++ b/modules/apps/27-interchain-accounts/types/packet.go @@ -1,14 +1,19 @@ package types import ( + "strings" "time" errorsmod "cosmossdk.io/errors" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdk "github.com/cosmos/cosmos-sdk/types" + + ibcexported "github.com/cosmos/ibc-go/v7/modules/core/exported" ) +var _ ibcexported.PacketData = (*InterchainAccountPacketData)(nil) + // MaxMemoCharLength defines the maximum length for the InterchainAccountPacketData memo field const MaxMemoCharLength = 256 @@ -64,3 +69,15 @@ func (ct CosmosTx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return nil } + +// GetPacketSender returns the sender address of the packet from the source port ID by cutting off +// the ControllerPortPrefix. +// If the source port ID does not have the ControllerPortPrefix, then an empty string is returned. +// NOTE: The sender address is set at the source chain and not validated by a signature check in IBC. +func (iapd InterchainAccountPacketData) GetPacketSender(srcPortID string) string { + icaOwner, found := strings.CutPrefix(srcPortID, ControllerPortPrefix) + if !found { + return "" + } + return icaOwner +} diff --git a/modules/apps/27-interchain-accounts/types/packet_test.go b/modules/apps/27-interchain-accounts/types/packet_test.go index 329e5a837f4..d7b75f87df0 100644 --- a/modules/apps/27-interchain-accounts/types/packet_test.go +++ b/modules/apps/27-interchain-accounts/types/packet_test.go @@ -2,6 +2,7 @@ package types_test import ( "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/types" + ibctesting "github.com/cosmos/ibc-go/v7/testing" ) var largeMemo = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum" @@ -82,3 +83,33 @@ func (suite *TypesTestSuite) TestValidateBasic() { }) } } + +func (suite *TypesTestSuite) TestGetPacketSender() { + // dest user defined gas limits are not supported for ICS 27 + testCases := []struct { + name string + srcPortID string + expSender string + }{ + { + "success: port id has prefix", + types.ControllerPortPrefix + ibctesting.TestAccAddress, + ibctesting.TestAccAddress, + }, + { + "failure: missing prefix", + ibctesting.TestAccAddress, + "", + }, + { + "failure: empty port id", + "", + "", + }, + } + + for _, tc := range testCases { + packetData := types.InterchainAccountPacketData{} + suite.Require().Equal(tc.expSender, packetData.GetPacketSender(tc.srcPortID)) + } +} From 08a37d2a9eac9d36bd4e37ed7bc9f865f6176b96 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 31 Jul 2023 12:25:37 +0200 Subject: [PATCH 05/15] docs(transfer.adr8): updated godocs of GetPacketSender --- modules/apps/transfer/types/packet.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/apps/transfer/types/packet.go b/modules/apps/transfer/types/packet.go index b0493b99fad..f5bba6d0808 100644 --- a/modules/apps/transfer/types/packet.go +++ b/modules/apps/transfer/types/packet.go @@ -69,8 +69,11 @@ func (ftpd FungibleTokenPacketData) GetBytes() []byte { } // GetPacketSender returns the sender address of the packet data. -// NOTE: The sender address is set at the source chain and not validated by -// a signature check in IBC. -func (ftpd FungibleTokenPacketData) GetPacketSender(srcPortID string) string { +// +// NOTES: +// - The sender address is set at the source chain and not validated by +// a signature check in IBC. +// - sourcePortID is not used in this implementation. +func (ftpd FungibleTokenPacketData) GetPacketSender(sourcePortID string) string { return ftpd.Sender } From de498629f0c60d73f7086ec5f431a252e87cf01f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 31 Jul 2023 12:26:27 +0200 Subject: [PATCH 06/15] style(adr8): renamed parameter srcPortID -> sourcePortID --- modules/apps/27-interchain-accounts/types/packet.go | 4 ++-- modules/core/exported/packet.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/apps/27-interchain-accounts/types/packet.go b/modules/apps/27-interchain-accounts/types/packet.go index 003fdec1952..ba610e1313e 100644 --- a/modules/apps/27-interchain-accounts/types/packet.go +++ b/modules/apps/27-interchain-accounts/types/packet.go @@ -74,8 +74,8 @@ func (ct CosmosTx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // the ControllerPortPrefix. // If the source port ID does not have the ControllerPortPrefix, then an empty string is returned. // NOTE: The sender address is set at the source chain and not validated by a signature check in IBC. -func (iapd InterchainAccountPacketData) GetPacketSender(srcPortID string) string { - icaOwner, found := strings.CutPrefix(srcPortID, ControllerPortPrefix) +func (iapd InterchainAccountPacketData) GetPacketSender(sourcePortID string) string { + icaOwner, found := strings.CutPrefix(sourcePortID, ControllerPortPrefix) if !found { return "" } diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go index ba0621bc8f6..d3a80a864ca 100644 --- a/modules/core/exported/packet.go +++ b/modules/core/exported/packet.go @@ -37,5 +37,5 @@ type Acknowledgement interface { type PacketData interface { // GetPacketSender returns the sender address of the packet. // If the packet sender is unknown or undefined, an empty string should be returned. - GetPacketSender(srcPortID string) string + GetPacketSender(sourcePortID string) string } From aecbacb8369285180178aa9c2cd65129f7d7cdbe Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 31 Jul 2023 12:28:37 +0200 Subject: [PATCH 07/15] docs(core.adr8): updated godocs for PacketData interface --- modules/core/exported/packet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go index d3a80a864ca..b8919855818 100644 --- a/modules/core/exported/packet.go +++ b/modules/core/exported/packet.go @@ -33,7 +33,7 @@ type Acknowledgement interface { Acknowledgement() []byte } -// PacketData defines an optional interface which PacketData's may implement. +// PacketData defines an optional interface which application's packet data may implement. type PacketData interface { // GetPacketSender returns the sender address of the packet. // If the packet sender is unknown or undefined, an empty string should be returned. From 546db8226558dc290073fee17f41b4383f0865ad Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 31 Jul 2023 12:32:30 +0200 Subject: [PATCH 08/15] docs(core.adr8): improved godocs for PacketData interface --- modules/core/exported/packet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go index b8919855818..6c4fa9f2e0c 100644 --- a/modules/core/exported/packet.go +++ b/modules/core/exported/packet.go @@ -33,7 +33,7 @@ type Acknowledgement interface { Acknowledgement() []byte } -// PacketData defines an optional interface which application's packet data may implement. +// PacketData defines an optional interface which application's packet data structure may implement. type PacketData interface { // GetPacketSender returns the sender address of the packet. // If the packet sender is unknown or undefined, an empty string should be returned. From d65988266dd79ab216943eb369ca8700878c3534 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 16:42:36 +0200 Subject: [PATCH 09/15] docs(core.adr8): updated godocs --- modules/core/exported/packet.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/exported/packet.go b/modules/core/exported/packet.go index 6c4fa9f2e0c..554c172cafa 100644 --- a/modules/core/exported/packet.go +++ b/modules/core/exported/packet.go @@ -33,9 +33,9 @@ type Acknowledgement interface { Acknowledgement() []byte } -// PacketData defines an optional interface which application's packet data structure may implement. +// PacketData defines an optional interface which an application's packet data structure may implement. type PacketData interface { - // GetPacketSender returns the sender address of the packet. + // GetPacketSender returns the sender address of the packet data. // If the packet sender is unknown or undefined, an empty string should be returned. GetPacketSender(sourcePortID string) string } From 9bf96afde0c1adc2d07fe27f35b69186e7638a79 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 16:44:26 +0200 Subject: [PATCH 10/15] docs(transfer.adr8): updated godocs --- modules/apps/transfer/types/packet.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/apps/transfer/types/packet.go b/modules/apps/transfer/types/packet.go index f5bba6d0808..7faffd1c788 100644 --- a/modules/apps/transfer/types/packet.go +++ b/modules/apps/transfer/types/packet.go @@ -70,9 +70,10 @@ func (ftpd FungibleTokenPacketData) GetBytes() []byte { // GetPacketSender returns the sender address of the packet data. // -// NOTES: -// - The sender address is set at the source chain and not validated by -// a signature check in IBC. +// NOTE: +// - The sender address is set by the packet sender and may not have been +// validated a signature check if the packet sender isn't the transfer module. +// - The sender address must only be used by modules on the sending chain. // - sourcePortID is not used in this implementation. func (ftpd FungibleTokenPacketData) GetPacketSender(sourcePortID string) string { return ftpd.Sender From 590c0b9713aee8f7eb89bcb6e78946f651796dfd Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 16:45:37 +0200 Subject: [PATCH 11/15] style(ica_test): removed unneeded comment --- modules/apps/27-interchain-accounts/types/packet_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/apps/27-interchain-accounts/types/packet_test.go b/modules/apps/27-interchain-accounts/types/packet_test.go index d7b75f87df0..5508d7b6c9f 100644 --- a/modules/apps/27-interchain-accounts/types/packet_test.go +++ b/modules/apps/27-interchain-accounts/types/packet_test.go @@ -85,7 +85,6 @@ func (suite *TypesTestSuite) TestValidateBasic() { } func (suite *TypesTestSuite) TestGetPacketSender() { - // dest user defined gas limits are not supported for ICS 27 testCases := []struct { name string srcPortID string From 9ca5120142cfe71e1ebe11a4b2f9a22b7f91a76f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 16:48:22 +0200 Subject: [PATCH 12/15] docs(ica.adr8): updated godocs --- modules/apps/27-interchain-accounts/types/packet.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/apps/27-interchain-accounts/types/packet.go b/modules/apps/27-interchain-accounts/types/packet.go index ba610e1313e..e03bf5165e4 100644 --- a/modules/apps/27-interchain-accounts/types/packet.go +++ b/modules/apps/27-interchain-accounts/types/packet.go @@ -70,10 +70,14 @@ func (ct CosmosTx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { return nil } -// GetPacketSender returns the sender address of the packet from the source port ID by cutting off -// the ControllerPortPrefix. +// GetPacketSender returns the sender address of the interchain accounts packet data. +// It is obtained from the source port ID by cutting off the ControllerPortPrefix. // If the source port ID does not have the ControllerPortPrefix, then an empty string is returned. -// NOTE: The sender address is set at the source chain and not validated by a signature check in IBC. +// +// NOTE: +// - The sender address is set by the packet sender and may not have been validated a signature +// check if the packet sender isn't the interchain accounts module. +// - The sender address must only be used by modules on the sending chain. func (iapd InterchainAccountPacketData) GetPacketSender(sourcePortID string) string { icaOwner, found := strings.CutPrefix(sourcePortID, ControllerPortPrefix) if !found { From fec5619478bc2b12308a52c2dac5d99ce3636f02 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 18:08:16 +0200 Subject: [PATCH 13/15] style(ica): fixed revive linter complaint --- modules/apps/27-interchain-accounts/types/packet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apps/27-interchain-accounts/types/packet.go b/modules/apps/27-interchain-accounts/types/packet.go index e03bf5165e4..a162b7d61ed 100644 --- a/modules/apps/27-interchain-accounts/types/packet.go +++ b/modules/apps/27-interchain-accounts/types/packet.go @@ -78,7 +78,7 @@ func (ct CosmosTx) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error { // - The sender address is set by the packet sender and may not have been validated a signature // check if the packet sender isn't the interchain accounts module. // - The sender address must only be used by modules on the sending chain. -func (iapd InterchainAccountPacketData) GetPacketSender(sourcePortID string) string { +func (InterchainAccountPacketData) GetPacketSender(sourcePortID string) string { icaOwner, found := strings.CutPrefix(sourcePortID, ControllerPortPrefix) if !found { return "" From 036b66f8b602d7414a5b72f89019a8f6ad59e830 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 18:17:54 +0200 Subject: [PATCH 14/15] docs(transfer.adr8): updated GetPacketSender's godocs --- modules/apps/transfer/types/packet.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/apps/transfer/types/packet.go b/modules/apps/transfer/types/packet.go index 7faffd1c788..f64d600229e 100644 --- a/modules/apps/transfer/types/packet.go +++ b/modules/apps/transfer/types/packet.go @@ -68,11 +68,11 @@ func (ftpd FungibleTokenPacketData) GetBytes() []byte { return sdk.MustSortJSON(mustProtoMarshalJSON(&ftpd)) } -// GetPacketSender returns the sender address of the packet data. +// GetPacketSender returns the sender address embedded in the packet data. // // NOTE: -// - The sender address is set by the packet sender and may not have been -// validated a signature check if the packet sender isn't the transfer module. +// - The sender address is set by the module which requested the packet to be sent, +// and this module may not have validated the sender address by a signature check. // - The sender address must only be used by modules on the sending chain. // - sourcePortID is not used in this implementation. func (ftpd FungibleTokenPacketData) GetPacketSender(sourcePortID string) string { From 1e70f89396d418c4d8d8b022c1e2313637a19724 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 1 Aug 2023 18:34:49 +0200 Subject: [PATCH 15/15] style(transfer, ica): ran golangci-lin --- modules/apps/27-interchain-accounts/types/packet.go | 2 +- modules/apps/transfer/types/packet.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/apps/27-interchain-accounts/types/packet.go b/modules/apps/27-interchain-accounts/types/packet.go index 4f8ec9acc39..3091e6ba33c 100644 --- a/modules/apps/27-interchain-accounts/types/packet.go +++ b/modules/apps/27-interchain-accounts/types/packet.go @@ -14,7 +14,7 @@ import ( ) var ( - _ ibcexported.PacketData = (*InterchainAccountPacketData)(nil) + _ ibcexported.PacketData = (*InterchainAccountPacketData)(nil) _ ibcexported.PacketDataProvider = (*InterchainAccountPacketData)(nil) ) diff --git a/modules/apps/transfer/types/packet.go b/modules/apps/transfer/types/packet.go index 7f7a843e3b2..ec543dd75f9 100644 --- a/modules/apps/transfer/types/packet.go +++ b/modules/apps/transfer/types/packet.go @@ -15,7 +15,7 @@ import ( ) var ( - _ ibcexported.PacketData = (*FungibleTokenPacketData)(nil) + _ ibcexported.PacketData = (*FungibleTokenPacketData)(nil) _ ibcexported.PacketDataProvider = (*FungibleTokenPacketData)(nil) )