diff --git a/x/tunnel/keeper/helper.go b/x/tunnel/keeper/helper.go index 204e03f93..524d80601 100644 --- a/x/tunnel/keeper/helper.go +++ b/x/tunnel/keeper/helper.go @@ -4,6 +4,7 @@ import ( "math" sdkmath "cosmossdk.io/math" + storetypes "cosmossdk.io/store/types" feedstypes "github.com/bandprotocol/chain/v3/x/feeds/types" "github.com/bandprotocol/chain/v3/x/tunnel/types" @@ -72,3 +73,15 @@ func calculateDeviationBPS(oldPrice, newPrice sdkmath.Int) sdkmath.Int { return newPrice.Sub(oldPrice).Abs().MulRaw(10000).Quo(oldPrice) } + +// IsOutOfGasError checks if the error object is an out of gas or gas overflow error type +func IsOutOfGasError(err any) (bool, string) { + switch e := err.(type) { + case storetypes.ErrorOutOfGas: + return true, e.Descriptor + case storetypes.ErrorGasOverflow: + return true, e.Descriptor + default: + return false, "" + } +} diff --git a/x/tunnel/keeper/keeper_packet.go b/x/tunnel/keeper/keeper_packet.go index 24e7f812b..d515ad43f 100644 --- a/x/tunnel/keeper/keeper_packet.go +++ b/x/tunnel/keeper/keeper_packet.go @@ -175,9 +175,13 @@ func (k Keeper) CreatePacket( func (k Keeper) SendPacket(ctx sdk.Context, packet types.Packet) (err error) { defer func() { if r := recover(); r != nil { - ctx.Logger().Error(fmt.Sprintf("Panic recovered: %v", r)) - err = types.ErrSendPacketPanic - return + if isErr, _ := IsOutOfGasError(r); isErr { + // We panic with the same error, to replicate the normal tx execution flow. + panic(r) + } else { + ctx.Logger().Error(fmt.Sprintf("Panic recovered: %v", r)) + err = types.ErrSendPacketPanic + } } }()