From bf5d78e9bc203565982897495ea1a293bded3b2d Mon Sep 17 00:00:00 2001 From: Somnath Banerjee Date: Fri, 30 Aug 2024 23:05:55 +0400 Subject: [PATCH 1/2] Check gasbailout before deducting balance in trace --- core/state_transition.go | 51 +++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index bd4d9af1160..1e25aec385c 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -219,49 +219,42 @@ func (st *StateTransition) buyGas(gasBailout bool) error { } } - balanceCheck := gasVal - if st.gasFeeCap != nil { - balanceCheck = st.sharedBuyGasBalance.SetUint64(st.msg.Gas()) - balanceCheck, overflow = balanceCheck.MulOverflow(balanceCheck, st.gasFeeCap) - if overflow { - return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) - } - balanceCheck, overflow = balanceCheck.AddOverflow(balanceCheck, st.value) - if overflow { - return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) - } - if st.evm.ChainRules().IsCancun { - maxBlobFee, overflow := new(uint256.Int).MulOverflow(st.msg.MaxFeePerBlobGas(), new(uint256.Int).SetUint64(st.msg.BlobGas())) + if !gasBailout { + balanceCheck := gasVal + if st.gasFeeCap != nil { + balanceCheck = st.sharedBuyGasBalance.SetUint64(st.msg.Gas()) + balanceCheck, overflow = balanceCheck.MulOverflow(balanceCheck, st.gasFeeCap) if overflow { return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) } - balanceCheck, overflow = balanceCheck.AddOverflow(balanceCheck, maxBlobFee) + balanceCheck, overflow = balanceCheck.AddOverflow(balanceCheck, st.value) if overflow { return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) } + if st.evm.ChainRules().IsCancun { + maxBlobFee, overflow := new(uint256.Int).MulOverflow(st.msg.MaxFeePerBlobGas(), new(uint256.Int).SetUint64(st.msg.BlobGas())) + if overflow { + return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) + } + balanceCheck, overflow = balanceCheck.AddOverflow(balanceCheck, maxBlobFee) + if overflow { + return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) + } + } } - } - var subBalance = false - if have, want := st.state.GetBalance(st.msg.From()), balanceCheck; have.Cmp(want) < 0 { - if !gasBailout { + if have, want := st.state.GetBalance(st.msg.From()), balanceCheck; have.Cmp(want) < 0 { return fmt.Errorf("%w: address %v have %v want %v", ErrInsufficientFunds, st.msg.From().Hex(), have, want) } - } else { - subBalance = true - } - if err := st.gp.SubGas(st.msg.Gas()); err != nil { - if !gasBailout { + if err := st.gp.SubGas(st.msg.Gas()); err != nil { return err } + st.state.SubBalance(st.msg.From(), gasVal) + st.state.SubBalance(st.msg.From(), blobGasVal) } + st.gasRemaining += st.msg.Gas() st.initialGas = st.msg.Gas() st.evm.BlobFee = blobGasVal - - if subBalance { - st.state.SubBalance(st.msg.From(), gasVal) - st.state.SubBalance(st.msg.From(), blobGasVal) - } return nil } @@ -426,7 +419,7 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*Executi st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1) ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), st.data, st.gasRemaining, st.value, bailout) } - if refunds { + if refunds && !gasBailout { if rules.IsLondon { // After EIP-3529: refunds are capped to gasUsed / 5 st.refundGas(params.RefundQuotientEIP3529) From 45325a7737fa89c33eb944e0248965cd51e1adb9 Mon Sep 17 00:00:00 2001 From: Somnath Banerjee Date: Sat, 31 Aug 2024 21:19:34 +0400 Subject: [PATCH 2/2] Subtract gas from pool, still --- core/state_transition.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 1e25aec385c..3f0649e9a44 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -245,13 +245,13 @@ func (st *StateTransition) buyGas(gasBailout bool) error { if have, want := st.state.GetBalance(st.msg.From()), balanceCheck; have.Cmp(want) < 0 { return fmt.Errorf("%w: address %v have %v want %v", ErrInsufficientFunds, st.msg.From().Hex(), have, want) } - if err := st.gp.SubGas(st.msg.Gas()); err != nil { - return err - } st.state.SubBalance(st.msg.From(), gasVal) st.state.SubBalance(st.msg.From(), blobGasVal) } + if err := st.gp.SubGas(st.msg.Gas()); err != nil { + return err + } st.gasRemaining += st.msg.Gas() st.initialGas = st.msg.Gas() st.evm.BlobFee = blobGasVal