pragma solidity =0.6.12; pragma experimental ABIEncoderV2; contract ToBeEquel { address private owner; mapping(address => uint) public balances; uint private last_balance; event ForFlag(address addr); constructor() public { owner = msg.sender; balances[owner] = 500; } modifier onlyOwner { require(msg.sender == owner || msg.sender == address(this), "not authorized"); _; } function CallTest(address to, string memory customFallback, bytes memory data) public { if (_isContract(to)) { (bool success,) = to.call{value: 0}( abi.encodeWithSignature(customFallback, msg.sender, data) ); assert(success); } } function _isContract(address addr) internal view returns (bool) { uint length; assembly { length := extcodesize(addr) } return (length > 0); } function _Cal(uint value, uint amount) public onlyOwner { require(balances[tx.origin]=last_balance); balances[owner] -= uint(value & 0xff); balances[tx.origin] += amount; last_balance = balances[tx.origin]; } function getFlag() external { require(balances[owner]==balances[msg.sender]); emit ForFlag(msg.sender); } }