|
|
@ -23,8 +23,6 @@ import ( |
|
|
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
"github.com/ethereum/go-ethereum/core/tracing" |
|
|
|
"github.com/ethereum/go-ethereum/core/tracing" |
|
|
|
"github.com/ethereum/go-ethereum/core/types" |
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/crypto" |
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/params" |
|
|
|
"github.com/ethereum/go-ethereum/params" |
|
|
|
"github.com/holiman/uint256" |
|
|
|
"github.com/holiman/uint256" |
|
|
|
) |
|
|
|
) |
|
|
@ -709,65 +707,8 @@ func enableEOF(jt *JumpTable) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// opExtCodeCopyEIP7702 implements the EIP-7702 variation of opExtCodeCopy.
|
|
|
|
|
|
|
|
func opExtCodeCopyEIP7702(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { |
|
|
|
|
|
|
|
var ( |
|
|
|
|
|
|
|
stack = scope.Stack |
|
|
|
|
|
|
|
a = stack.pop() |
|
|
|
|
|
|
|
memOffset = stack.pop() |
|
|
|
|
|
|
|
codeOffset = stack.pop() |
|
|
|
|
|
|
|
length = stack.pop() |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() |
|
|
|
|
|
|
|
if overflow { |
|
|
|
|
|
|
|
uint64CodeOffset = math.MaxUint64 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
code := interpreter.evm.StateDB.GetCode(common.Address(a.Bytes20())) |
|
|
|
|
|
|
|
if _, ok := types.ParseDelegation(code); ok { |
|
|
|
|
|
|
|
code = types.DelegationPrefix[:2] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
codeCopy := getData(code, uint64CodeOffset, length.Uint64()) |
|
|
|
|
|
|
|
scope.Memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nil, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// opExtCodeSizeEIP7702 implements the EIP-7702 variation of opExtCodeSize.
|
|
|
|
|
|
|
|
func opExtCodeSizeEIP7702(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { |
|
|
|
|
|
|
|
slot := scope.Stack.peek() |
|
|
|
|
|
|
|
code := interpreter.evm.StateDB.GetCode(common.Address(slot.Bytes20())) |
|
|
|
|
|
|
|
if _, ok := types.ParseDelegation(code); ok { |
|
|
|
|
|
|
|
code = types.DelegationPrefix[:2] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
slot.SetUint64(uint64(len(code))) |
|
|
|
|
|
|
|
return nil, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// opExtCodeHashEIP7702 implements the EIP-7702 variation of opExtCodeHash.
|
|
|
|
|
|
|
|
func opExtCodeHashEIP7702(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { |
|
|
|
|
|
|
|
slot := scope.Stack.peek() |
|
|
|
|
|
|
|
addr := common.Address(slot.Bytes20()) |
|
|
|
|
|
|
|
if interpreter.evm.StateDB.Empty(addr) { |
|
|
|
|
|
|
|
slot.Clear() |
|
|
|
|
|
|
|
return nil, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
code := interpreter.evm.StateDB.GetCode(addr) |
|
|
|
|
|
|
|
if _, ok := types.ParseDelegation(code); ok { |
|
|
|
|
|
|
|
// If the code is a delegation, return the prefix without version.
|
|
|
|
|
|
|
|
slot.SetBytes(crypto.Keccak256(types.DelegationPrefix[:2])) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// Otherwise, return normal code hash.
|
|
|
|
|
|
|
|
slot.SetBytes(interpreter.evm.StateDB.GetCodeHash(addr).Bytes()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return nil, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// enable7702 the EIP-7702 changes to support delegation designators.
|
|
|
|
// enable7702 the EIP-7702 changes to support delegation designators.
|
|
|
|
func enable7702(jt *JumpTable) { |
|
|
|
func enable7702(jt *JumpTable) { |
|
|
|
jt[EXTCODECOPY].execute = opExtCodeCopyEIP7702 |
|
|
|
|
|
|
|
jt[EXTCODESIZE].execute = opExtCodeSizeEIP7702 |
|
|
|
|
|
|
|
jt[EXTCODEHASH].execute = opExtCodeHashEIP7702 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jt[CALL].dynamicGas = gasCallEIP7702 |
|
|
|
jt[CALL].dynamicGas = gasCallEIP7702 |
|
|
|
jt[CALLCODE].dynamicGas = gasCallCodeEIP7702 |
|
|
|
jt[CALLCODE].dynamicGas = gasCallCodeEIP7702 |
|
|
|
jt[STATICCALL].dynamicGas = gasStaticCallEIP7702 |
|
|
|
jt[STATICCALL].dynamicGas = gasStaticCallEIP7702 |
|
|
|