ETH Price: $1,804.95 (-0.44%)
Gas: 0.31 Gwei

Transaction Decoder

Block:
11557794 at Dec-30-2020 09:14:12 PM +UTC
Transaction Fee:
0.01038985 ETH $18.75
Gas Used:
207,797 Gas / 50 Gwei

Emitted Events:

Account State Difference:

  Address   Before After State Difference Code
0x5cadDBC9...a469E3D50 0.01418092 Eth0.06418092 Eth0.05
0x644C7223...48DA41222
0.08 Eth
Nonce: 0
0.01961015 Eth
Nonce: 1
0.06038985
0xA315bD2e...7EAFf9cb4
(CryptoHands)
(Ethermine)
1,194.508723917813085824 Eth1,194.519113767813085824 Eth0.01038985

Execution Trace

ETH 0.05 CryptoHands.5caddbc9( )
  • ETH 0.05 0x5caddbc9932d885c3fe3d7cdec9418aa469e3d50.CALL( )
    /*
     $$$$$$\                                 $$\               $$\   $$\                           $$\           
    $$  __$$\                                $$ |              $$ |  $$ |                          $$ |          
    $$ /  \__| $$$$$$\  $$\   $$\  $$$$$$\ $$$$$$\    $$$$$$\  $$ |  $$ | $$$$$$\  $$$$$$$\   $$$$$$$ | $$$$$$$\ 
    $$ |      $$  __$$\ $$ |  $$ |$$  __$$\\_$$  _|  $$  __$$\ $$$$$$$$ | \____$$\ $$  __$$\ $$  __$$ |$$  _____|
    $$ |      $$ |  \__|$$ |  $$ |$$ /  $$ | $$ |    $$ /  $$ |$$  __$$ | $$$$$$$ |$$ |  $$ |$$ /  $$ |\$$$$$$\  
    $$ |  $$\ $$ |      $$ |  $$ |$$ |  $$ | $$ |$$\ $$ |  $$ |$$ |  $$ |$$  __$$ |$$ |  $$ |$$ |  $$ | \____$$\ 
    \$$$$$$  |$$ |      \$$$$$$$ |$$$$$$$  | \$$$$  |\$$$$$$  |$$ |  $$ |\$$$$$$$ |$$ |  $$ |\$$$$$$$ |$$$$$$$  |
     \______/ \__|       \____$$ |$$  ____/   \____/  \______/ \__|  \__| \_______|\__|  \__| \_______|\_______/ 
                        $$\   $$ |$$ |                                                                           
                        \$$$$$$  |$$ |                                                                           
                         \______/ \__|                                                                      
    					 
    					 
    					 
    telegram: @cryptohands
    hashtag: #cryptohands
    */
    pragma solidity ^0.5.7;
    
    
    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;
      address public ownerWallet;
    
      constructor() public {
        owner = msg.sender;
        manager = msg.sender;
        ownerWallet = 0xd5E9F24607CA70910973dC2149f9B780f84d8839;
      }
    
      modifier onlyOwner() {
        require(msg.sender == owner, "only for owner");
        _;
      }
    
      modifier onlyOwnerOrManager() {
         require((msg.sender == owner)||(msg.sender == manager), "only for owner or manager");
          _;
      }
    
      function transferOwnership(address newOwner) public onlyOwner {
        owner = newOwner;
      }
    
      function setManager(address _manager) public onlyOwnerOrManager {
          manager = _manager;
      }
    }
    
    contract CryptoHands is Ownable {
    
        event regLevelEvent(address indexed _user, address indexed _referrer, uint _time);
        event buyLevelEvent(address indexed _user, uint _level, uint _time);
        event prolongateLevelEvent(address indexed _user, uint _level, uint _time);
        event getMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time);
        event lostMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time);
        //------------------------------
    
        mapping (uint => uint) public LEVEL_PRICE;
        uint REFERRER_1_LEVEL_LIMIT = 3;
        uint PERIOD_LENGTH = 365 days;
    
    
        struct UserStruct {
            bool isExist;
            uint id;
            uint referrerID;
            address[] referral;
            mapping (uint => uint) levelExpired;
        }
    
        mapping (address => UserStruct) public users;
        mapping (uint => address) public userList;
        uint public currUserID = 0;
    
    
    
    
        constructor() public {
    
            LEVEL_PRICE[1] = 0.05 ether;
            LEVEL_PRICE[2] = 0.15 ether;
            LEVEL_PRICE[3] = 0.45 ether;
            LEVEL_PRICE[4] = 1.35 ether;
            LEVEL_PRICE[5] = 4.05 ether;
            LEVEL_PRICE[6] = 12.15 ether;
            LEVEL_PRICE[7] = 36.45 ether;
            LEVEL_PRICE[8] = 109.35 ether;
    
            UserStruct memory userStruct;
            currUserID++;
    
            userStruct = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : 0,
                referral : new address[](0)
            });
            users[ownerWallet] = userStruct;
            userList[currUserID] = ownerWallet;
    
            users[ownerWallet].levelExpired[1] = 77777777777;
            users[ownerWallet].levelExpired[2] = 77777777777;
            users[ownerWallet].levelExpired[3] = 77777777777;
            users[ownerWallet].levelExpired[4] = 77777777777;
            users[ownerWallet].levelExpired[5] = 77777777777;
            users[ownerWallet].levelExpired[6] = 77777777777;
            users[ownerWallet].levelExpired[7] = 77777777777;
            users[ownerWallet].levelExpired[8] = 77777777777;
        }
    
        function () external payable {
    
            uint level;
    
            if(msg.value == LEVEL_PRICE[1]){
                level = 1;
            }else if(msg.value == LEVEL_PRICE[2]){
                level = 2;
            }else if(msg.value == LEVEL_PRICE[3]){
                level = 3;
            }else if(msg.value == LEVEL_PRICE[4]){
                level = 4;
            }else if(msg.value == LEVEL_PRICE[5]){
                level = 5;
            }else if(msg.value == LEVEL_PRICE[6]){
                level = 6;
            }else if(msg.value == LEVEL_PRICE[7]){
                level = 7;
            }else if(msg.value == LEVEL_PRICE[8]){
                level = 8;
            }else {
                revert('Incorrect Value send');
            }
    
            if(users[msg.sender].isExist){
                buyLevel(level);
            } else if(level == 1) {
                uint refId = 0;
                address referrer = bytesToAddress(msg.data);
    
                if (users[referrer].isExist){
                    refId = users[referrer].id;
                } else {
                    revert('Incorrect referrer');
                }
    
                regUser(refId);
            } else {
                revert("Please buy first level for 0.05 ETH");
            }
        }
    
        function regUser(uint _referrerID) public payable {
            require(!users[msg.sender].isExist, 'User exist');
    
            require(_referrerID > 0 && _referrerID <= currUserID, 'Incorrect referrer Id');
    
            require(msg.value==LEVEL_PRICE[1], 'Incorrect Value');
    
    
            if(users[userList[_referrerID]].referral.length >= REFERRER_1_LEVEL_LIMIT)
            {
                _referrerID = users[findFreeReferrer(userList[_referrerID])].id;
            }
    
    
            UserStruct memory userStruct;
            currUserID++;
    
            userStruct = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : _referrerID,
                referral : new address[](0)
            });
    
            users[msg.sender] = userStruct;
            userList[currUserID] = msg.sender;
    
            users[msg.sender].levelExpired[1] = now + PERIOD_LENGTH;
            users[msg.sender].levelExpired[2] = 0;
            users[msg.sender].levelExpired[3] = 0;
            users[msg.sender].levelExpired[4] = 0;
            users[msg.sender].levelExpired[5] = 0;
            users[msg.sender].levelExpired[6] = 0;
            users[msg.sender].levelExpired[7] = 0;
            users[msg.sender].levelExpired[8] = 0;
    
            users[userList[_referrerID]].referral.push(msg.sender);
    
            payForLevel(1, msg.sender);
    
            emit regLevelEvent(msg.sender, userList[_referrerID], now);
        }
    
        function buyLevel(uint _level) public payable {
            require(users[msg.sender].isExist, 'User not exist');
    
            require( _level>0 && _level<=8, 'Incorrect level');
    
            if(_level == 1){
                require(msg.value==LEVEL_PRICE[1], 'Incorrect Value');
                users[msg.sender].levelExpired[1] += PERIOD_LENGTH;
            } else {
                require(msg.value==LEVEL_PRICE[_level], 'Incorrect Value');
    
                for(uint l =_level-1; l>0; l-- ){
                    require(users[msg.sender].levelExpired[l] >= now, 'Buy the previous level');
                }
    
                if(users[msg.sender].levelExpired[_level] == 0){
                    users[msg.sender].levelExpired[_level] = now + PERIOD_LENGTH;
                } else {
                    users[msg.sender].levelExpired[_level] += PERIOD_LENGTH;
                }
            }
            payForLevel(_level, msg.sender);
            emit buyLevelEvent(msg.sender, _level, now);
        }
    
        function payForLevel(uint _level, address _user) internal {
    
            address referer;
            address referer1;
            address referer2;
            address referer3;
            if(_level == 1 || _level == 5){
                referer = userList[users[_user].referrerID];
            } else if(_level == 2 || _level == 6){
                referer1 = userList[users[_user].referrerID];
                referer = userList[users[referer1].referrerID];
            } else if(_level == 3 || _level == 7){
                referer1 = userList[users[_user].referrerID];
                referer2 = userList[users[referer1].referrerID];
                referer = userList[users[referer2].referrerID];
            } else if(_level == 4 || _level == 8){
                referer1 = userList[users[_user].referrerID];
                referer2 = userList[users[referer1].referrerID];
                referer3 = userList[users[referer2].referrerID];
                referer = userList[users[referer3].referrerID];
            }
    
            if(!users[referer].isExist){
                referer = userList[1];
            }
    
            if(users[referer].levelExpired[_level] >= now ){
                bool result;
                result = address(uint160(referer)).send(LEVEL_PRICE[_level]);
                emit getMoneyForLevelEvent(referer, msg.sender, _level, now);
            } else {
                emit lostMoneyForLevelEvent(referer, msg.sender, _level, now);
                payForLevel(_level,referer);
            }
        }
    
        function findFreeReferrer(address _user) public view returns(address) {
            if(users[_user].referral.length < REFERRER_1_LEVEL_LIMIT){
                return _user;
            }
    
            address[] memory referrals = new address[](363);
            referrals[0] = users[_user].referral[0]; 
            referrals[1] = users[_user].referral[1];
            referrals[2] = users[_user].referral[2];
    
            address freeReferrer;
            bool noFreeReferrer = true;
    
            for(uint i =0; i<363;i++){
                if(users[referrals[i]].referral.length == REFERRER_1_LEVEL_LIMIT){
                    if(i<120){
                        referrals[(i+1)*3] = users[referrals[i]].referral[0];
                        referrals[(i+1)*3+1] = users[referrals[i]].referral[1];
                        referrals[(i+1)*3+2] = users[referrals[i]].referral[2];
                    }
                }else{
                    noFreeReferrer = false;
                    freeReferrer = referrals[i];
                    break;
                }
            }
            require(!noFreeReferrer, 'No Free Referrer');
            return freeReferrer;
    
        }
    
        function viewUserReferral(address _user) public view returns(address[] memory) {
            return users[_user].referral;
        }
    
        function viewUserLevelExpired(address _user, uint _level) public view returns(uint) {
            return users[_user].levelExpired[_level];
        }
        function bytesToAddress(bytes memory bys) private pure returns (address  addr ) {
            assembly {
                addr := mload(add(bys, 20))
            }
        }
    }