From 96aac2769d372ae4a49df5581330ed1326411a52 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Sat, 15 Feb 2025 08:50:11 +0800 Subject: [PATCH 1/3] fix(abci): add unwrapper to handle join error --- baseapp/baseapp_test.go | 25 +++++++++++++++++++++++++ errors/abci.go | 10 ++++++++++ go.mod | 2 ++ go.sum | 2 -- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index f847009e8e49..fc64329b423c 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "crypto/sha256" + "errors" "fmt" "math/rand" "testing" @@ -32,6 +33,7 @@ import ( "github.com/cosmos/cosmos-sdk/testutil" "github.com/cosmos/cosmos-sdk/testutil/testdata" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" authtx "github.com/cosmos/cosmos-sdk/x/auth/tx" ) @@ -883,3 +885,26 @@ func TestLoadVersionPruning(t *testing.T) { require.Nil(t, err) testLoadVersionHelper(t, app, int64(7), lastCommitID) } + +func TestErrorsJoinAndABCIInfo(t *testing.T) { + tErr := sdkerrors.ErrInsufficientFunds + tErrCode := tErr.ABCICode() + tests := []struct { + name string + err error + exp uint32 + }{ + {name: "nil", err: nil, exp: 0}, + {name: "ErrInsufficientFunds", err: tErr, exp: tErrCode}, + {name: "joined ErrInsufficientFunds", err: errors.Join(tErr), exp: tErrCode}, + {name: "joined nil ErrInsufficientFunds", err: errors.Join(nil, tErr), exp: tErrCode}, + {name: "joined ErrInsufficientFunds nil", err: errors.Join(tErr, nil), exp: tErrCode}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + _, act, _ := errorsmod.ABCIInfo(tc.err, false) + require.Equal(t, int(tc.exp), int(act)) + }) + } +} diff --git a/errors/abci.go b/errors/abci.go index 603f3b36ff1c..c1b651210161 100644 --- a/errors/abci.go +++ b/errors/abci.go @@ -59,6 +59,16 @@ func abciCode(err error) uint32 { } for { + if c, ok := err.(interface{ Unwrap() []error }); ok { + errs := c.Unwrap() + for _, e := range errs { + if e != nil { + err = e + break + } + } + } + if c, ok := err.(coder); ok { return c.ABCICode() } diff --git a/go.mod b/go.mod index 5f8e9322555a..b4ede2d78abc 100644 --- a/go.mod +++ b/go.mod @@ -183,6 +183,8 @@ replace ( github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 ) +replace cosmossdk.io/errors => ./errors + retract ( // false start by tagging the wrong branch v0.50.0 diff --git a/go.sum b/go.sum index d305dc01a4c0..286412a52a12 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,6 @@ cosmossdk.io/core v0.11.0 h1:vtIafqUi+1ZNAE/oxLOQQ7Oek2n4S48SWLG8h/+wdbo= cosmossdk.io/core v0.11.0/go.mod h1:LaTtayWBSoacF5xNzoF8tmLhehqlA9z1SWiPuNC6X1w= cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= -cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= -cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= From b091ac7b690242620553fb89cef0f9d0843982a8 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Sat, 15 Feb 2025 12:30:36 +0800 Subject: [PATCH 2/3] Update baseapp/baseapp_test.go --- baseapp/baseapp_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index fc64329b423c..5a4d05119bee 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -904,7 +904,7 @@ func TestErrorsJoinAndABCIInfo(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { _, act, _ := errorsmod.ABCIInfo(tc.err, false) - require.Equal(t, int(tc.exp), int(act)) + require.Equal(t, tc.exp, act) }) } } From 68c09882c700c7f412cda43d6db4d60ccd3e83e6 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Thu, 27 Feb 2025 09:08:44 +0800 Subject: [PATCH 3/3] cleanup --- errors/CHANGELOG.md | 4 ++++ x/group/keeper/msg_server_test.go | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/errors/CHANGELOG.md b/errors/CHANGELOG.md index 74f343055879..f52e41f7739a 100644 --- a/errors/CHANGELOG.md +++ b/errors/CHANGELOG.md @@ -31,6 +31,10 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +### Bug Fixes + +* (abci) [#23709](https://github.com/cosmos/cosmos-sdk/pull/23709) Add unwrapper to handle join error. + ### Features * [#15989](https://github.com/cosmos/cosmos-sdk/pull/15989) Add `ErrStopIterating` for modules to use for breaking out of iteration. diff --git a/x/group/keeper/msg_server_test.go b/x/group/keeper/msg_server_test.go index 7ca05a766a75..4533202145bc 100644 --- a/x/group/keeper/msg_server_test.go +++ b/x/group/keeper/msg_server_test.go @@ -405,7 +405,8 @@ func (s *TestSuite) TestUpdateGroupMembers() { { Member: &group.Member{Address: member2, Weight: "2", AddedAt: s.blockTime}, GroupId: groupID, - }}, + }, + }, }, "remove existing member": { req: &group.MsgUpdateGroupMembers{ @@ -424,7 +425,8 @@ func (s *TestSuite) TestUpdateGroupMembers() { { Member: &group.Member{Address: member2, Weight: "2", AddedAt: s.blockTime}, GroupId: groupID, - }}, + }, + }, }, "remove unknown member": { req: &group.MsgUpdateGroupMembers{ @@ -447,7 +449,8 @@ func (s *TestSuite) TestUpdateGroupMembers() { }, { Member: &group.Member{Address: member2, Weight: "2", AddedAt: s.blockTime}, GroupId: groupID, - }}, + }, + }, }, "with wrong admin": { req: &group.MsgUpdateGroupMembers{