Add 20% pad to estimated gas to eth_call

This commit is contained in:
bretep 2023-04-24 16:24:26 -07:00 committed by Shane Bammel
parent 43ef4304ee
commit be7aea17ed

View File

@ -180,6 +180,8 @@ func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi2.CallArgs
} else { } else {
feeCap = libcommon.Big0 feeCap = libcommon.Big0
} }
// Track the maximum gas based on the account's available funds and the txn feeCap.
var accountGasLimit uint64
// Recap the highest gas limit with account's available balance. // Recap the highest gas limit with account's available balance.
if feeCap.Sign() != 0 { if feeCap.Sign() != 0 {
cacheView, err := api.stateCache.View(ctx, dbtx) cacheView, err := api.stateCache.View(ctx, dbtx)
@ -203,15 +205,19 @@ func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi2.CallArgs
allowance := new(big.Int).Div(available, feeCap) allowance := new(big.Int).Div(available, feeCap)
// If the allowance is larger than maximum uint64, skip checking // If the allowance is larger than maximum uint64, skip checking
if allowance.IsUint64() && hi > allowance.Uint64() { if allowance.IsUint64() {
transfer := args.Value accountGasLimit = allowance.Uint64()
if transfer == nil { if hi > allowance.Uint64() {
transfer = new(hexutil.Big) transfer := args.Value
if transfer == nil {
transfer = new(hexutil.Big)
}
log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance,
"sent", transfer.ToInt(), "maxFeePerGas", feeCap, "fundable", allowance)
hi = allowance.Uint64()
} }
log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance,
"sent", transfer.ToInt(), "maxFeePerGas", feeCap, "fundable", allowance)
hi = allowance.Uint64()
} }
} }
// Recap the highest gas allowance with specified gascap. // Recap the highest gas allowance with specified gascap.
@ -304,6 +310,12 @@ func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi2.CallArgs
return 0, fmt.Errorf("gas required exceeds allowance (%d)", gasCap) return 0, fmt.Errorf("gas required exceeds allowance (%d)", gasCap)
} }
} }
// Adds a 20% pad to the estimated gas usage, not exceeding account gas limit
// to help mitigate gas underestimations
hi = hi + hi/5
if accountGasLimit != 0 && hi > accountGasLimit {
hi = accountGasLimit
}
return hexutil.Uint64(hi), nil return hexutil.Uint64(hi), nil
} }