ETH Price: $2,174.79 (-10.29%)

Transaction Decoder

Block:
10072357 at May-15-2020 06:36:30 PM +UTC
Transaction Fee:
0.00200798 ETH $4.37
Gas Used:
100,399 Gas / 20 Gwei

Emitted Events:

95 Gida.getIntroducerMoneyForLevelEvent( _user=0xc44db3122c096f5ee0ca559a15e2ad0779f092d7, _referral=[Sender] 0xf6242be356a7f0fa668c631891d20c67f5be8e6e, _level=2, _time=1589567790, amount=45000000000000000 )
96 Gida.getMoneyForLevelEvent( _user=0x7c734d78a247a5ee3f9a64ce061db270a7cfef37, _referral=[Sender] 0xf6242be356a7f0fa668c631891d20c67f5be8e6e, _level=2, _time=1589567790, amount=9000000000000000 )
97 Gida.getMoneyForLevelEvent( _user=0x9c7a0d50a9005c0cf3d74dcd3bc42b39984c012e, _referral=[Sender] 0xf6242be356a7f0fa668c631891d20c67f5be8e6e, _level=2, _time=1589567790, amount=246000000000000000 )
98 Gida.buyLevelEvent( _user=[Sender] 0xf6242be356a7f0fa668c631891d20c67f5be8e6e, _level=2, _time=1589567790 )

Account State Difference:

  Address   Before After State Difference Code
(Coinotron 3)
110.57756340605502684 Eth110.57957138605502684 Eth0.00200798
0x7c734D78...0A7cFeF37 27.418 Eth27.427 Eth0.009
0x9c7A0d50...9984c012E 0.351112572 Eth0.597112572 Eth0.246
0xc44DB312...779F092d7 0.000151237903727033 Eth0.045151237903727033 Eth0.045
0xf6242be3...7F5bE8e6e
0.36296075612238164 Eth
Nonce: 1
0.06095277612238164 Eth
Nonce: 2
0.30200798
0xff0EFDD9...6d1f11eBF

Execution Trace

ETH 0.3 Gida.CALL( )
  • ETH 0.045 0xc44db3122c096f5ee0ca559a15e2ad0779f092d7.CALL( )
  • ETH 0.246 0x9c7a0d50a9005c0cf3d74dcd3bc42b39984c012e.CALL( )
  • ETH 0.009 0x7c734d78a247a5ee3f9a64ce061db270a7cfef37.CALL( )
    [Gida (ln:192)]
    /*
    telegram: @gida
    hashtag: #gida_corp
    */
    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 introducer;
      address public ownerWallet1;
      address public ownerWallet2;
      address public ownerWallet3;
    
      constructor() public {
        owner = msg.sender;
        manager = msg.sender;
        ownerWallet1 = 0x42910288DcD576aE8574D611575Dfe35D9fA2Aa2;
        ownerWallet2 = 0xc40A767980fe384BBc367A8A0EeFF2BCC871A6c9;
        ownerWallet3 = 0x7c734D78a247A5eE3f9A64cE061DB270A7cFeF37;
      }
    
      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 Gida is Ownable {
    
        event regLevelEvent(address indexed _user, address indexed _referrer, uint _time);
        event consoleEvent(uint _msg);
        event recoverPasswordEvent(address indexed _user, uint _time);
        event paymentRejectedEvent(string _message, address indexed _user);
        event buyLevelEvent(address indexed _user, uint _level, uint _time);
        event prolongateLevelEvent(address indexed _user, uint _level, uint _time);
        event getIntroducerMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time, uint amount);
        event getMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time, uint amount);
        event lostMoneyForLevelEvent(address indexed _user, address indexed _referral, uint _level, uint _time, uint amount);
        //------------------------------
    
        mapping (uint => uint) public LEVEL_PRICE;
        uint REFERRER_1_LEVEL_LIMIT = 3;
        uint RECOVER_PASSWORD = 0.01 ether;
        uint PERIOD_LENGTH = 90 days;
    
    
        struct UserStruct {
            bool isExist;
            uint id;
            uint referrerID;
            uint introducerID;
            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.12 ether;
    		LEVEL_PRICE[2] =  0.3 ether;
    		LEVEL_PRICE[3] =  1 ether;
    		LEVEL_PRICE[4] =  3 ether;
    		LEVEL_PRICE[5] =  10 ether;
    		LEVEL_PRICE[6] =  4 ether;
    		LEVEL_PRICE[7] =  11 ether;
    		LEVEL_PRICE[8] =  30 ether;
    		LEVEL_PRICE[9] =  90 ether;
    		LEVEL_PRICE[10] = 300 ether;
    		
            UserStruct memory userStruct1;
            UserStruct memory userStruct2;
            UserStruct memory userStruct3;
            currUserID++;
    
            userStruct1 = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : 0,
                introducerID : 0,
                referral : new address[](0)
            });
            users[ownerWallet1] = userStruct1;
            userList[currUserID] = ownerWallet1;
    
            users[ownerWallet1].levelExpired[1] = 77777777777;
            users[ownerWallet1].levelExpired[2] = 77777777777;
            users[ownerWallet1].levelExpired[3] = 77777777777;
            users[ownerWallet1].levelExpired[4] = 77777777777;
            users[ownerWallet1].levelExpired[5] = 77777777777;
            users[ownerWallet1].levelExpired[6] = 77777777777;
            users[ownerWallet1].levelExpired[7] = 77777777777;
            users[ownerWallet1].levelExpired[8] = 77777777777;
            users[ownerWallet1].levelExpired[9] = 77777777777;
            users[ownerWallet1].levelExpired[10] = 77777777777;
    		
            currUserID++;
    
            userStruct2 = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : 0,
                introducerID : 0,
                referral : new address[](0)
            });
            users[ownerWallet2] = userStruct2;
            userList[currUserID] = ownerWallet2;
    
            users[ownerWallet2].levelExpired[1] = 77777777777;
            users[ownerWallet2].levelExpired[2] = 77777777777;
            users[ownerWallet2].levelExpired[3] = 77777777777;
            users[ownerWallet2].levelExpired[4] = 77777777777;
            users[ownerWallet2].levelExpired[5] = 77777777777;
            users[ownerWallet2].levelExpired[6] = 77777777777;
            users[ownerWallet2].levelExpired[7] = 77777777777;
            users[ownerWallet2].levelExpired[8] = 77777777777;
            users[ownerWallet2].levelExpired[9] = 77777777777;
            users[ownerWallet2].levelExpired[10] = 77777777777;
    		
    		currUserID++;
    
            userStruct3 = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : 0,
                introducerID : 0,
                referral : new address[](0)
            });
            users[ownerWallet3] = userStruct3;
            userList[currUserID] = ownerWallet3;
    
            users[ownerWallet3].levelExpired[1] = 77777777777;
            users[ownerWallet3].levelExpired[2] = 77777777777;
            users[ownerWallet3].levelExpired[3] = 77777777777;
            users[ownerWallet3].levelExpired[4] = 77777777777;
            users[ownerWallet3].levelExpired[5] = 77777777777;
            users[ownerWallet3].levelExpired[6] = 77777777777;
            users[ownerWallet3].levelExpired[7] = 77777777777;
            users[ownerWallet3].levelExpired[8] = 77777777777;
            users[ownerWallet3].levelExpired[9] = 77777777777;
            users[ownerWallet3].levelExpired[10] = 77777777777;
        }
    
        function () external payable {
    
            uint level;
            uint passwordRecovery = 0;
    
            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 if(msg.value == LEVEL_PRICE[9]){
                level = 9;
            }else if(msg.value == LEVEL_PRICE[10]){
                level = 10;
            }else if(msg.value == RECOVER_PASSWORD){
                passwordRecovery = 1;
            }else {
    			emit paymentRejectedEvent('Incorrect Value send', msg.sender);
                revert('Incorrect Value send');
            }
    
            if(users[msg.sender].isExist){
    			if(passwordRecovery==1){
    				emit recoverPasswordEvent(msg.sender, now);
    			}else{
    				buyLevel(level);
    			}
            } else if(level == 1) {
    			if(passwordRecovery==0){
    				
    				uint refId = 0;
    				address referrer = bytesToAddress(msg.data);
    		
    				if (users[referrer].isExist){
    					refId = users[referrer].id;
    				} else {
    					emit paymentRejectedEvent('Incorrect referrer', msg.sender);
    					revert('Incorrect referrer');
    				}
    				regUser(refId);
    			}else{
    				emit paymentRejectedEvent('User does not exist to recover password.', msg.sender);
    				revert('User does not exist to recover password.');
    			}
            } else {
    			emit paymentRejectedEvent('Please buy first level for 0.12 ETH', msg.sender);
                revert('Please buy first level for 0.12 ETH');
            }
        }
    
        function regUser(uint _introducerID) public payable {
    	    uint _referrerID;
            require(!users[msg.sender].isExist, 'User exist');
    
            require(_introducerID > 0 && _introducerID <= currUserID, 'Incorrect referrer Id');
    
            require(msg.value==LEVEL_PRICE[1], 'Incorrect Value');
    
    		/* Default will be introducer, if 3 limit not reached */
    		_referrerID = _introducerID;
            if(users[userList[_introducerID]].referral.length >= REFERRER_1_LEVEL_LIMIT)
            {
                _referrerID = users[findFreeReferrer(userList[_introducerID])].id;
            }
    
    
            UserStruct memory userStruct;
            currUserID++;
    
            userStruct = UserStruct({
                isExist : true,
                id : currUserID,
                referrerID : _referrerID,
                introducerID : _introducerID,
                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[msg.sender].levelExpired[9] = 0;
            users[msg.sender].levelExpired[10] = 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<=10, '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;
            address referer4;
            if(_level == 1 || _level == 6){
                referer = userList[users[_user].referrerID];
            } else if(_level == 2 || _level == 7){
                referer1 = userList[users[_user].referrerID];
                referer = userList[users[referer1].referrerID];
            } else if(_level == 3 || _level == 8){
                referer1 = userList[users[_user].referrerID];
                referer2 = userList[users[referer1].referrerID];
                referer = userList[users[referer2].referrerID];
            } else if(_level == 4 || _level == 9){
                referer1 = userList[users[_user].referrerID];
                referer2 = userList[users[referer1].referrerID];
                referer3 = userList[users[referer2].referrerID];
                referer = userList[users[referer3].referrerID];
            } else if(_level == 5 || _level == 10){
                referer1 = userList[users[_user].referrerID];
                referer2 = userList[users[referer1].referrerID];
                referer3 = userList[users[referer2].referrerID];
                referer4 = userList[users[referer3].referrerID];
                referer = userList[users[referer4].referrerID];
            }
    		
    		introducer = userList[users[msg.sender].introducerID];
    		
    		/* Split amount and send comission to admins */
    		uint level;
    		uint introducerlevel;
    		uint firstAdminPart;
    		uint finalToAdmin;
    		uint introducerPart;
    		uint refererPart;
    		bool result;
    		
    		level	=	_level;
    		
    		if(_level==1){
    			introducerPart 			=	0.02 ether; /* introducer will get 0.02*/
    			refererPart 			=	0.1 ether; /* remaining 0.1 will go to referer*/
    			
    		}else{
    			firstAdminPart 			=	(msg.value * 3)/100; /* 3% will go to admin*/
    			introducerPart 			=	(msg.value * 15)/100; /* introducer will get 15%*/
    			refererPart 			=	msg.value - (firstAdminPart + introducerPart); /* remaining 82% will go to referer*/
    		}
    		
    		introducerlevel	=	0;
    		
    		for(uint l = _level; l <= 10; l++ ){
    			if(users[introducer].levelExpired[l] >= now){
    				introducerlevel	=	l;
    				break;
    			}
    		}
    		
            if(!users[referer].isExist){
    			finalToAdmin	=	msg.value;
    			if(users[introducer].isExist && _level>1){
    				
    				if(introducerlevel >= _level){
    					if(userList[1] != introducer && userList[2] != introducer){
    						result = address(uint160(introducer)).send(introducerPart);
    						finalToAdmin	=	finalToAdmin-introducerPart;
    					}
    				}else{
    					firstAdminPart	=	firstAdminPart+introducerPart;
    				}
    				transferToAdmin3(firstAdminPart, msg.sender, level);
    				finalToAdmin	=	finalToAdmin-firstAdminPart;
    			}
    			/* If referer not exist then transfer amount to admins */
    			transferToAdmins(finalToAdmin, msg.sender, level);
            }else{
    			
    			/* Admins are referer */
    			if(userList[1]==referer || userList[2]==referer ){
    				finalToAdmin	=	msg.value;
    				if(users[introducer].isExist && _level>1){
    					
    					if(introducerlevel >= _level){
    						if(userList[1] != introducer && userList[2] != introducer){
    							result = address(uint160(introducer)).send(introducerPart);
    							finalToAdmin	=	finalToAdmin-introducerPart;
    						}
    					}else{
    						firstAdminPart	=	firstAdminPart+introducerPart;
    					}
    					transferToAdmin3(firstAdminPart, msg.sender, level);
    					finalToAdmin	=	finalToAdmin-firstAdminPart;
    				}
    				/* If referer not exist then transfer amount to admins */
    				transferToAdmins(finalToAdmin, msg.sender, level);
    			}else{
    				
    				if(users[referer].levelExpired[level] >= now ){
    					
    					if(level>1){
    						if(introducerlevel >= level){
    							result = address(uint160(introducer)).send(introducerPart);
    							emit getIntroducerMoneyForLevelEvent(introducer, msg.sender, level, now, introducerPart);
    						}else{
    							firstAdminPart	=	firstAdminPart+introducerPart;
    						}
    						result = address(uint160(referer)).send(refererPart);
    						transferToAdmin3(firstAdminPart, msg.sender, level);
    						emit getMoneyForLevelEvent(referer, msg.sender, level, now, refererPart);
    					}else{
    						result 		= 	address(uint160(introducer)).send(introducerPart);
    						emit getIntroducerMoneyForLevelEvent(introducer, msg.sender, level, now, introducerPart);
    						result 		= 	address(uint160(referer)).send(refererPart);
    						emit getMoneyForLevelEvent(referer, msg.sender, level, now, refererPart);
    					}
    				} else {
    					emit lostMoneyForLevelEvent(referer, msg.sender, level, now, refererPart);
    					payForLevel(level,referer);
    				}
    			}
    		}
        }
    	
    	function transferToAdmins(uint amount, address _sender, uint _level) public payable returns(bool) {
    		
    		uint firstPart;
    		uint secondPart;
    		
    		firstPart 	=	(amount*70)/100; /* 70% will go to first admin*/
    		secondPart =	amount-firstPart; /* remaining 30% will go to second admin*/
    		transferToAdmin1(firstPart, _sender, _level);
    		transferToAdmin2(secondPart, _sender, _level);
    		return true;
    	}
    	
    	function transferToAdmin1(uint amount, address _sender, uint _level) public payable returns(bool) {
    		address admin1;
    		bool result1;
    		admin1 = userList[1];
    		result1 = address(uint160(admin1)).send(amount);
    		emit getMoneyForLevelEvent(admin1, _sender, _level, now, amount);
    		return result1;
    	}
    	
    	function transferToAdmin2(uint amount, address _sender, uint _level) public payable returns(bool) {
    		address admin2;
    		bool result2;
    		admin2 = userList[2];
    		result2 = address(uint160(admin2)).send(amount);
    		emit getMoneyForLevelEvent(admin2, _sender, _level, now, amount);
    		return result2;
    	}
    	
    	function transferToAdmin3(uint amount, address _sender, uint _level) public payable returns(bool) {
    		address admin2;
    		bool result2;
    		admin2 = userList[3];
    		result2 = address(uint160(admin2)).send(amount);
    		emit getMoneyForLevelEvent(admin2, _sender, _level, now, amount);
    		return result2;
    	}
    
        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))
            }
        }
    }