diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index af7e043dc7..09d62918c9 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -380,8 +380,12 @@ func gasCallStateless(evm *EVM, contract *Contract, stack *Stack, mem *Memory, m transfersValue = !stack.Back(2).IsZero() ) - if transfersValue && !evm.chainRules.IsEIP4762 { - gas += params.CallValueTransferGas + if transfersValue { + if evm.readOnly { + return 0, ErrWriteProtection + } else if !evm.chainRules.IsEIP4762 { + gas += params.CallValueTransferGas + } } memoryGas, err := memoryGasCost(mem, memorySize) @@ -452,11 +456,16 @@ func gasCallCodeStateless(evm *EVM, contract *Contract, stack *Stack, mem *Memor return 0, err } var ( - gas uint64 - overflow bool + gas uint64 + overflow bool + transfersValue = !stack.Back(2).IsZero() ) - if stack.Back(2).Sign() != 0 && !evm.chainRules.IsEIP4762 { - gas += params.CallValueTransferGas + if transfersValue { + if evm.readOnly { + return 0, ErrWriteProtection + } else if !evm.chainRules.IsEIP4762 { + gas += params.CallValueTransferGas + } } if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { return 0, ErrGasUintOverflow