From 32bfb4db19aca8c6989801729ffc966b95299a45 Mon Sep 17 00:00:00 2001 From: Yun Yeo Date: Tue, 17 Nov 2020 12:18:18 +0900 Subject: [PATCH] format recovered error depends on the error type --- x/wasm/internal/keeper/querier.go | 24 +++++++++++++++++++++++- x/wasm/internal/keeper/recursive_test.go | 2 +- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/x/wasm/internal/keeper/querier.go b/x/wasm/internal/keeper/querier.go index 09afa5885..410f16a96 100644 --- a/x/wasm/internal/keeper/querier.go +++ b/x/wasm/internal/keeper/querier.go @@ -1,6 +1,9 @@ package keeper import ( + "fmt" + "runtime/debug" + "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" @@ -116,7 +119,26 @@ func queryContractStore(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ( // recover from out-of-gas panic defer func() { if r := recover(); r != nil { - err = sdkerrors.ErrOutOfGas + switch rType := r.(type) { + // TODO: Use ErrOutOfGas instead of ErrorOutOfGas which would allow us + // to keep the stracktrace. + case sdk.ErrorOutOfGas: + err = sdkerrors.Wrap( + sdkerrors.ErrOutOfGas, fmt.Sprintf( + "out of gas in location: %v; gasWanted: %d, gasUsed: %d", + rType.Descriptor, ctx.GasMeter().Limit(), ctx.GasMeter().GasConsumed(), + ), + ) + + default: + err = sdkerrors.Wrap( + sdkerrors.ErrPanic, fmt.Sprintf( + "recovered: %v\nstack:\n%v", r, string(debug.Stack()), + ), + ) + } + + bz = nil } }() diff --git a/x/wasm/internal/keeper/recursive_test.go b/x/wasm/internal/keeper/recursive_test.go index f03dadd64..ddc7ab9d1 100644 --- a/x/wasm/internal/keeper/recursive_test.go +++ b/x/wasm/internal/keeper/recursive_test.go @@ -254,7 +254,7 @@ func TestGasOnExternalQuery(t *testing.T) { if tc.expectPanic { _, err = querier(ctx, []string{types.QueryContractStore}, abci.RequestQuery{Data: []byte(bz)}) require.Error(t, err) - require.Equal(t, err, sdkerror.ErrOutOfGas) + require.Contains(t, err.Error(), sdkerror.ErrOutOfGas.Error()) } else { // otherwise, make sure we get a good success _, err = querier(ctx, []string{types.QueryContractStore}, abci.RequestQuery{Data: []byte(bz)})