ETH Price: $2,071.81 (+3.45%)

Transaction Decoder

Block:
8724779 at Oct-12-2019 05:02:46 AM +UTC
Transaction Fee:
0.000047395 ETH $0.10
Gas Used:
47,395 Gas / 1 Gwei

Emitted Events:

102 Ev5.TransferEvent( _from=[Receiver] Ev5, _to=[Sender] 0x36d2ab85de85edd31f5be941715eb6f8a4e310bb, _value=1017600000000000000, time=1570856566 )

Account State Difference:

  Address   Before After State Difference Code
0x36d2Ab85...8a4E310bb
6.2232872515826478 Eth
Nonce: 22
7.2408398565826478 Eth
Nonce: 23
1.017552605
0x6e452121...D8D07F5c2 5,331.5643024 Eth5,330.5467024 Eth1.0176
0xDe10dC3f...93df35690
(Ethermine)
580.403637484123446795 Eth580.403684879123446795 Eth0.000047395

Execution Trace

Ev5.CALL( )
  • 0xde10dc3fe1303f09ab56f1e717a2d3993df35690.bbec1e57( )
  • 0xde10dc3fe1303f09ab56f1e717a2d3993df35690.STATICCALL( )
  • 0xde10dc3fe1303f09ab56f1e717a2d3993df35690.STATICCALL( )
  • ETH 1.0176 0x36d2ab85de85edd31f5be941715eb6f8a4e310bb.CALL( )
  • 0xde10dc3fe1303f09ab56f1e717a2d3993df35690.9654430b( )
    {"ev5_main.sol":{"content":"/**\n *Submitted for verification at Etherscan.io on 2019-09-23\n*/\npragma solidity ^0.5.11;\nimport \u0027./ownable.sol\u0027;\nimport \u0027./safemath.sol\u0027;\n/**\n * @title -EV5.Win- v0.5.11\n * ╔═╗┌─┐┬ ┬┬─┐┌─┐┌─┐┌─┐  ┌─┐┌┐┌┌┬┐  ┬ ┬┬┌─┐┌┬┐┌─┐┌┬┐  ┌─┐┬─┐┌─┐  ┌┬┐┬ ┬┌─┐  ┌┐ ┌─┐┌─┐┌┬┐  ┬ ┬┌─┐┌─┐┬  ┌┬┐┬ ┬\n * ║  │ ││ │├┬┘├─┤│ ┬├┤   ├─┤│││ ││  ││││└─┐ │││ ││││  ├─┤├┬┘├┤    │ ├─┤├┤   ├┴┐├┤ └─┐ │   │││├┤ ├─┤│   │ ├─┤\n * ╚═╝└─┘└─┘┴└─┴ ┴└─┘└─┘  ┴ ┴┘└┘─┴┘  └┴┘┴└─┘─┴┘└─┘┴ ┴  ┴ ┴┴└─└─┘   ┴ ┴ ┴└─┘  └─┘└─┘└─┘ ┴   └┴┘└─┘┴ ┴┴─┘ ┴ ┴ ┴\n *\n * ==(\u0027-.==========(`-. ====================(`\\ .-\u0027) /`===============.-\u0027) _====================================\n * _(  OO)      _(OO  )_                  `.( OO ),\u0027              ( OO ) )\n * (,------. ,--(_/   ,. \\.------.      ,--./  .--.    ,-.-\u0027)  ,--./ ,--,\u0027\n *  |  .---\u0027 \\   \\   /(__/|   ___|      |      |  |    |  |OO) |   \\ |  |\\\n *  |  |      \\   \\ /   / |  \u0027--.       |  |   |  |,   |  |  \\ |    \\|  | )\n * (|  \u0027--.    \\   \u0027   /, `---.  \u0027.     |  |.\u0027.|  |_)  |  |(_/ |  .     |/\n *  |  .--\u0027     \\     /__).-   |  |     |         |   ,|  |_.\u0027 |  |\\    |\n *  |  `---.     \\   /    | `-\u0027   / .-. |   ,\u0027.   |  (_|  |    |  | \\   |          © Cargo Keep Team Inc. 2019\n *  `------\u0027      `-\u0027      `----\u0027\u0027  `-\u0027 \u0027--\u0027   \u0027--\u0027    `--\u0027    `--\u0027  `--\u0027\n * =============================================================================================================\n*\n*\n╔═╗╦  ╦ ┬ ┬┬┌┐┌  ╔═╗┌┬┐┌─┐┬─┐┌┬┐┬┌┐┌┌─┐\n║╣ ╚╗╔╝ │││││││  ╚═╗ │ ├─┤├┬┘ │ │││││ ┬\n╚═╝ ╚╝ o└┴┘┴┘└┘  ╚═╝ ┴ ┴ ┴┴└─ ┴ ┴┘└┘└─┘\n*/\ncontract Vendor {\n    uint public maxCoin;\n    uint public feeRo;\n    function getLv(uint _value) external view returns(uint);\n    function getQueueLv(uint _value) external view returns(uint);\n}\ncontract DB {\n    string public sysCode;\n\n    function createNode(address _owner, string memory _code, string memory _pCode, uint _nid) public;\n    function createUser(address _owner, uint _frozenCoin, uint _freeCoin, uint8 _level, uint8 _queueLevel, uint32 _ctime, string memory _ip) public returns(uint);\n    function updateCoinLevel(address _owner,uint _frozenCoin, uint _freeCoin, uint8 _level, uint8 _queueLevel, uint8 _c1,uint8 _c2,uint8 _c3, uint8 _c4) public;\n    function updateBonusInvite(address _owner, uint _dayBonusCoin, uint _dayInviteCoin, uint _bonusCoin, uint _inviteCoin, uint8 _c1, uint8 _c2, uint8 _c3, uint8 _c4) public;\n    function updateLockCoin(address _owner, uint8 _currentStamp, uint _lockedCoin, uint8 _c1, uint8 _c2) public;\n    function createOrder(address _owner,uint _investCoin, uint32 _ctime, uint8 _frequency) public returns(uint);\n    function updateOrder(uint _oid, address _owner, uint _investCoin, uint8 _frequency, uint32 _ctime, uint8 _c1, uint8 _c2, uint8 _c3) public;\n    function overAndRestart() public returns(uint32);\n\n    function getNodeMapping(address _owner) public view returns(uint, address, string memory, string memory, uint8);\n    function getUserMapping(address _owner) public view returns(address, string memory,string memory,uint8,uint8,uint,uint,uint,uint,uint,uint,uint);\n    function getCodeMapping(string memory _code) public view returns(address);\n    function getNodeCounter(address _owner) public view returns(uint);\n    function getIndexMapping(uint _nid) public view returns(address);\n    function getPlatforms() public view returns(uint[11] memory rlt);\n\n    function setCountAndCoin(uint _coin, uint _count) public;\n    function getTrustAccount() public view returns(uint);\n    function getLockAccount() public view returns(uint);\n    function settleBonus(address _addr) public returns(uint);\n    function settleRecommend(uint _start, uint _end) public;\n}\n\ncontract Ev5 is Whitelist {\n    string public EV5_NAME = \"Ev5.win GameBoy\";\n    //lib using list\n    using SafeMath for uint;\n\n    //Loglist\n    event InvestEvent(address indexed _addr, string _code, string _pCode, uint indexed _oid, uint _value, uint32 time);\n    event TransferEvent(address indexed _from, address indexed _to, uint _value, uint32 time);\n\n    //base param setting\n    uint ethWei = 1 ether;\n    bool private reEntrancyMutex = false;\n    address[3] private _addrs;//_dAddr0,_envAddr1,feeAddr3\n\n    //platform setting\n    bool private _platformPower = true;\n    uint private _openTime = 0;\n\n    //include other contract\n    DB db;\n    Vendor env;\n\n    //the content of contract is Beginning\n    constructor () public {\n        _addrs = [0xDe10dC3fE1303f09AB56F1e717a2d3993df35690, 0x0d2bD36Ecd9EBB959c8B1C5E87946eEd43c82dd1, 0x9732D32F4517A0A238441EcA4E45C1584A832fE0];\n        db = DB(_addrs[0]);\n        env = Vendor(_addrs[1]);\n        _openTime = uint32(now);\n    }\n    function deposit() public payable {\n    }\n\n    /**\n    * @dev prevents contracts from interacting with Ev5.win\n    */\n    modifier isOpen() {\n        require(_openTime \u003e 0 \u0026\u0026 _platformPower == true,\"platform is repairing or wait to starting!\");\n        _;\n    }\n    /**\n    * @dev prevents contracts from interacting with Ev5.win\n    */\n    modifier isHuman() {\n        address _addr = msg.sender;\n        uint256 _codeLength;\n\n        assembly {_codeLength := extcodesize(_addr)}\n        require(_codeLength == 0, \"sorry humans only\");\n        require(tx.origin == msg.sender, \"sorry human only\");\n        _;\n    }\n\n    function _checkIsCreateNode(address _owner, string memory _code, string memory _pCode)\n        private\n    {\n        if(db.getNodeCounter(_owner) == 0){\n            require(!compareStr(_code, \"\") \u0026\u0026 db.getCodeMapping(_code) == address(0), \"Empty Code Or Code Existed\");\n            require(compareStr(_pCode, db.sysCode()) || db.getCodeMapping(_pCode) != address(0),\"Parent User Is Not Exist\");\n            require(db.getCodeMapping(_pCode) != _owner, \"Parent User Is Not Owner\");\n            //create node first\n            db.createNode(_owner, _code, _pCode, 0);\n        }\n    }\n    function invest(string memory _code, string memory _pCode, string memory _ip)\n        public\n        payable\n        isHuman()\n        isOpen()\n    {\n        require(msg.value == msg.value.div(ethWei).mul(ethWei), \"Coin Must Integer\");\n        require(msg.value \u003e= 1*ethWei \u0026\u0026 msg.value \u003c= env.maxCoin()*ethWei, \"Coin Must Between 1 to maxCoin\");\n\n        _checkIsCreateNode(msg.sender, _code, _pCode);\n\n        uint8 level = uint8(env.getLv(msg.value));\n        uint8 queueLevel = uint8(env.getQueueLv(msg.value));\n        (address userAddress,,,,,uint frozenCoin,uint freeCoin,,,,,) = db.getUserMapping(msg.sender);\n        if(userAddress == address(0)) {\n            db.createUser(msg.sender, msg.value, 0, level, queueLevel, uint32(now), _ip);\n        } else {\n            require(frozenCoin.add(msg.value) \u003c= env.maxCoin()*ethWei, \"Max Coin is maxCoin ETH\");\n            frozenCoin = frozenCoin.add(msg.value);\n            level = uint8(env.getLv(frozenCoin));\n            queueLevel = uint8(env.getQueueLv(frozenCoin.add(freeCoin)));\n            db.updateCoinLevel(msg.sender,frozenCoin,0,level,queueLevel,1,0,1,1);\n        }\n\n        uint oid = db.createOrder(msg.sender, msg.value,uint32(now), 0);\n        db.setCountAndCoin(msg.value, 1);\n\n        transferTo(_addrs[2], msg.value.mul(env.feeRo()).div(1000));\n        emit InvestEvent(msg.sender, _code, _pCode, oid, msg.value, uint32(now));\n    }\n\n    function sendAwardBySelf()\n        public\n        isHuman()\n        isOpen()\n    {\n        (,,,,,,,,uint _coin,,,) = db.getUserMapping(msg.sender);\n\n        bool success = false;\n        uint rltCoin = 0;\n        (success,rltCoin) = isEnough(_coin, true);\n        if(success == true){\n            if(rltCoin \u003e (ethWei/10)){\n                transferTo(msg.sender, _coin);\n                db.updateBonusInvite(msg.sender,0,0,0,0,1,1,0,0);\n            }\n        }else{\n            _openTime = db.overAndRestart();\n        }\n    }\n\n    function rePlayIn()\n        public\n        payable\n        isHuman()\n        isOpen()\n    {\n        (,string memory _code, string memory _pCode,,,uint frozenCoin,uint freeCoin,,,,,) = db.getUserMapping(msg.sender);\n        require(frozenCoin.add(freeCoin) \u003c= env.maxCoin()*ethWei, \"Max Coin is maxCoin ETH\");\n        frozenCoin = frozenCoin.add(freeCoin);\n        uint8 level = uint8(env.getLv(frozenCoin));\n        uint8 queueLevel = uint8(env.getQueueLv(frozenCoin));\n        db.updateCoinLevel(msg.sender,frozenCoin,0,level,queueLevel,1,1,1,1);\n\n        uint oid = db.createOrder(msg.sender, freeCoin,uint32(now), 0);\n        db.setCountAndCoin(freeCoin, 1);\n        transferTo(_addrs[2], freeCoin.mul(env.feeRo()).div(1000));\n        emit InvestEvent(msg.sender, _code, _pCode, oid, freeCoin, uint32(now));\n    }\n\n    function sendAward(uint _start ,uint _end)\n        public\n        payable\n        onlyIfWhitelisted\n    {\n        for(uint i = _start; i \u003c= _end; i++) {\n            address _owner = db.getIndexMapping(i);\n            if(_owner != address(0)){\n                (,,,,,,,,uint _coin,,,) = db.getUserMapping(_owner);\n\n                if(_coin \u003e= (ethWei/10)){\n                    transferTo(_owner, _coin);\n                    db.updateBonusInvite(_owner,0,0,0,0,1,1,0,0);\n                }\n            }\n        }\n    }\n\n    function isEnough(uint _coin, bool _isCal)\n        private\n        view\n        returns (bool,uint)\n    {\n        uint balance = (_isCal == true) ? address(this).balance.sub(db.getTrustAccount()).sub(db.getLockAccount()) : address(this).balance;\n        if(_coin \u003e= balance){\n            return (false, balance);\n        }else{\n            return (true, _coin);\n        }\n    }\n\n    function transferTo(address _addr,uint _val) private {\n        require(_addr != address(0));\n        require(!reEntrancyMutex);\n        reEntrancyMutex = true;\n            address(uint160(_addr)).transfer(_val);\n            emit TransferEvent(address(this), _addr, _val, uint32(now));\n        reEntrancyMutex = false;\n    }\n\n    function userWithDraw()\n        public\n        payable\n        isHuman()\n        isOpen\n        returns(bool)\n    {\n        require(!reEntrancyMutex);\n        (,,,,,uint frozenCoin,uint freeCoin,uint lockedCoin,,,,) = db.getUserMapping(msg.sender);\n        require(lockedCoin == 0, \"Nothing To\");\n\n        bool success = false;\n        uint rltCoin;\n        (success,rltCoin) = isEnough(freeCoin, true);\n\n        if(success == true){\n            if(rltCoin \u003e 0){\n                transferTo(msg.sender, rltCoin);\n                uint8 level = uint8(env.getLv(frozenCoin));\n                uint8 queueLevel = uint8(env.getQueueLv(frozenCoin));\n                db.updateCoinLevel(msg.sender,0,0,level,queueLevel,0,1,1,1);\n            }\n            return true;\n        }else{\n            _openTime = db.overAndRestart();\n        }\n        return false;\n    }\n\n    function userWithDrawPro()\n        public\n        payable\n        isHuman()\n        isOpen\n        returns(bool)\n    {\n        require(!reEntrancyMutex);\n        (,,,,,uint frozenCoin,uint freeCoin,uint lockedCoin,,,,) = db.getUserMapping(msg.sender);\n        require(freeCoin == lockedCoin, \"Nothing To\");\n\n        bool success = false;\n        uint rltCoin;\n        (success,rltCoin) = isEnough(freeCoin, false);\n\n        if(success == true){\n            if(rltCoin \u003e 0){\n                transferTo(msg.sender, rltCoin);\n                uint8 level = uint8(env.getLv(frozenCoin));\n                uint8 queueLevel = uint8(env.getQueueLv(frozenCoin));\n                db.updateCoinLevel(msg.sender,0,0,level,queueLevel,0,1,1,1);\n            }\n            return true;\n        }\n        return false;\n    }\n\n    function settleBonus(address _addr)\n        public\n        onlyIfWhitelisted\n        returns(uint)\n    {\n        return db.settleBonus(_addr);\n    }\n\n    function settleRecommend(uint _start, uint _end)\n        public\n        onlyIfWhitelisted\n    {\n        db.settleRecommend(_start, _end);\n    }\n\n    function getUserByCode(string memory _code) public view isOpen returns (bool){\n        if (db.getCodeMapping(_code) != address(0)){\n            return true;\n        }\n        return false;\n    }\n    function getUserInfo(address _owner) external view isOpen returns(address, string memory,string memory,uint8,uint8,uint,uint,uint,uint,uint,uint,uint){\n        if(db.getNodeCounter(_owner) \u003e 0){\n            return (db.getUserMapping(_owner));\n        }\n        return (address(0),\u0027\u0027,\u0027\u0027,0,0,0,0,0,0,0,0,0);\n    }\n    function getPlatforms() external view isOpen returns(uint,uint,uint){\n        uint[11] memory ptm = db.getPlatforms();\n        return (ptm[6],ptm[7],ptm[8]);\n    }\n    function getPlatformA() external view onlyOwner returns(bool,address,address,address,uint){\n        return (_platformPower,_addrs[0],_addrs[1],_addrs[2],_openTime);\n    }\n    function setPlatformPower(bool r) external onlyOwner{\n        _platformPower = r;\n    }\n    function setNewAddr(uint _addrId, address _addr) external onlyOwner{\n        _addrs[_addrId] = _addr;\n        db = DB(_addrs[0]);\n        env = Vendor(_addrs[1]);\n    }\n}\n"},"ownable.sol":{"content":"pragma solidity ^0.5.11;\n\ncontract Ownable {\n    address private _owner;\n\n    event OwnerTransferred(address indexed previousOwner, address indexed newOwner);\n\n    constructor () internal {\n        _owner = msg.sender;\n        emit OwnerTransferred(address(0), _owner);\n    }\n    function owner() public view returns(address){\n        return _owner;\n    }\n    function isOwner() public view returns(bool){\n        return msg.sender == _owner;\n    }\n    modifier onlyOwner() {\n        require(msg.sender == _owner, \"it is not called by the owner\");\n        _;\n    }\n    function changeOwnership(address newOwner) public onlyOwner {\n        require(newOwner != address(0));\n        emit OwnerTransferred(_owner, newOwner);\n        _owner = newOwner;\n    }\n    function compareStr(string memory _str1,string memory _str2) internal pure returns(bool) {\n        bool compareResult = false;\n        if(keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2))) {\n            compareResult = true;\n        }\n        return compareResult;\n    }\n}\n\n/**\n * @title Roles\n * @dev Library for managing addresses assigned to a Role.\n */\nlibrary Roles {\n  struct Role {\n    mapping (address =\u003e bool) bearer;\n  }\n\n  /**\n   * @dev give an address access to this role\n   */\n  function add(Role storage _role, address _addr)\n    internal\n  {\n     require(!has(_role, _addr), \"addr already has role\");\n      _role.bearer[_addr] = true;\n  }\n\n  /**\n   * @dev remove an address\u0027 access to this role\n   */\n  function remove(Role storage _role, address _addr)\n    internal\n  {\n      require(has(_role, _addr), \"addr do not have role\");\n      _role.bearer[_addr] = false;\n  }\n\n  /**\n   * @dev check if an address has this role\n   * // reverts\n   */\n  function check(Role storage _role, address _addr)\n    internal\n    view\n  {\n      require(has(_role, _addr));\n  }\n\n  /**\n   * @dev check if an address has this role\n   * @return bool\n   */\n  function has(Role storage _role, address _addr)\n    internal\n    view\n    returns (bool)\n  {\n      require(_addr != address(0), \"not the zero address\");\n      return _role.bearer[_addr];\n  }\n}\n\n/**\n * @title RBAC (Role-Based Access Control)\n * @author Matt Condon (@Shrugs)\n * @dev Stores and provides setters and getters for roles and addresses.\n * Supports unlimited numbers of roles and addresses.\n * See //contracts/mocks/RBACMock.sol for an example of usage.\n * This RBAC method uses strings to key roles. It may be beneficial\n * for you to write your own implementation of this interface using Enums or similar.\n */\ncontract RBAC {\n  using Roles for Roles.Role;\n\n  mapping (string =\u003e Roles.Role) private roles;\n\n  event RoleAdded(address indexed operator, string role);\n  event RoleRemoved(address indexed operator, string role);\n\n  /**\n   * @dev reverts if addr does not have role\n   * @param _operator address\n   * @param _role the name of the role\n   * // reverts\n   */\n  function checkRole(address _operator, string memory _role)\n    public\n    view\n  {\n    roles[_role].check(_operator);\n  }\n\n  /**\n   * @dev determine if addr has role\n   * @param _operator address\n   * @param _role the name of the role\n   * @return bool\n   */\n    function hasRole(address _operator, string memory _role)\n    public\n    view\n    returns (bool)\n  {\n    return roles[_role].has(_operator);\n  }\n\n  /**\n   * @dev add a role to an address\n   * @param _operator address\n   * @param _role the name of the role\n   */\n  function addRole(address _operator, string memory _role)\n    internal\n  {\n    roles[_role].add(_operator);\n    emit RoleAdded(_operator, _role);\n  }\n\n  /**\n   * @dev remove a role from an address\n   * @param _operator address\n   * @param _role the name of the role\n   */\n  function removeRole(address _operator, string memory _role)\n    internal\n  {\n    roles[_role].remove(_operator);\n    emit RoleRemoved(_operator, _role);\n  }\n\n  /**\n   * @dev modifier to scope access to a single role (uses msg.sender as addr)\n   * @param _role the name of the role\n   * // reverts\n   */\n  modifier onlyRole(string memory _role)\n  {\n    checkRole(msg.sender, _role);\n    _;\n  }\n}\n\n\n/**\n * @title Whitelist\n * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.\n * This simplifies the implementation of \"user permissions\".\n */\ncontract Whitelist is Ownable, RBAC {\n  string public constant ROLE_WHITELISTED = \"whitelist\";\n\n  /**\n   * @dev Throws if operator is not whitelisted.\n   */\n  modifier onlyIfWhitelisted() {\n    require(hasRole(msg.sender, ROLE_WHITELISTED) || isOwner(), \"Throws if operator is not whitelisted\");\n    _;\n  }\n\n  /**\n   * @dev add an address to the whitelist\n   * @param _operator address\n   * @return true if the address was added to the whitelist, false if the address was already in the whitelist\n   */\n  function addAddressToWhitelist(address _operator)\n    public\n    onlyOwner\n  {\n    addRole(_operator, ROLE_WHITELISTED);\n  }\n\n  /**\n   * @dev getter to determine if address is in whitelist\n   */\n  function whitelist(address _operator)\n    public\n    view\n    returns (bool)\n  {\n    return hasRole(_operator, ROLE_WHITELISTED);\n  }\n\n  /**\n   * @dev add addresses to the whitelist\n   * @param _operators addresses\n   * @return true if at least one address was added to the whitelist,\n   * false if all addresses were already in the whitelist\n   */\n  function addAddressesToWhitelist(address[] memory _operators)\n    public\n    onlyOwner\n  {\n    for (uint256 i = 0; i \u003c _operators.length; i++) {\n      addAddressToWhitelist(_operators[i]);\n    }\n  }\n    /**\n   * @dev remove an address from the whitelist\n   * @param _operator address\n   * @return true if the address was removed from the whitelist,\n   * false if the address wasn\u0027t in the whitelist in the first place\n   */\n  function removeAddressFromWhitelist(address _operator)\n    public\n    onlyOwner\n  {\n    removeRole(_operator, ROLE_WHITELISTED);\n  }\n\n  /**\n   * @dev remove addresses from the whitelist\n   * @param _operators addresses\n   * @return true if at least one address was removed from the whitelist,\n   * false if all addresses weren\u0027t in the whitelist in the first place\n   */\n  function removeAddressesFromWhitelist(address[] memory _operators)\n    public\n    onlyOwner\n  {\n    for (uint256 i = 0; i \u003c _operators.length; i++) {\n      removeAddressFromWhitelist(_operators[i]);\n    }\n  }\n\n}\n"},"safemath.sol":{"content":"pragma solidity \u003e=0.4.22 \u003c0.6.0;\n\nlibrary SafeMath {\n    function mul(uint256 a, uint256 b) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n        uint256 c = a * b;\n        require(c / a == b);\n\n        return c;\n    }\n\n    function div(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b \u003e 0);\n        uint256 c = a / b;\n\n        return c;\n    }\n\n    function sub(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b \u003c= a);\n        uint256 c = a - b;\n\n        return c;\n    }\n\n    function add(uint256 a, uint256 b) internal pure returns (uint256) {\n        uint256 c = a + b;\n        require(c \u003e= a);\n\n        return c;\n    }\n\n    function mod(uint256 a, uint256 b) internal pure returns (uint256) {\n        require(b != 0);\n        return a % b;\n    }\n}\n"}}