From 54cd4589f01297a92fd36e20791f58e40403ef1e Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Wed, 8 Oct 2025 12:30:22 +0800 Subject: [PATCH] core: check msg.value earlier in func TransitionDb (#1582) --- core/state_transition.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 183e8abed8..97488e6223 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -379,6 +379,15 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult, } st.gasRemaining -= gas + // Check clause 6 + value, overflow := uint256.FromBig(msg.Value) + if overflow { + return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex()) + } + if !value.IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From, value.ToBig()) { + return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex()) + } + // Check whether the init code size has been exceeded. if rules.IsEIP1559 && contractCreation && len(msg.Data) > params.MaxInitCodeSize { return nil, fmt.Errorf("%w: code size %v limit %v", ErrMaxInitCodeSizeExceeded, len(msg.Data), params.MaxInitCodeSize) @@ -389,15 +398,6 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult, // - reset transient storage(eip 1153) st.state.Prepare(rules, msg.From, st.evm.Context.Coinbase, msg.To, vm.ActivePrecompiles(rules), msg.AccessList) - // Check clause 6 - value, overflow := uint256.FromBig(msg.Value) - if overflow { - return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex()) - } - if !value.IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From, value.ToBig()) { - return nil, fmt.Errorf("%w: address %v", ErrInsufficientFundsForTransfer, msg.From.Hex()) - } - var ( ret []byte vmerr error // vm errors do not effect consensus and are therefore not assigned to err @@ -409,6 +409,7 @@ func (st *StateTransition) TransitionDb(owner common.Address) (*ExecutionResult, st.state.SetNonce(sender.Address(), st.state.GetNonce(sender.Address())+1) ret, st.gasRemaining, vmerr = st.evm.Call(sender, st.to(), msg.Data, st.gasRemaining, msg.Value) } + if !rules.IsEIP1559 { // Before EIP-3529: refunds were capped to gasUsed / 2 st.refundGas(params.RefundQuotient)