ETH Price: $2,508.74 (-0.82%)

Transaction Decoder

Block:
10525063 at Jul-24-2020 10:57:11 PM +UTC
Transaction Fee:
0.00170872 ETH $4.29
Gas Used:
27,560 Gas / 62 Gwei

Account State Difference:

  Address   Before After State Difference Code
0xb59A0686...d26dD0389
0.070849442863610218 Eth
Nonce: 50
0.120140722863610218 Eth
Nonce: 51
0.04929128
(Ethermine)
1,157.982802339871035257 Eth1,157.984511059871035257 Eth0.00170872
0xf75edFfE...d70bE0138
(399energy.com)
1,226.182800036366939584 Eth1,226.131800036366939584 Eth0.051

Execution Trace

ENERGY.CALL( )
  • ETH 0.051 0xb59a0686e946f99cdc11d8c72da2a7bd26dd0389.CALL( )
    pragma solidity 0.4.26;
    
    library SafeMath {
        
        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
    
            return c;
        }
        
        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            return sub(a, b, "SafeMath: subtraction overflow");
        }
        function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b <= a, errorMessage);
            uint256 c = a - b;
    
            return c;
        }
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            if (a == 0) {
                return 0;
            }
    
            uint256 c = a * b;
            require(c / a == b, "SafeMath: multiplication overflow");
    
            return c;
        }
    
        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            return div(a, b, "SafeMath: division by zero");
        }
        function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b > 0, errorMessage);
            uint256 c = a / b;
            return c;
        }
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            return mod(a, b, "SafeMath: modulo by zero");
        }
        function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
            require(b != 0, errorMessage);
            return a % b;
        }
    }
    
    contract ENERGY  {
        
        using SafeMath for *;
        uint256 public id;
        uint256 public deposit;
        address private owner;
    
        struct AddressList{
            uint256 id;
            address user;
        }
        
        struct Account {
        address referrer;
        uint256 joinCount;
        uint256 referredCount;
        uint256 depositTotal;
        uint256 joinDate;
        uint256 withdrawHis;
        uint256 currentCReward;
        uint256 currentCUpdatetime;
        uint256 championReward;
        uint256 cWithdrawTime;
        uint256 isAdminAccount;
        }
        
        struct CheckIn{
        address user;
        uint256 totalCheck;
        uint256 amt;
        uint256 checkTime;
        uint256 dynamic;
        }
    
        struct Limit{
            uint256 special;
        }
        
        struct RewardWinner{
        uint256 winId;
        uint256 time;
        address winner;
        uint256 totalRefer;
        uint256 winPayment;
        }
        
        mapping (address => uint256) public balanceOf;
        mapping (uint256 => RewardWinner) internal rewardHistory;
        mapping (address => Account) public accounts;
        mapping (address => CheckIn) public loginCount;
        mapping (uint256 => AddressList) public idList;
        mapping (address => AddressList) public userList;
        mapping (address => Limit) public limitList;
        
        event RegisteredReferer(address referee, address referrer);
        event RegisteredRefererRejoin(address referee, address referrer);
        event RegisteredRefererFailed(address referee, address referrer);
        event OwnerSet(address indexed oldOwner, address indexed newOwner);
        
        modifier onlyOwner() {
            require(msg.sender == owner, "Caller is not owner");
            _;
        }
        
        modifier isNotRegister(address _user) {
            require(userList[_user].user==address(0), "Address registered!");
            _;
        }
        
        modifier isCorrectAddress(address _user) {
            require(_user !=address(0), "Invalid Address!");
            _;
        }
        
        modifier isNotReferrer(address currentUser,address user) {
            require(currentUser !=user, "Referrer cannot register as its own Referee");
           
            _;
        }
        modifier hasReferrer(address _user) {
            require(accounts[_user].referrer !=address(0), "Referee has registered!");
            _;
        }
        
        modifier isRegister(address _user) {
            require(userList[_user].user!=address(0), "Address not register!");
            _;
        }
        
        modifier hasDepositTotal(address _user) {
            require(accounts[_user].depositTotal>=0.5 ether, "No Deposit!");
            _;
        }
        
        modifier hasCReward() {
            require(accounts[msg.sender].currentCReward>0, "No Champion Reward!");
            _;
        }
        constructor() public {
            owner = msg.sender;
            emit OwnerSet(address(0), owner);
        }
        
        function() external payable {
            require(accounts[msg.sender].joinCount<0,"Invalid Join");
            revert();
        }
        
        function newReg(address referrer) public 
        isCorrectAddress(msg.sender) isRegister(referrer) isNotReferrer(msg.sender,referrer) 
        payable returns (bool){
              require(checkJoinAmt(msg.sender,msg.value),"Invalid participation deposit");
        if(checkJoinCount(msg.sender)==0 && checkJoinAmt(msg.sender,msg.value)){
              require(userList[msg.sender].user==address(0), "User registered!");
              deposit=deposit.add(msg.value);
              accounts[msg.sender].joinCount=checkJoinCount(msg.sender);
              accounts[msg.sender].referrer = referrer;
              accounts[msg.sender].depositTotal = msg.value;
              accounts[referrer].referredCount = accounts[referrer].referredCount.add(1);
              accounts[msg.sender].joinDate=getTime();
              id++;
              userList[msg.sender].id = id;
              userList[msg.sender].user=msg.sender;
              idList[id].id = id;
              idList[id].user=msg.sender;
              loginCount[msg.sender].user=msg.sender;
              emit RegisteredReferer(msg.sender, referrer);
              return true;
        }else if(checkJoinCount(msg.sender)>=1 && checkJoinAmt(msg.sender,msg.value)){
              require(userList[msg.sender].user!=address(0), "User not yet registered!");
              deposit=deposit.add(msg.value);
                accounts[msg.sender].joinCount=checkJoinCount(msg.sender);
                accounts[msg.sender].withdrawHis=0;
                accounts[msg.sender].depositTotal=msg.value;
                accounts[msg.sender].joinDate = getTime();
                loginCount[msg.sender].checkTime=0;
                loginCount[msg.sender].dynamic=0;
                emit RegisteredRefererRejoin(msg.sender, referrer);
                return true;
        }else{
            emit RegisteredRefererFailed(msg.sender, referrer);
            require(accounts[msg.sender].joinCount<0,"Invalid Join!");
            return false;
            }
        }
        function checkIn() public hasDepositTotal(msg.sender) {
            uint256 day1=checktime();
            uint256 amount=payfixeduser(day1);
            require(amount>0,"Already Check In");
            uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
              uint256 total=amount+loginCount[msg.sender].dynamic;
              if((total+loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)>multi)
              {
                  total=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis;
              }
              loginCount[msg.sender].checkTime=checkTimeExtra();
              loginCount[msg.sender].dynamic=0;
              loginCount[msg.sender].amt=loginCount[msg.sender].amt.add(total);
               paydynamicparent(day1);
        }
          
        function checkInspecial() public hasDepositTotal(msg.sender){
              uint256 day1=checktime();
            uint256 amount=payfixeduser(day1);
            require(amount>0,"Already Check In");
            uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
              uint256 total=amount+limitdynamic(day1);
              if((total+loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)>multi)
              {
                  total=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis;
              }
              loginCount[msg.sender].checkTime=checkTimeExtra();
              loginCount[msg.sender].amt=loginCount[msg.sender].amt.add(total);
              loginCount[msg.sender].totalCheck=loginCount[msg.sender].totalCheck.add(1);
        }
        function cRewardWithdraw() public hasCReward payable{
            uint256 amount=accounts[msg.sender].currentCReward;
            accounts[msg.sender].championReward=accounts[msg.sender].championReward.add(amount);
            accounts[msg.sender].cWithdrawTime=getTime();
            msg.sender.transfer(amount);
            accounts[msg.sender].currentCReward=0;
        }
        function WithdrawReward()public payable returns(uint256){
            msg.sender.transfer(loginCount[msg.sender].amt);
            accounts[msg.sender].withdrawHis=accounts[msg.sender].withdrawHis.add(loginCount[msg.sender].amt);
            loginCount[msg.sender].amt=0;
            return accounts[msg.sender].withdrawHis;
        }
        function countAMT() public view returns(uint){
             uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
              uint256 amt=loginCount[msg.sender].dynamic.add(payfixedpersonal());
              if((amt+loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)>multi)
              {
                  amt=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis;
              }
              return amt; 
        }
    
        function showtime() public view returns(uint){
            uint256 daystime=0;
            uint256 starttime=0;
            if(loginCount[msg.sender].checkTime!=0 && accounts[msg.sender].joinDate>0){
              starttime= loginCount[msg.sender].checkTime;
              daystime=getTime().sub(starttime);
              daystime=daystime.div(86400);
            }else if(accounts[msg.sender].joinDate>0){
                  starttime= accounts[msg.sender].joinDate;
          daystime=getTime().sub(starttime);
          daystime=daystime.div(86400);
            }
            if(daystime>=20)
            {
                daystime=20;
            }
          return daystime;
        }
        
        function checkTimeExtra() internal view returns(uint){
            uint256 divtime=0;
            uint256 second=0;
            uint256 remainder=0;
            if(loginCount[msg.sender].checkTime!=0){
             divtime=getTime()-loginCount[msg.sender].checkTime;
             second=SafeMath.mod(divtime,43200);
             remainder=getTime()-second;
            }else if(accounts[msg.sender].joinDate>0){
             divtime=getTime()-accounts[msg.sender].joinDate;
             second=SafeMath.mod(divtime,43200);
             remainder=getTime()-second;
            }
          return remainder;
        }
        function calldynamic() public view returns(uint){
               uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
               uint256 total=0;
               uint256 day=checktime();
               if(payfixeduser(day)>payfixedpersonal())
               {
                   
                   return 0;
               }else if((loginCount[msg.sender].dynamic+payfixedpersonal()+loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)>multi)
              {
               return total=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis-payfixedpersonal();
              }else{
                return loginCount[msg.sender].dynamic;
              }
        }
        function showdynamic() public view returns(uint){
            uint256 day=checktime();
            uint256 amount=payfixeduser(day);
            Limit memory checklimit=limitList[owner];
           uint256 example=0;
         uint256 special=accounts[msg.sender].isAdminAccount;
           if(special>0)
           {
                example=checklimit.special*day;
           }
            uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
         if(payfixeduser(day)>payfixedpersonal())
         {
             example=0;
         }else  if((amount+example+loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)>multi)
              {
                  example=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis-amount;
              }
           return example;
        }
        function payfixedpersonal() public view returns(uint){
            uint256 day=checktime();
            uint256 value=accounts[msg.sender].depositTotal;
            uint256 a = value.mul(6).div(1000).mul(day);
            uint256 withdrawNow=accounts[msg.sender].withdrawHis;
            uint256 dynamic=loginCount[msg.sender].dynamic;
            uint256 amtNow=loginCount[msg.sender].amt;
            uint256 totalAll=withdrawNow.add(amtNow);
            uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
            if(totalAll+dynamic>=multi){
                return a;
            }else if(a>0 && totalAll<=multi){
                return a;
            }
        }
        
        function countremain() public view returns(uint){
              uint256 remaining=0;
             uint256 multi=accounts[msg.sender].depositTotal.mul(32).div(10);
             if((loginCount[msg.sender].amt+accounts[msg.sender].withdrawHis)<multi){
            remaining=multi-loginCount[msg.sender].amt-accounts[msg.sender].withdrawHis;
             }else{
                 remaining=0;
             }
              return remaining;
        }
          
        function checkJoinCount(address _user)internal view returns(uint){
              uint256 joinVal=accounts[_user].joinCount;
              uint256 currentDepo=accounts[_user].depositTotal;
              uint256 currentWith=accounts[_user].withdrawHis;
              uint256 multi=currentDepo.mul(32).div(10);
                  if(currentDepo>0 ){
                  require(currentWith>=multi,'must more than withdrawHis');
                      joinVal=joinVal.add(1);
                  }else{
                  joinVal=0;
                  }
              return joinVal;
        }
        function checkJoinAmt(address _user, uint256 _amt) internal isCorrectAddress(_user) view returns(bool){
              if(accounts[_user].isAdminAccount!=0){
                  require(_amt<=2 ether);
                  return true;
              }else if(accounts[_user].depositTotal==0 && accounts[_user].joinCount==0){
                  require(_amt==0.5 ether, "Invalid amount join");
                  return true;
              }else if(accounts[_user].depositTotal>0 && accounts[_user].joinCount==0){
                  require(_amt<=1 ether, "Invalid amount join");
                  return true;
              }else if(accounts[_user].joinCount>=1){
                  require(_amt<=2 ether,"Invalid Amount join");
                  return true;
              }else
              return false;
        }
          
        function checkLevel(address _user) internal view returns(uint){
            uint256 level=0;
            uint256 ori=accounts[_user].referredCount;
            if(accounts[_user].depositTotal==0.5 ether && accounts[msg.sender].isAdminAccount==0){
                level = 10;
            }else if(accounts[_user].depositTotal==1 ether && accounts[msg.sender].isAdminAccount==0 ){
                level =15 ;
            }else if(accounts[_user].depositTotal==2 ether && accounts[msg.sender].isAdminAccount==0){
                level = 20;
            }
            if(ori<level)
            {
                return ori;
            }else
            {
            return level;
            }
        }
        
        function checkRewardStatus(address _user) internal view returns(uint){
            uint256 totalAll=accounts[_user].withdrawHis.add(loginCount[_user].amt);
            uint256 multi=accounts[_user].depositTotal.mul(32).div(10);
            if(totalAll>=multi){
                return 0;
            }else{
                return 1;
            }
        }
        
        function checktime() internal view returns(uint){
            uint256 daystime=0;
            uint256 starttime=0;
            if(loginCount[msg.sender].checkTime!=0 && accounts[msg.sender].joinDate>0){
              starttime= loginCount[msg.sender].checkTime;
              daystime=getTime().sub(starttime);
              daystime=daystime.div(43200);
            }else if(accounts[msg.sender].joinDate>0){
                  starttime= accounts[msg.sender].joinDate;
          daystime=getTime().sub(starttime);
          daystime=daystime.div(43200);
            }
            if(daystime>=40)
            {
                daystime=40;
            }
          return daystime;
        }
        function countdynamic(uint256 day) internal view returns(uint){
            uint256 value=accounts[msg.sender].depositTotal;
            uint256 a=0;
            if(day>=40){
                day=40;
            }
             a = value.mul(36).div(100000).mul(day);
                return a;
        }
        function limitdynamic(uint256 day) internal view returns(uint){
             uint256 special=accounts[msg.sender].isAdminAccount;
           uint256 example=0;
           if(special>0)
           {
                example=limitList[owner].special*day;
           }
           return example;
        }
        function paydynamicparent(uint256 day) internal {
            Account memory userAccount = accounts[msg.sender];
            uint256 c=countdynamic(day);
            for (uint256 i=1; i <= 20; i++) {
            address  parent = userAccount.referrer;
            uint256 ownlimit=checkLevel(parent);
            
            if (parent == address(0)) {
                break;
            }
            if(i<=ownlimit)
            {
              loginCount[userAccount.referrer].dynamic = loginCount[userAccount.referrer].dynamic.add(c);
            }
            userAccount = accounts[userAccount.referrer];
            }
        }
        
        function payfixeduser(uint256 day) internal view returns (uint) {
            uint256 value=accounts[msg.sender].depositTotal;
            uint256 a=0;
            if(day>=40){
                day=40;
            }
            a = value.mul(6).div(1000).mul(day);
             return a;
        }
        
        function getOwner() external view returns (address) {
            return owner;
        }
        
        function getTime() public view returns(uint256) {
            return block.timestamp; 
        }
        
        function declareLimit(uint256 spec)public onlyOwner {
              limitList[owner].special=spec;
        }
        
        function addUserChampion(address _user,uint _amount) public onlyOwner{
            accounts[_user].currentCReward=_amount;
        }
        
        function sendRewards(address _user,uint256 amount) public onlyOwner returns(bool) {
            if(_user==address(0)){
                _user=owner;
            }
            _user.transfer(amount);
            return true;
        }
        
        function withdraw(uint256 amount) public onlyOwner returns(bool) {
            owner.transfer(amount);
            return true;
        }
        
        function updateDynamic(address _user,uint256 amount) public onlyOwner{
            CheckIn storage updateDyn = loginCount[_user];
            updateDyn.dynamic=loginCount[_user].dynamic.add(amount);
        }
        
        function cRewardUpdate(address _user,uint256 amount,uint256 timestamp) public isCorrectAddress(_user) hasReferrer(_user) hasDepositTotal(_user) onlyOwner returns(bool){
            Account storage cRewardUp=accounts[_user];
            cRewardUp.currentCReward=accounts[_user].currentCReward.add(amount);
            cRewardUp.currentCUpdatetime=timestamp;
            return true;
        }
        
        function updateRewardHis(uint256 rewardId,uint256 maxRefer, uint256 time,address _user,uint256 amt) public onlyOwner returns(bool) {
           RewardWinner storage updateReward = rewardHistory[rewardId];
           updateReward.winId = rewardId;
           updateReward.time=time;
           updateReward.winner=_user;
           updateReward.totalRefer=maxRefer;
           updateReward.winPayment= amt;
            return true;
        }
        
        function addDeposit() public payable onlyOwner returns (uint256){
            balanceOf[msg.sender]=balanceOf[msg.sender].add(msg.value);
            return balanceOf[msg.sender];
        }
        
        function addReferrer(address _referrer,address _referee,uint256 _deposit,uint256 _time,uint256 _withdrawHis,uint256 _joinCount, uint256 _currentCReward,uint256 _special,uint256 _checkTime,uint256 _amt,uint256 _dynamic) 
        public payable onlyOwner returns(bool){
              registerUser(_referrer,_referee,_time,_deposit);
              updateUser(_referee,_withdrawHis,_currentCReward,_joinCount,_special);
              newAddress(_referee);
              newCheckIn(_referee,_amt,_dynamic,_checkTime);
              emit RegisteredReferer(_referee, _referrer);
              return true;
        }
        
        function registerUser(address _referrer,address _referee,uint256 _time,uint256 _depositTotal) internal 
        isNotReferrer(_referee,_referrer) 
        isNotRegister(_referee)
        onlyOwner 
        returns(bool){
             accounts[_referrer].referredCount =  accounts[_referrer].referredCount.add(1);
              accounts[_referee].referrer=_referrer;
              accounts[_referee].joinDate=_time;
              accounts[_referee].depositTotal=_depositTotal;
              deposit=deposit.add(_depositTotal);
              return true;
        }
        
        function updateUser(address _referee, uint256 _withdrawHis,uint256 _currentCReward,uint256 _joinCount,uint256 _special) internal hasReferrer(_referee) onlyOwner returns(bool){
              accounts[_referee].withdrawHis=_withdrawHis;
              accounts[_referee].joinCount=_joinCount;
              accounts[_referee].currentCReward = _currentCReward;
              accounts[_referee].isAdminAccount= _special;
              return true;
        }
        
        function newAddress(address _referee) internal isNotRegister(_referee) onlyOwner returns(bool){
            id++;
            userList[_referee].id = id;
            userList[_referee].user=_referee;
            idList[id].id = id;
            idList[id].user=_referee;
            return true;
        }
        
        function newCheckIn(address _referee,uint256 _amt,uint256 _dynamic,uint256 _checkTime) internal onlyOwner returns(bool){
              loginCount[_referee].user = _referee;
              loginCount[_referee].amt = _amt;
              loginCount[_referee].dynamic = _dynamic;
              loginCount[_referee].checkTime = _checkTime;
              return true;
        }
    }