diff --git a/modules/core/04-channel/types/errors.go b/modules/core/04-channel/types/errors.go index 629a074a24d..9e13edef03c 100644 --- a/modules/core/04-channel/types/errors.go +++ b/modules/core/04-channel/types/errors.go @@ -58,4 +58,5 @@ var ( ErrTimeoutElapsed = errorsmod.Register(SubModuleName, 40, "timeout elapsed") ErrPruningSequenceStartNotFound = errorsmod.Register(SubModuleName, 41, "pruning sequence start not found") ErrRecvStartSequenceNotFound = errorsmod.Register(SubModuleName, 42, "recv start sequence not found") + ErrInvalidCommitment = errorsmod.Register(SubModuleName, 43, "invalid commitment") ) diff --git a/modules/core/04-channel/types/genesis.go b/modules/core/04-channel/types/genesis.go index c038b0fefb5..16ca4c369a8 100644 --- a/modules/core/04-channel/types/genesis.go +++ b/modules/core/04-channel/types/genesis.go @@ -4,7 +4,10 @@ import ( "errors" "fmt" + errorsmod "cosmossdk.io/errors" + host "github.com/cosmos/ibc-go/v9/modules/core/24-host" + ibcerrors "github.com/cosmos/ibc-go/v9/modules/core/errors" ) // NewPacketState creates a new PacketState instance. @@ -98,36 +101,36 @@ func (gs GenesisState) Validate() error { } if maxSequence != 0 && maxSequence >= gs.NextChannelSequence { - return fmt.Errorf("next channel sequence %d must be greater than maximum sequence used in channel identifier %d", gs.NextChannelSequence, maxSequence) + return errorsmod.Wrapf(ibcerrors.ErrInvalidSequence, "next channel sequence %d must be greater than maximum sequence used in channel identifier %d", gs.NextChannelSequence, maxSequence) } for i, ack := range gs.Acknowledgements { if err := ack.Validate(); err != nil { - return fmt.Errorf("invalid acknowledgement %v ack index %d: %w", ack, i, err) + return errorsmod.Wrapf(ErrInvalidAcknowledgement, "%v ack index %d: %s", ack, i, err.Error()) } if len(ack.Data) == 0 { - return fmt.Errorf("invalid acknowledgement %v ack index %d: data bytes cannot be empty", ack, i) + return errorsmod.Wrapf(ErrInvalidAcknowledgement, "%v ack index %d: data bytes cannot be empty", ack, i) } } for i, receipt := range gs.Receipts { if err := receipt.Validate(); err != nil { - return fmt.Errorf("invalid acknowledgement %v ack index %d: %w", receipt, i, err) + return errorsmod.Wrapf(ErrInvalidAcknowledgement, "%v ack index %d: %s", receipt, i, err.Error()) } } for i, commitment := range gs.Commitments { if err := commitment.Validate(); err != nil { - return fmt.Errorf("invalid commitment %v index %d: %w", commitment, i, err) + return errorsmod.Wrapf(ErrInvalidCommitment, "%v index %d: %s", commitment, i, err.Error()) } if len(commitment.Data) == 0 { - return fmt.Errorf("invalid acknowledgement %v ack index %d: data bytes cannot be empty", commitment, i) + return errorsmod.Wrapf(ErrInvalidAcknowledgement, "%v ack index %d: data bytes cannot be empty", commitment, i) } } for i, ss := range gs.SendSequences { if err := ss.Validate(); err != nil { - return fmt.Errorf("invalid send sequence %v index %d: %w", ss, i, err) + return errorsmod.Wrapf(ibcerrors.ErrInvalidSequence, "invalid send sequence %v index %d: %s", ss, i, err.Error()) } } @@ -139,7 +142,7 @@ func (gs GenesisState) Validate() error { for i, as := range gs.AckSequences { if err := as.Validate(); err != nil { - return fmt.Errorf("invalid acknowledgement sequence %v index %d: %w", as, i, err) + return errorsmod.Wrapf(ErrInvalidAcknowledgement, "sequence %v index %d: %s", as, i, err.Error()) } } diff --git a/modules/core/04-channel/types/genesis_test.go b/modules/core/04-channel/types/genesis_test.go index e2a456ec55b..2da79970cab 100644 --- a/modules/core/04-channel/types/genesis_test.go +++ b/modules/core/04-channel/types/genesis_test.go @@ -6,6 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/cosmos/ibc-go/v9/modules/core/04-channel/types" + host "github.com/cosmos/ibc-go/v9/modules/core/24-host" + ibcerrors "github.com/cosmos/ibc-go/v9/modules/core/errors" ) const ( @@ -26,12 +28,12 @@ func TestValidateGenesis(t *testing.T) { testCases := []struct { name string genState types.GenesisState - expPass bool + expErr error }{ { name: "default", genState: types.DefaultGenesisState(), - expPass: true, + expErr: nil, }, { name: "valid genesis", @@ -69,7 +71,7 @@ func TestValidateGenesis(t *testing.T) { 2, types.Params{UpgradeTimeout: types.DefaultTimeout}, ), - expPass: true, + expErr: nil, }, { name: "invalid channel", @@ -82,7 +84,7 @@ func TestValidateGenesis(t *testing.T) { ), }, }, - expPass: false, + expErr: host.ErrInvalidID, }, { name: "invalid ack", @@ -91,7 +93,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketState(testPort2, testChannel2, 1, nil), }, }, - expPass: false, + expErr: types.ErrInvalidAcknowledgement, }, { name: "invalid commitment", @@ -100,7 +102,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketState(testPort1, testChannel1, 1, nil), }, }, - expPass: false, + expErr: types.ErrInvalidCommitment, }, { name: "invalid send seq", @@ -109,7 +111,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketSequence(testPort1, testChannel1, 0), }, }, - expPass: false, + expErr: ibcerrors.ErrInvalidSequence, }, { name: "invalid recv seq", @@ -118,7 +120,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketSequence(testPort1, "(testChannel1)", 1), }, }, - expPass: false, + expErr: host.ErrInvalidID, }, { name: "invalid recv seq 2", @@ -127,7 +129,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketSequence("(testPort1)", testChannel1, 1), }, }, - expPass: false, + expErr: host.ErrInvalidID, }, { name: "invalid ack seq", @@ -136,7 +138,7 @@ func TestValidateGenesis(t *testing.T) { types.NewPacketSequence(testPort1, "(testChannel1)", 1), }, }, - expPass: false, + expErr: types.ErrInvalidAcknowledgement, }, { name: "invalid channel identifier", @@ -174,7 +176,7 @@ func TestValidateGenesis(t *testing.T) { 0, types.Params{UpgradeTimeout: types.DefaultTimeout}, ), - expPass: false, + expErr: host.ErrInvalidID, }, { name: "next channel sequence is less than maximum channel identifier sequence used", @@ -212,17 +214,18 @@ func TestValidateGenesis(t *testing.T) { 0, types.Params{UpgradeTimeout: types.DefaultTimeout}, ), - expPass: false, + expErr: ibcerrors.ErrInvalidSequence, }, } for _, tc := range testCases { tc := tc err := tc.genState.Validate() - if tc.expPass { + if tc.expErr == nil { require.NoError(t, err, tc.name) } else { require.Error(t, err, tc.name) + require.ErrorIs(t, err, tc.expErr) } } }