ETH Price: $1,903.81 (-1.00%)

Transaction Decoder

Block:
9992469 at May-03-2020 09:46:20 AM +UTC
Transaction Fee:
0.000805647 ETH $1.53
Gas Used:
268,549 Gas / 3 Gwei

Emitted Events:

120 DoubleWay.getMoneyForLevelEvent( _user=0x9560b6421a534c3259f0d4d8bfcb765af1b5846e, _referral=[Sender] 0xd7c0f947d91914428292bfd1a838514089f5a161, _level=1, _time=1588499180 )
121 DoubleWay.regLevelEvent( _user=[Sender] 0xd7c0f947d91914428292bfd1a838514089f5a161, _referrer=0x9560b6421a534c3259f0d4d8bfcb765af1b5846e, _time=1588499180 )

Account State Difference:

  Address   Before After State Difference Code
(Spark Pool)
76.018441551594145118 Eth76.019247198594145118 Eth0.000805647
0x9560B642...AF1b5846e 0.001265453 Eth0.081265453 Eth0.08
0xA22c1B53...105562296
(Doubleway.io)
0xd7C0f947...089F5a161
0.092 Eth
Nonce: 0
0.011194353 Eth
Nonce: 1
0.080805647

Execution Trace

ETH 0.08 DoubleWay.5d4f1cf3( )
  • DoubleWay.getUserReferrer( _user=0x9560B6421A534c3259f0D4d8bfCb765AF1b5846e, _level=0 ) => ( 0x9560B6421A534c3259f0D4d8bfCb765AF1b5846e )
  • ETH 0.08 0x9560b6421a534c3259f0d4d8bfcb765af1b5846e.CALL( )
    /*
    
    |       \                     |  \      |  \          |  \  _  |  \                    
    | $$$$$$$\  ______   __    __ | $$____  | $$  ______  | $$ / \ | $$  ______   __    __ 
    | $$  | $$ /      \ |  \  |  \| $$    \ | $$ /      \ | $$/  $\| $$ |      \ |  \  |  \
    | $$  | $$|  $$$$$$\| $$  | $$| $$$$$$$\| $$|  $$$$$$\| $$  $$$\ $$  \$$$$$$\| $$  | $$
    | $$  | $$| $$  | $$| $$  | $$| $$  | $$| $$| $$    $$| $$ $$\$$\$$ /      $$| $$  | $$
    | $$__/ $$| $$__/ $$| $$__/ $$| $$__/ $$| $$| $$$$$$$$| $$$$  \$$$$|  $$$$$$$| $$__/ $$
    | $$    $$ \$$    $$ \$$    $$| $$    $$| $$ \$$     \| $$$    \$$$ \$$    $$ \$$    $$
     \$$$$$$$   \$$$$$$   \$$$$$$  \$$$$$$$  \$$  \$$$$$$$ \$$      \$$  \$$$$$$$ _\$$$$$$$
                                                                                 |  \__| $$
                                                                                  \$$    $$
                                                                                   \$$$$$$ 
    																			   
    
    Telegram Chat EN: @doublewaychat
    Telegram Chat CN: @doublewaychatCN
    Telegram Chat RU: @doublewaychatRU
    Telegram Chat ES: @doublewaychatES
    
    Telegram Channel: @doubleway
    Hashtag: #doubleway
    
    */
    
    pragma solidity ^0.5.14;
    
    contract DoubleWay  {
    
        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);
        event chUplineLogEvent(address indexed _chUpline, uint _idCh, uint _idDw);
    
        address ownerWallet = 0xd5E9F24607CA70910973dC2149f9B780f84d8839;//0x46B78099611d50e1b0d200Fb0d43e6B3dFBA81C7;//0xd5E9F24607CA70910973dC2149f9B780f84d8839;
    
        mapping (uint => uint) public LEVEL_PRICE;
        uint REFERRER_1_LEVEL_LIMIT = 2;
        uint PERIOD_LENGTH = 64 days;
        uint RENEWAL_NOT_EARLIER = 64 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;
    
        CryptoHands CRYPTO_HANDS = CryptoHands(0xA315bD2e3227C2ab71f1350644B01757EAFf9cb4);
        
        uint public START_TIME = 1576800000; //  Friday, 20 December 2019 г., 0:00:00
        uint public END_OF_PERIOD_1 = START_TIME + 1 days;
        uint public END_OF_PERIOD_2 = START_TIME + 2 days;
        uint public END_OF_PERIOD_3 = START_TIME + 3 days;
        uint public END_OF_PERIOD_4 = START_TIME + 5 days;
        uint public END_OF_PERIOD_5 = START_TIME + 8 days;
        uint public END_OF_PERIOD_6 = START_TIME + 13 days;
        uint public END_OF_PERIOD_7 = START_TIME + 21 days;
        
        uint public ID_OF_PERIOD_1 = 16;
        uint public ID_OF_PERIOD_2 = 32;
        uint public ID_OF_PERIOD_3 = 64;
        uint public ID_OF_PERIOD_4 = 128;
        uint public ID_OF_PERIOD_5 = 256;
        uint public ID_OF_PERIOD_6 = 512;
    
        
        modifier priorityRegistration() {
            require(now >= START_TIME, 'The time has not come yet');
            
            if(now <= END_OF_PERIOD_7){
                (bool isExist, uint256 id, uint256 referrerID)  = viewCHUser(msg.sender);
                
                require(isExist, 'You must be registered in CryptoHands');
                
                if(now > END_OF_PERIOD_6){
                   require( ( CRYPTO_HANDS.viewUserLevelExpired(msg.sender,1) > now ), 'You must be registered in CryptoHands'); 
                } else  if(now > END_OF_PERIOD_5){
                   require( ( id<=ID_OF_PERIOD_6 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,2) > now ), 'You must have level 2 in CryptoHands, or id <= 512'); 
                } else  if(now > END_OF_PERIOD_4){
                   require( ( id<=ID_OF_PERIOD_5 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,3) > now ), 'You must have level 3 in CryptoHands, or id <= 256'); 
                } else  if(now > END_OF_PERIOD_3){
                   require( ( id<=ID_OF_PERIOD_4 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,4) > now ), 'You must have level 4 in CryptoHands, or id <= 128'); 
                } else  if(now > END_OF_PERIOD_2){
                   require( ( id<=ID_OF_PERIOD_3 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,5) > now ), 'You must have level 5 in CryptoHands, or id <= 64'); 
                } else  if(now > END_OF_PERIOD_1){
                   require( ( id<=ID_OF_PERIOD_2 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,6) > now ), 'You must have level 6 in CryptoHands, or id <= 32'); 
                } else{
                   require( ( id<=ID_OF_PERIOD_1 || CRYPTO_HANDS.viewUserLevelExpired(msg.sender,7) > now ), 'You must have level 7 in CryptoHands, or id <= 16'); 
                } 
            }
    
            _;
        }
    
        constructor() public {
    
            LEVEL_PRICE[1] = 0.08 ether;
            LEVEL_PRICE[2] = 0.16 ether;
            LEVEL_PRICE[3] = 0.32 ether;
            LEVEL_PRICE[4] = 0.64 ether;
            LEVEL_PRICE[5] = 1.28 ether;
            LEVEL_PRICE[6] = 2.56 ether;
            LEVEL_PRICE[7] = 5.12 ether;
            LEVEL_PRICE[8] = 10.24 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 priorityRegistration(){
    
            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 {
                    (bool chIsExist, uint256 chId, uint256 chReferrerID)  = viewCHUser(msg.sender);
                    
                    if(chIsExist){
                        referrer =  findCHReferrer(chReferrerID);   
                        refId = users[referrer].id;
                    }else {
                        revert('Incorrect referrer');
                    }
                }
    
                regUser(refId);
            } else {
                revert("Please buy first level for 0.08 ETH");
            }
        }
    
        function regUser(uint _referrerID) internal {
    
            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[userList[_referrerID]].referral.push(msg.sender);
    
            payForLevel(1, msg.sender);
    
            emit regLevelEvent(msg.sender, userList[_referrerID], now);
        }
    
        function buyLevel(uint _level) internal {
            
            require(users[msg.sender].levelExpired[_level] < now + RENEWAL_NOT_EARLIER, 'The level has already been extended for a long time. Try later');
    
            if(_level == 1){
                users[msg.sender].levelExpired[1] += PERIOD_LENGTH;
            } else {
                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 referrer = getUserReferrer(_user, _level);
    
            if(!users[referrer].isExist){
                referrer = userList[1];
            }
    
            if(users[referrer].levelExpired[_level] >= now ){
                bool result;
                result = address(uint160(referrer)).send(LEVEL_PRICE[_level]);
                emit getMoneyForLevelEvent(referrer, msg.sender, _level, now);
            } else {
                emit lostMoneyForLevelEvent(referrer, msg.sender, _level, now);
                payForLevel(_level,referrer);
            }
        }
    
        function findFreeReferrer(address _user) public view returns(address) {
            if(users[_user].referral.length < REFERRER_1_LEVEL_LIMIT){
                return _user;
            }
    
            address[] memory referrals = new address[](2046);
            referrals[0] = users[_user].referral[0]; 
            referrals[1] = users[_user].referral[1];
    
            address freeReferrer;
            bool noFreeReferrer = true;
    
            for(uint i =0; i<2046;i++){
                if(users[referrals[i]].referral.length == REFERRER_1_LEVEL_LIMIT){
                    if(i<1022){
                        referrals[(i+1)*2] = users[referrals[i]].referral[0];
                        referrals[(i+1)*2+1] = users[referrals[i]].referral[1];
                    }
                }else{
                    noFreeReferrer = false;
                    freeReferrer = referrals[i];
                    break;
                }
            }
            require(!noFreeReferrer, 'No Free Referrer');
            return freeReferrer;
    
        }
        
        function getUserReferrer(address _user, uint _level) public view returns (address) {
          if (_level == 0 || _user == address(0)) {
            return _user;
          }
    
          return this.getUserReferrer(userList[users[_user].referrerID], _level - 1);
        }    
    
        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))
            }
        }
        
        function viewCHUser(address _user) public view returns (bool isExist, uint id,  uint referrerID) {
            return CRYPTO_HANDS.users(_user);
        }
    
        function viewCHLevelExpired(address _user, uint _level) public view returns (uint) {
            CRYPTO_HANDS.viewUserLevelExpired(_user,_level);
        }
        
        function findCHReferrer(uint _chUserId) internal returns(address) { //view
    
            address chReferrerAddress = CRYPTO_HANDS.userList(_chUserId);
            
            if(users[chReferrerAddress].isExist){
                emit chUplineLogEvent(chReferrerAddress, _chUserId, users[chReferrerAddress].id);
                return chReferrerAddress;
            } else{
                emit chUplineLogEvent(chReferrerAddress, _chUserId, 0);
                (bool chIsExist, uint256 chId, uint256 chReferrerID)  = viewCHUser(chReferrerAddress); 
                return findCHReferrer(chReferrerID);
            }
        }     
    }
    contract CryptoHands  {
        struct UserStruct {
            bool isExist;
            uint id;
            uint referrerID;
            address[] referral;
            mapping (uint => uint) levelExpired;
        }    
        
        mapping (address => UserStruct) public users;
        mapping (uint => address) public userList;
        function viewUserLevelExpired(address _user, uint _level) public view returns(uint);
        
    }