ETH Price: $2,430.09 (-0.67%)

Transaction Decoder

Block:
11160049 at Oct-30-2020 07:30:19 PM +UTC
Transaction Fee:
0.00388635 ETH $9.44
Gas Used:
77,727 Gas / 50 Gwei

Emitted Events:

15 DoubleWay.getMoneyForLevelEvent( _user=0xae18a59718c75e8a84dfa68d781682ebc4bea5dd, _referral=[Sender] 0x139e8ba366b5831b15125da5ad8fc8006fb6d3c4, _level=3, _time=1604086219 )
16 DoubleWay.buyLevelEvent( _user=[Sender] 0x139e8ba366b5831b15125da5ad8fc8006fb6d3c4, _level=3, _time=1604086219 )

Account State Difference:

  Address   Before After State Difference Code
0x139e8ba3...06fb6d3C4
0.34 Eth
Nonce: 4
0.01611365 Eth
Nonce: 5
0.32388635
(Nanopool)
2,861.449255802394966166 Eth2,861.453142152394966166 Eth0.00388635
0xA22c1B53...105562296
(Doubleway.io)
0xAe18a597...Bc4bEa5Dd 0 Eth0.32 Eth0.32

Execution Trace

ETH 0.32 DoubleWay.CALL( )
  • DoubleWay.getUserReferrer( _user=0xf6e726a6300b53A91bd624db78104e947a66EEF6, _level=2 ) => ( 0xAe18a59718c75e8A84Dfa68d781682EBc4bEa5Dd )
    • DoubleWay.getUserReferrer( _user=0xB1539872Cc2F23299061aB42d4b11B4DB4dAb6Bc, _level=1 ) => ( 0xAe18a59718c75e8A84Dfa68d781682EBc4bEa5Dd )
      • DoubleWay.getUserReferrer( _user=0xAe18a59718c75e8A84Dfa68d781682EBc4bEa5Dd, _level=0 ) => ( 0xAe18a59718c75e8A84Dfa68d781682EBc4bEa5Dd )
      • ETH 0.32 0xae18a59718c75e8a84dfa68d781682ebc4bea5dd.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);
            
        }