Skip to content

Commit

Permalink
fix gas charge
Browse files Browse the repository at this point in the history
Signed-off-by: Ignacio Hagopian <[email protected]>
  • Loading branch information
jsign committed Oct 15, 2024
1 parent 4b91d84 commit 514b4d5
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 69 deletions.
144 changes: 76 additions & 68 deletions core/vm/instructions.go
Original file line number Diff line number Diff line change
Expand Up @@ -817,24 +817,26 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byt
if interpreter.evm.chainRules.IsEIP4762 && !transfersValue && !chargeCallVariantEIP4762(interpreter.evm, scope) {
return nil, ErrOutOfGas
}
memSize, err := getMemSize(interpreter.table[CALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
if interpreter.evm.chainRules.IsEIP4762 {
memSize, err := getMemSize(interpreter.table[CALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}

interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
}
}

stack := scope.Stack
Expand Down Expand Up @@ -881,23 +883,25 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([
if interpreter.evm.chainRules.IsEIP4762 && !chargeCallVariantEIP4762(interpreter.evm, scope) {
return nil, ErrOutOfGas
}
memSize, err := getMemSize(interpreter.table[CALLCODE], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasCallCode(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
if interpreter.evm.chainRules.IsEIP4762 {
memSize, err := getMemSize(interpreter.table[CALLCODE], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasCallCode(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
}
}

// Pop gas. The actual gas is in interpreter.evm.callGasTemp.
Expand Down Expand Up @@ -938,23 +942,25 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext
if interpreter.evm.chainRules.IsEIP4762 && !chargeCallVariantEIP4762(interpreter.evm, scope) {
return nil, ErrOutOfGas
}
memSize, err := getMemSize(interpreter.table[DELEGATECALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasDelegateCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
if interpreter.evm.chainRules.IsEIP4762 {
memSize, err := getMemSize(interpreter.table[DELEGATECALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasDelegateCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
}
}

stack := scope.Stack
Expand Down Expand Up @@ -989,23 +995,25 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext)
return nil, ErrOutOfGas
}

memSize, err := getMemSize(interpreter.table[STATICCALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
if interpreter.evm.chainRules.IsEIP4762 {
memSize, err := getMemSize(interpreter.table[STATICCALL], scope.Stack)
if err != nil {
return nil, err
}
dynamicCost, err := gasStaticCall(interpreter.evm, scope.Contract, scope.Stack, scope.Memory, memSize)
if err != nil || !scope.Contract.UseGas(dynamicCost) {
return nil, ErrOutOfGas
}
if memSize > 0 {
scope.Memory.Resize(memSize)
}
interpreter.evm.callGasTemp, err = callGas(interpreter.evm.chainRules.IsEIP150, scope.Contract.Gas, 0, scope.Stack.Back(0))
if err != nil {
return nil, err
}
if !scope.Contract.UseGas(interpreter.evm.callGasTemp) {
return nil, ErrOutOfGas
}
}

// Pop gas. The actual gas is in interpreter.evm.callGasTemp.
Expand Down
2 changes: 1 addition & 1 deletion core/vm/interpreter.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) (
logged = true
}
// TODO(hack): remove if conditions
if op != CALL && op != CALLCODE && op != DELEGATECALL && op != STATICCALL && memorySize > 0 {
if (!in.evm.chainRules.IsEIP4762 || (op != CALL && op != CALLCODE && op != DELEGATECALL && op != STATICCALL)) && memorySize > 0 {
mem.Resize(memorySize)
}
} else if debug {
Expand Down

0 comments on commit 514b4d5

Please sign in to comment.