def preconstraint_for_call_transaction(self, address: Union[int, EVMAccount], data: Array,<EOL>value: Optional[Union[int, Expression]] = None,<EOL>contract_metadata: Optional[SolidityMetadata] = None) -> BoolOperation:
if isinstance(address, EVMAccount):<EOL><INDENT>address = int(address)<EOL><DEDENT>if not isinstance(address, int):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if not issymbolic(data):<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT>if contract_metadata is None:<EOL><INDENT>contract_metadata = self.metadata.get(address)<EOL>if contract_metadata is None:<EOL><INDENT>raise TypeError("<STR_LIT>")<EOL><DEDENT><DEDENT>selectors = contract_metadata.function_selectors<EOL>if not selectors or len(data) <= <NUM_LIT:4>:<EOL><INDENT>return BoolConstant(True)<EOL><DEDENT>symbolic_selector = data[:<NUM_LIT:4>]<EOL>value_is_symbolic = issymbolic(value)<EOL>constraint = None<EOL>for selector in selectors:<EOL><INDENT>c = symbolic_selector == selector<EOL>if value_is_symbolic and not contract_metadata.get_abi(selector)['<STR_LIT>']:<EOL><INDENT>c = Operators.AND(c, value == <NUM_LIT:0>)<EOL><DEDENT>if constraint is None:<EOL><INDENT>constraint = c<EOL><DEDENT>else:<EOL><INDENT>constraint = Operators.OR(constraint, c)<EOL><DEDENT><DEDENT>return constraint<EOL>
Returns a constraint that excludes combinations of value and data that would cause an exception in the EVM
            contract dispatcher.
            :param address: address of the contract to call
            :param value: balance to be transferred (optional)
            :param data: symbolic transaction data
            :param contract_metadata: SolidityMetadata for the contract (optional)