From 34416a95695f609aac374813b35616856c17e616 Mon Sep 17 00:00:00 2001 From: codchen Date: Tue, 14 May 2024 13:05:40 +0800 Subject: [PATCH] Add function to get deployment code --- core/vm/evm.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/vm/evm.go b/core/vm/evm.go index 884e2bc665..c86dac8954 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -530,6 +530,23 @@ func (evm *EVM) CreateWithAddress(caller ContractRef, code []byte, gas uint64, v return evm.create(caller, &codeAndHash{code: code}, gas, value, address, CREATE) } +func (evm *EVM) GetDeploymentCode(caller ContractRef, code []byte, gas uint64, value *big.Int, address common.Address) ([]byte, error) { + contract := NewContract(caller, AccountRef(address), value, gas) + contract.SetCodeOptionalHash(&address, &codeAndHash{code: code}) + + ret, err := evm.interpreter.Run(contract, nil, false) + // Check whether the max code size has been exceeded, assign err if the case. + if err == nil && evm.chainRules.IsEIP158 && len(ret) > params.MaxCodeSize { + err = ErrMaxCodeSizeExceeded + } + + // Reject code starting with 0xEF if EIP-3541 is enabled. + if err == nil && len(ret) >= 1 && ret[0] == 0xEF && evm.chainRules.IsLondon { + err = ErrInvalidCode + } + return ret, err +} + // ChainConfig returns the environment's chain configuration func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig }