ETH Price: $2,247.90 (-1.75%)

Transaction Decoder

Block:
8634276 at Sep-28-2019 01:09:25 AM +UTC
Transaction Fee:
0.00261644 ETH $5.88
Gas Used:
130,822 Gas / 20 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x01EaCc3A...dAc11628C
(FairWin.me)
41,341.721357 Eth41,330.721357 Eth11
(Mining Express)
6.575060995785340517 Eth6.577677435785340517 Eth0.00261644
0xe722b531...4Db37e204
0.673700854 Eth
Nonce: 1
11.671084414 Eth
Nonce: 2
10.99738356

Execution Trace

FairWin.userWithDraw( userAddress=0xe722b531F93Ad35EB81A0a65FB40fEE4Db37e204 )
  • UtilFairWin.getlevel( value=0 ) => ( 0 )
  • UtilFairWin.getLineLevel( value=0 ) => ( 0 )
  • ETH 11 0xe722b531f93ad35eb81a0a65fb40fee4db37e204.CALL( )
    File 1 of 2: FairWin
    pragma solidity ^0.4.24;
    
    contract UtilFairWin  {
       
        /* fairwin.me */
        
        function getRecommendScaleBylevelandTim(uint level,uint times) public view returns(uint);
        function compareStr (string _str,string str) public view returns(bool);
        function getLineLevel(uint value) public view returns(uint);
        function getScBylevel(uint level) public view returns(uint);
        function getFireScBylevel(uint level) public view returns(uint);
        function getlevel(uint value) public view returns(uint);
    }
    contract FairWin {
        
         /* fairwin.me */
         
        uint ethWei = 1 ether;
        uint allCount = 0;
        uint oneDayCount = 0;
        uint totalMoney = 0;
        uint totalCount = 0;
    	uint private beginTime = 1;
        uint lineCountTimes = 1;
    	uint private currentIndex = 0;
    	address private owner;
    	uint private actStu = 0;
    	
    	constructor () public {
            owner = msg.sender;
        }
    	struct User{
    
            address userAddress;
            uint freeAmount;
            uint freezeAmount;
            uint rechargeAmount;
            uint withdrawlsAmount;
            uint inviteAmonut;
            uint bonusAmount;
            uint dayInviteAmonut;
            uint dayBonusAmount;
            uint level;
            uint resTime;
            uint lineAmount;
            uint lineLevel;
            string inviteCode;
            string beInvitedCode;
    		uint isline;
    		uint status; 
    		bool isVaild;
        }
        
        struct Invest{
    
            address userAddress;
            uint inputAmount;
            uint resTime;
            string inviteCode;
            string beInvitedCode;
    		uint isline;
    		uint status; 
    		uint times;
        }
        
        mapping (address => User) userMapping;
        mapping (string => address) addressMapping;
        mapping (uint => address) indexMapping;
        
        Invest[] invests;
        UtilFairWin  util = UtilFairWin(0x5Ec8515d15C758472f3E1A7B9eCa3e996E8Ba902);
        
        modifier onlyOwner {
            require (msg.sender == owner, "OnlyOwner methods called by non-owner.");
            _;
        }
        
        function () public payable {
        }
        
         function invest(address userAddress ,uint inputAmount,string  inviteCode,string  beInvitedCode) public payable{
            
            userAddress = msg.sender;
      		inputAmount = msg.value;
            uint lineAmount = inputAmount;
            
            if(!getUserByinviteCode(beInvitedCode)){
                userAddress.transfer(msg.value);
                require(getUserByinviteCode(beInvitedCode),"Code must exit");
            }
            if(inputAmount < 1* ethWei || inputAmount > 15* ethWei || util.compareStr(inviteCode,"")){
                 userAddress.transfer(msg.value);
                    require(inputAmount >= 1* ethWei && inputAmount <= 15* ethWei && !util.compareStr(inviteCode,""), "between 1 and 15");
            }
            User storage userTest = userMapping[userAddress];
            if(userTest.isVaild && userTest.status != 2){
                if((userTest.lineAmount + userTest.freezeAmount + lineAmount)> (15 * ethWei)){
                    userAddress.transfer(msg.value);
                    require((userTest.lineAmount + userTest.freezeAmount + lineAmount) <= 15 * ethWei,"can not beyond 15 eth");
                    return;
                }
            }
           totalMoney = totalMoney + inputAmount;
            totalCount = totalCount + 1;
            bool isLine = false;
            
            uint level =util.getlevel(inputAmount);
            uint lineLevel = util.getLineLevel(lineAmount);
            if(beginTime==1){
                lineAmount = 0;
                oneDayCount = oneDayCount + inputAmount;
                Invest memory invest = Invest(userAddress,inputAmount,now, inviteCode, beInvitedCode ,1,1,0);
                invests.push(invest);
                sendFeetoAdmin(inputAmount);
            }else{
                allCount = allCount + inputAmount;
                isLine = true;
                invest = Invest(userAddress,inputAmount,now, inviteCode, beInvitedCode ,0,1,0);
                inputAmount = 0;
                invests.push(invest);
            }
              User memory user = userMapping[userAddress];
                if(user.isVaild && user.status == 1){
                    user.freezeAmount = user.freezeAmount + inputAmount;
                    user.rechargeAmount = user.rechargeAmount + inputAmount;
                    user.lineAmount = user.lineAmount + lineAmount;
                    level =util.getlevel(user.freezeAmount);
                    lineLevel = util.getLineLevel(user.freezeAmount + user.freeAmount +user.lineAmount);
                    user.level = level;
                    user.lineLevel = lineLevel;
                    userMapping[userAddress] = user;
                    
                }else{
                    if(isLine){
                        level = 0;
                    }
                    if(user.isVaild){
                       inviteCode = user.inviteCode;
                       beInvitedCode = user.beInvitedCode;
                    }
                    user = User(userAddress,0,inputAmount,inputAmount,0,0,0,0,0,level,now,lineAmount,lineLevel,inviteCode, beInvitedCode ,1,1,true);
                    userMapping[userAddress] = user;
                    
                    indexMapping[currentIndex] = userAddress;
                    currentIndex = currentIndex + 1;
                }
                address  userAddressCode = addressMapping[inviteCode];
                if(userAddressCode == 0x0000000000000000000000000000000000000000){
                    addressMapping[inviteCode] = userAddress;
                }
            
        }
         
          function remedy(address userAddress ,uint freezeAmount,string  inviteCode,string  beInvitedCode ,uint freeAmount,uint times) public {
            require(actStu == 0,"this action was closed");
            freezeAmount = freezeAmount * ethWei;
            freeAmount = freeAmount * ethWei;
            uint level =util.getlevel(freezeAmount);
            uint lineLevel = util.getLineLevel(freezeAmount + freeAmount);
            if(beginTime==1 && freezeAmount > 0){
                Invest memory invest = Invest(userAddress,freezeAmount,now, inviteCode, beInvitedCode ,1,1,times);
                invests.push(invest);
            }
              User memory user = userMapping[userAddress];
                if(user.isVaild){
                    user.freeAmount = user.freeAmount + freeAmount;
                    user.freezeAmount = user.freezeAmount +  freezeAmount;
                    user.rechargeAmount = user.rechargeAmount + freezeAmount +freezeAmount;
                    user.level =util.getlevel(user.freezeAmount);
                    user.lineLevel = util.getLineLevel(user.freezeAmount + user.freeAmount +user.lineAmount);
                    userMapping[userAddress] = user;
                }else{
                    user = User(userAddress,freeAmount,freezeAmount,freeAmount+freezeAmount,0,0,0,0,0,level,now,0,lineLevel,inviteCode, beInvitedCode ,1,1,true);
                    userMapping[userAddress] = user;
                    
                    indexMapping[currentIndex] = userAddress;
                    currentIndex = currentIndex + 1;
                }
                address  userAddressCode = addressMapping[inviteCode];
                if(userAddressCode == 0x0000000000000000000000000000000000000000){
                    addressMapping[inviteCode] = userAddress;
                }
            
        }
         
        function userWithDraw(address userAddress) public{
            bool success = false;
            require (msg.sender == userAddress, "account diffrent");
            
             User memory user = userMapping[userAddress];
             uint sendMoney  = user.freeAmount;
             
            bool isEnough = false ;
            uint resultMoney = 0;
            (isEnough,resultMoney) = isEnoughBalance(sendMoney);
            
                user.withdrawlsAmount =user.withdrawlsAmount + resultMoney;
                user.freeAmount = user.freeAmount - resultMoney;
                user.level = util.getlevel(user.freezeAmount);
                user.lineLevel = util.getLineLevel(user.freezeAmount + user.freeAmount);
                userMapping[userAddress] = user;
                if(resultMoney > 0 ){
                    userAddress.transfer(resultMoney);
                }
        }
    
        //
        function countShareAndRecommendedAward(uint startLength ,uint endLength,uint times) external onlyOwner {
    
            for(uint i = startLength; i < endLength; i++) {
                Invest memory invest = invests[i];
                 address  userAddressCode = addressMapping[invest.inviteCode];
                User memory user = userMapping[userAddressCode];
                if(invest.isline==1 && invest.status == 1 && now < (invest.resTime + 5 days) && invest.times <5){
                 invests[i].times = invest.times + 1;
                   uint scale = util.getScBylevel(user.level);
                    user.dayBonusAmount =user.dayBonusAmount + scale*invest.inputAmount/1000;
                    user.bonusAmount = user.bonusAmount + scale*invest.inputAmount/1000;
                    userMapping[userAddressCode] = user;
                   
                }else if(invest.isline==1 && invest.status == 1 && ( now >= (invest.resTime + 5 days) || invest.times >= 5 )){
                    invests[i].status = 2;
                    user.freezeAmount = user.freezeAmount - invest.inputAmount;
                    user.freeAmount = user.freeAmount + invest.inputAmount;
                    user.level = util.getlevel(user.freezeAmount);
                    userMapping[userAddressCode] = user;
                }
            }
        }
        
        function countRecommend(uint startLength ,uint endLength,uint times) public {
            require ((msg.sender == owner || msg.sender == 0xa0fEE185742f6C257bf590f1Bb29aC2B18257069 || msg.sender == 0x9C09Edc8c34192183c6222EFb4BC3BA2cC1FA5Fd
                    || msg.sender == 0x56E8cA06E849FA7db60f8Ffb0DD655FDD3deb17a || msg.sender == 0x4B8C5cec33A3A54f365a165b9AdAA01A9F377A7E || msg.sender == 0x25c5981E71CF1063C6Fc8b6F03293C03A153180e
                    || msg.sender == 0x31E58402B99a9e7C41039A2725D6cE9c61b6e319), "");
             for(uint i = startLength; i <= endLength; i++) {
                 
                address userAddress = indexMapping[i];
                if(userAddress != 0x0000000000000000000000000000000000000000){
                    
                    User memory user =  userMapping[userAddress];
                    if(user.status == 1 && user.freezeAmount >= 1 * ethWei){
                        uint scale = util.getScBylevel(user.level);
                        execute(user.beInvitedCode,1,user.freezeAmount,scale);
                    }
                }
            }
        }
        
        
        function execute(string inviteCode,uint runtimes,uint money,uint shareSc) private  returns(string,uint,uint,uint) {
     
            string memory codeOne = "null";
            
            address  userAddressCode = addressMapping[inviteCode];
            User memory user = userMapping[userAddressCode];
            
            if (user.isVaild && runtimes <= 25){
                codeOne = user.beInvitedCode;
                  if(user.status == 1){
                      
                      uint fireSc = util.getFireScBylevel(user.lineLevel);
                      uint recommendSc = util.getRecommendScaleBylevelandTim(user.lineLevel,runtimes);
                      uint moneyResult = 0;
                      
                      if(money <= (user.freezeAmount+user.lineAmount+user.freeAmount)){
                          moneyResult = money;
                      }else{
                          moneyResult = user.freezeAmount+user.lineAmount+user.freeAmount;
                      }
                      
                      if(recommendSc != 0){
                          user.dayInviteAmonut =user.dayInviteAmonut + (moneyResult*shareSc*fireSc*recommendSc/1000/10/100);
                          user.inviteAmonut = user.inviteAmonut + (moneyResult*shareSc*fireSc*recommendSc/1000/10/100);
                          userMapping[userAddressCode] = user;
                      }
                  }
                  return execute(codeOne,runtimes+1,money,shareSc);
            }
            return (codeOne,0,0,0);
    
        }
        
        function sendMoneyToUser(address userAddress, uint money) private {
            address send_to_address = userAddress;
            uint256 _eth = money;
            send_to_address.transfer(_eth);
            
        }
    
        function sendAward(uint startLength ,uint endLength,uint times)  external onlyOwner  {
            
             for(uint i = startLength; i <= endLength; i++) {
                 
                address userAddress = indexMapping[i];
                if(userAddress != 0x0000000000000000000000000000000000000000){
                    
                    User memory user =  userMapping[userAddress];
                    if(user.status == 1){
                        uint sendMoney =user.dayInviteAmonut + user.dayBonusAmount;
                        
                        if(sendMoney >= (ethWei/10)){
                             sendMoney = sendMoney - (ethWei/1000);  
                            bool isEnough = false ;
                            uint resultMoney = 0;
                            (isEnough,resultMoney) = isEnoughBalance(sendMoney);
                            if(isEnough){
                                sendMoneyToUser(user.userAddress,resultMoney);
                                //
                                user.dayInviteAmonut = 0;
                                user.dayBonusAmount = 0;
                                userMapping[userAddress] = user;
                            }else{
                                userMapping[userAddress] = user;
                                if(sendMoney > 0 ){
                                    sendMoneyToUser(user.userAddress,resultMoney);
                                    user.dayInviteAmonut = 0;
                                    user.dayBonusAmount = 0;
                                    userMapping[userAddress] = user;
                                }
                            }
                        }
                    }
                }
            }
        }
    
        function isEnoughBalance(uint sendMoney) private view returns (bool,uint){
            
            if(this.balance > 0 ){
                 if(sendMoney >= this.balance){
                    if((this.balance ) > 0){
                        return (false,this.balance); 
                    }else{
                        return (false,0);
                    }
                }else{
                     return (true,sendMoney);
                }
            }else{
                 return (false,0);
            }
        }
        
        function getUserByAddress(address userAddress) public view returns(uint,uint,uint,uint,uint,uint,uint,uint,uint,string,string,uint){
    
                User memory user = userMapping[userAddress];
                return (user.lineAmount,user.freeAmount,user.freezeAmount,user.inviteAmonut,
                user.bonusAmount,user.lineLevel,user.status,user.dayInviteAmonut,user.dayBonusAmount,user.inviteCode,user.beInvitedCode,user.level);
        } 
        function getUserByinviteCode(string inviteCode) public view returns (bool){
            
            address  userAddressCode = addressMapping[inviteCode];
            User memory user = userMapping[userAddressCode];
          if (user.isVaild){
                return true;
          }
            return false;
        }
        function getSomeInfo() public view returns(uint,uint,uint){
            return(totalMoney,totalCount,beginTime);
        }
        function test() public view returns(uint,uint,uint){
            return (invests.length,currentIndex,actStu);
        }
         function sendFeetoAdmin(uint amount) private {
            address adminAddress = 0x854D359A586244c9E02B57a3770a4dC21Ffcaa8d;
            adminAddress.transfer(amount/25);
        }
        function closeAct()  external onlyOwner {
            actStu = 1;
        }
    }

    File 2 of 2: UtilFairWin
    pragma solidity ^0.4.24;
    
    contract UtilFairWin  {
        uint ethWei = 1 ether;
        //getlevel
        function getlevel(uint value) public view returns(uint){
            if(value>=1*ethWei && value<=5*ethWei){
                return 1;
            }if(value>=6*ethWei && value<=10*ethWei){
                return 2;
            }if(value>=11*ethWei && value<=15*ethWei){
                return 3;
            }
                return 0;
        }
        //getLinelevel
        function getLineLevel(uint value) public view returns(uint){
            if(value>=1*ethWei && value<=5*ethWei){
                return 1;
            }if(value>=6*ethWei && value<=10*ethWei){
                return 2;
            }if(value>=11*ethWei){
                return 3;
            }
        }
        
        //level-commend  /1000
        function getScBylevel(uint level) public view returns(uint){
            if(level == 1){ 
                return 5;
            }if(level == 2){
                return 7;
            }if(level == 3) {
                return 10;
            }
            return 0;
        }
        
        //level fire scale   /10
        function getFireScBylevel(uint level) public view returns(uint){
            if(level == 1){
                return 3;
            }if(level == 2){
                return 6;
            }if(level == 3) {
                return 10;
            }return 0;
        }
        
        //level and times => invite scale /100
        function getRecommendScaleBylevelandTim(uint level,uint times) public view returns(uint){
            if(level == 1 && times == 1){ 
                return 50;
            }if(level == 2 && times == 1){
                return 70;
            }if(level == 2 && times == 2){
                return 50;
            }if(level == 3) {
                if(times == 1){
                    return 100;
                }if(times == 2){
                    return 70;
                }if(times == 3){
                    return 50;
                }if(times >= 4 && times <= 10){
                    return 10;
                }if(times >= 11 && times <= 20){
                    return 5;
                }if(times >= 21){
                    return 1;
                }
            } return 0;
        }
        
        function compareStr (string _str,string str) public view returns(bool) {
             bool checkResult = false;
            if(keccak256(abi.encodePacked(_str)) == keccak256(abi.encodePacked(str))) {
                checkResult = true;
            }
            return checkResult;
        }
    }