From f6d5c850498c0d6b0c65c20d2176304fbeca68b8 Mon Sep 17 00:00:00 2001 From: Aditya Sripal Date: Thu, 12 Jul 2018 19:38:22 -0700 Subject: [PATCH] Added recover to standard antehandler --- x/auth/ante.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/x/auth/ante.go b/x/auth/ante.go index 9652b37de2..73c3df6628 100644 --- a/x/auth/ante.go +++ b/x/auth/ante.go @@ -21,7 +21,7 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { return func( ctx sdk.Context, tx sdk.Tx, - ) (_ sdk.Context, _ sdk.Result, abort bool) { + ) (_ sdk.Context, res sdk.Result, abort bool) { // This AnteHandler requires Txs to be StdTxs stdTx, ok := tx.(StdTx) @@ -29,6 +29,24 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { return ctx, sdk.ErrInternal("tx must be StdTx").Result(), true } + // AnteHandlers must have their own defer/recover in order + // for the BaseApp to know how much gas was used! + // This is because the GasMeter is created in the AnteHandler, + // but if it panics the context won't be set properly in runTx's recover ... + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + log := fmt.Sprintf("out of gas in location: %v", rType.Descriptor) + res = sdk.ErrOutOfGas(log).Result() + res.GasWanted = stdTx.Fee.Gas + res.GasUsed = ctx.GasMeter().GasConsumed() + default: + panic(r) + } + } + }() + err := validateBasic(stdTx) if err != nil { return ctx, err.Result(), true @@ -90,7 +108,7 @@ func NewAnteHandler(am AccountMapper, fck FeeCollectionKeeper) sdk.AnteHandler { // TODO: tx tags (?) - return ctx, sdk.Result{}, false // continue... + return ctx, sdk.Result{GasWanted: stdTx.Fee.Gas}, false // continue... } }