def execute_contract_creation(laser_evm, contract_initialization_code, contract_name, code_extension=None, callvalue=BitVec("callvalue", 256)): """ Executes a contract creation transaction from all open states""" open_states = laser_evm.open_states[:] del laser_evm.open_states[:] new_account = laser_evm.world_state.create_account( 0, concrete_storage=True, dynamic_loader=None, contract_name=contract_name) for open_world_state in open_states: transaction = ContractCreationTransaction( open_world_state, BitVec("caller", 256), new_account, Disassembly(contract_initialization_code), [], BitVec("gasprice", 256), callvalue, BitVec("origin", 256), CalldataType.SYMBOLIC) if code_extension: transaction.code_extension = code_extension _setup_global_state_for_execution(laser_evm, transaction) laser_evm.exec(True) return new_account
def execute_contract_creation(laser_evm, contract_initialization_code, contract_name=None): """ Executes a contract creation transaction from all open states""" open_states = laser_evm.open_states[:] del laser_evm.open_states[:] new_account = laser_evm.world_state.create_account(0, concrete_storage=True, dynamic_loader=None) if contract_name: new_account.contract_name = contract_name for open_world_state in open_states: next_transaction_id = get_next_transaction_id() transaction = ContractCreationTransaction( open_world_state, BitVec("creator{}".format(next_transaction_id), 256), next_transaction_id, new_account, Disassembly(contract_initialization_code), [], BitVec("gas_price{}".format(next_transaction_id), 256), BitVec("call_value{}".format(next_transaction_id), 256), BitVec("origin{}".format(next_transaction_id), 256), CalldataType.SYMBOLIC, ) _setup_global_state_for_execution(laser_evm, transaction) laser_evm.exec(True) return new_account
def execute_contract_creation(laser_evm, contract_initialization_code, contract_name=None) -> Account: """ Executes a contract creation transaction from all open states""" # TODO: Resolve circular import between .transaction and ..svm to import LaserEVM here open_states = laser_evm.open_states[:] del laser_evm.open_states[:] new_account = laser_evm.world_state.create_account(0, concrete_storage=True, dynamic_loader=None) if contract_name: new_account.contract_name = contract_name for open_world_state in open_states: next_transaction_id = get_next_transaction_id() transaction = ContractCreationTransaction( world_state=open_world_state, identifier=next_transaction_id, gas_price=BitVec("gas_price{}".format(next_transaction_id), 256), gas_limit=8000000, # block gas limit origin=BitVec("origin{}".format(next_transaction_id), 256), code=Disassembly(contract_initialization_code), caller=BitVecVal(CREATOR_ADDRESS, 256), callee_account=new_account, call_data=[], call_data_type=CalldataType.SYMBOLIC, call_value=BitVec("call_value{}".format(next_transaction_id), 256), ) _setup_global_state_for_execution(laser_evm, transaction) laser_evm.exec(True) return new_account
def execute_contract_creation( laser_evm, contract_initialization_code, contract_name=None, world_state=None ) -> Account: """Executes a contract creation transaction from all open states. :param laser_evm: :param contract_initialization_code: :param contract_name: :return: """ # TODO: Resolve circular import between .transaction and ..svm to import LaserEVM here del laser_evm.open_states[:] world_state = world_state or WorldState() open_states = [world_state] new_account = None for open_world_state in open_states: next_transaction_id = get_next_transaction_id() # call_data "should" be '[]', but it is easier to model the calldata symbolically # and add logic in codecopy/codesize/calldatacopy/calldatasize than to model code "correctly" transaction = ContractCreationTransaction( world_state=open_world_state, identifier=next_transaction_id, gas_price=symbol_factory.BitVecSym( "gas_price{}".format(next_transaction_id), 256 ), gas_limit=8000000, # block gas limit origin=symbol_factory.BitVecSym( "origin{}".format(next_transaction_id), 256 ), code=Disassembly(contract_initialization_code), caller=symbol_factory.BitVecVal(CREATOR_ADDRESS, 256), contract_name=contract_name, call_data=None, call_value=symbol_factory.BitVecSym( "call_value{}".format(next_transaction_id), 256 ), ) _setup_global_state_for_execution(laser_evm, transaction) new_account = new_account or transaction.callee_account laser_evm.exec(True) return new_account