From c2faa1b8d8b71d750b5565c43f9202903efb3b70 Mon Sep 17 00:00:00 2001 From: kakysha Date: Wed, 29 Jan 2025 16:32:20 +0200 Subject: [PATCH] feat(types/errors): add GRPCWrap to add ABCICode, Codespace and eventual stack trace on gRPC requests backport of https://github.com/InjectiveLabs/cosmos-sdk/commit/07401705e3fbc3ba361129e0839b566f7489aa9b --- baseapp/abci.go | 4 ++++ types/errors/errors.go | 26 ++++++++++++++++++++++++++ x/auth/tx/service.go | 3 ++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/baseapp/abci.go b/baseapp/abci.go index 252e018ca78a..20105dcc9b51 100644 --- a/baseapp/abci.go +++ b/baseapp/abci.go @@ -1238,6 +1238,10 @@ func gRPCErrorToSDKError(err error) error { return errorsmod.Wrap(sdkerrors.ErrInvalidRequest, err.Error()) } + if len(status.Details()) > 0 { + err = errorsmod.Wrapf(err, "%v", status.Details()) + } + switch status.Code() { case codes.NotFound: return errorsmod.Wrap(sdkerrors.ErrKeyNotFound, err.Error()) diff --git a/types/errors/errors.go b/types/errors/errors.go index 36bb82ffd957..72a165de2e8e 100644 --- a/types/errors/errors.go +++ b/types/errors/errors.go @@ -1,7 +1,13 @@ package errors import ( + "fmt" + errorsmod "cosmossdk.io/errors" + "github.com/pkg/errors" + "google.golang.org/genproto/googleapis/rpc/errdetails" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) // RootCodespace is the codespace for all errors defined in this package @@ -147,3 +153,23 @@ var ( // explicitly set timeout timestamp. ErrTxTimeout = errorsmod.Register(RootCodespace, 42, "tx timeout") ) + +func GRPCWrap(err error, c codes.Code, msg string) error { + if err == nil { + return nil + } + st := status.New(c, msg) + var sdkErr *errorsmod.Error + if errors.As(err, &sdkErr) { + errorInfo := &errdetails.ErrorInfo{ + Reason: sdkErr.Error(), + Metadata: map[string]string{"Codespace": sdkErr.Codespace(), "ABCICode": fmt.Sprintf("%d", sdkErr.ABCICode())}, + } + var withDetailsErr error + st, withDetailsErr = st.WithDetails(errorInfo) + if withDetailsErr != nil { + return status.Errorf(c, "%v (failed to add error details: %v)", msg, withDetailsErr) + } + } + return st.Err() +} diff --git a/x/auth/tx/service.go b/x/auth/tx/service.go index 894082326398..e483dbd9c02a 100644 --- a/x/auth/tx/service.go +++ b/x/auth/tx/service.go @@ -2,6 +2,7 @@ package tx import ( "context" + "fmt" "strings" gogogrpc "github.com/cosmos/gogoproto/grpc" @@ -96,7 +97,7 @@ func (s txServer) Simulate(ctx context.Context, req *txtypes.SimulateRequest) (* gasInfo, result, err := s.simulate(txBytes) if err != nil { - return nil, status.Errorf(codes.Unknown, "%v with gas used: '%d'", err, gasInfo.GasUsed) + return nil, sdkerrors.GRPCWrap(err, codes.Unknown, fmt.Sprintf("%v With gas wanted: '%d' and gas used: '%d' ", err, gasInfo.GasWanted, gasInfo.GasUsed)) } return &txtypes.SimulateResponse{