def _transaction(self, sort, caller, value=<NUM_LIT:0>, address=None, data=None, gaslimit=None, price=<NUM_LIT:1>):
if gaslimit is None:<EOL><INDENT>gaslimit = cfg.defaultgas<EOL><DEDENT>if isinstance(address, EVMAccount):<EOL><INDENT>address = int(address)<EOL><DEDENT>if isinstance(caller, EVMAccount):<EOL><INDENT>caller = int(caller)<EOL><DEDENT>if data is None:<EOL><INDENT>data = bytearray(b"<STR_LIT>")<EOL><DEDENT>if isinstance(data, (str, bytes)):<EOL><INDENT>data = bytearray(data)<EOL><DEDENT>if not isinstance(data, (bytearray, Array)):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if not isinstance(caller, (int, BitVec)):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if not isinstance(value, (int, BitVec)):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if not isinstance(address, (int, BitVec)):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if not isinstance(price, int):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if sort not in ('<STR_LIT>', '<STR_LIT>'):<EOL><INDENT>raise ValueError('<STR_LIT>')<EOL><DEDENT>if sort == '<STR_LIT>':<EOL><INDENT>if len(data) == <NUM_LIT:0>:<EOL><INDENT>raise EthereumError("<STR_LIT>")<EOL><DEDENT><DEDENT>assert address is not None<EOL>assert caller is not None<EOL>if not self.count_running_states():<EOL><INDENT>raise NoAliveStates<EOL><DEDENT>for state in self.running_states:<EOL><INDENT>world = state.platform<EOL>if '<STR_LIT>' in state.context:<EOL><INDENT>raise EthereumError("<STR_LIT>")<EOL><DEDENT>if address is None:<EOL><INDENT>if issymbolic(caller):<EOL><INDENT>raise EthereumError("<STR_LIT>")<EOL><DEDENT>address = world.new_address(caller)<EOL><DEDENT>caller_migrated, address_migrated, value_migrated, data_migrated = self._migrate_tx_expressions(state, caller, address, value, data)<EOL>if sort == '<STR_LIT>':<EOL><INDENT>if address in world.accounts:<EOL><INDENT>raise EthereumError("<STR_LIT>")<EOL><DEDENT><DEDENT>state.context['<STR_LIT>'] = (sort, caller_migrated, address_migrated, value_migrated, data_migrated, gaslimit, price)<EOL><DEDENT>self.run(procs=self._config_procs)<EOL>return address<EOL>
Initiates a transaction

            :param caller: caller account
            :type caller: int or EVMAccount
            :param int address: the address for the transaction (optional)
            :param value: value to be transferred
            :param price: the price of gas for this transaction. Mostly unused.
            :type value: int or BitVecVariable
            :param str data: initializing evm bytecode and arguments or transaction call data
            :param gaslimit: gas budget
            :rtype: EVMAccount