ETH Price: $2,404.99 (+7.27%)

Transaction Decoder

Block:
12695466 at Jun-24-2021 07:09:08 AM +UTC
Transaction Fee:
0.00378024 ETH $9.09
Gas Used:
378,024 Gas / 10 Gwei

Emitted Events:

76 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0xa9f28356d20ef4af663ec7cc27ab8fd5b12f87c066d9aec3d9dc1abd559eae8f( 0xa9f28356d20ef4af663ec7cc27ab8fd5b12f87c066d9aec3d9dc1abd559eae8f, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000000000000000ab1d, 0000000000000000000000000000000000000000000000000000000000008a99, 0000000000000000000000000000000000000000000000000000000000008a60, 0000000000000000000000000000000000000000000000000000000060d42f94, 000000000000000000000000000000000000000000000000016345785d8a0000, 0000000000000000000000000000000000000000000000000000000000000001 )
77 OpenAlexaProtocol.Transfer( from=[Receiver] 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f, to=[Sender] 0xd56604bea4188fb61e60edc261923b5450094761, value=9990000000000000000 )
78 OpenAlexaProtocol.Transfer( from=[Receiver] 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f, to=0xA35E62E5EB729142643Df04838e5C71113564Fbd, value=10000000000000000 )
79 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x4fad0f11423e7016ad9c1a43ab6ee598c3289b24e75238e7cad39b2e217f61b6( 0x4fad0f11423e7016ad9c1a43ab6ee598c3289b24e75238e7cad39b2e217f61b6, 0x0000000000000000000000002ec9e15f1e53fe30b030c5585b6257dca52201ba, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 000000000000000000000000000000000000000000000000002386f26fc10000, 0000000000000000000000000000000000000000000000000000000060d42f94 )
80 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414( 0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414, 0x000000000000000000000000a798b797b396f08085758096976dd480a92e3474, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 00000000000000000000000000000000000000000000000000354a6ba7a18000, 0000000000000000000000000000000000000000000000000000000060d42f94 )
81 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414( 0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414, 0x0000000000000000000000002ec9e15f1e53fe30b030c5585b6257dca52201ba, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 00000000000000000000000000000000000000000000000000354a6ba7a18000, 0000000000000000000000000000000000000000000000000000000060d42f94 )
82 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414( 0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414, 0x0000000000000000000000007b769a4e72ab595ee4c0f549b310c80806d9e89d, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 00000000000000000000000000000000000000000000000000354a6ba7a18000, 0000000000000000000000000000000000000000000000000000000060d42f94 )
83 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414( 0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414, 0x000000000000000000000000bfe22d45f9183f4702defe8ffb83f1c8854bd34e, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 00000000000000000000000000000000000000000000000000354a6ba7a18000, 0000000000000000000000000000000000000000000000000000000060d42f94 )
84 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414( 0x292dd44515353f6d5d4f039ce4c232849828fd980c1638911050d687330ac414, 0x000000000000000000000000898b4cdaae3d6e638c5c139a3909c1928f63b63c, 0x000000000000000000000000d56604bea4188fb61e60edc261923b5450094761, 000000000000000000000000000000000000000000000000016345785d8a0000, 00000000000000000000000000000000000000000000000000354a6ba7a18000, 0000000000000000000000000000000000000000000000000000000060d42f94 )

Account State Difference:

  Address   Before After State Difference Code
0x17884306...5ddE1A316
0x2eC9e15f...cA52201Ba 0.24231898642878332 Eth0.26731898642878332 Eth0.025
0x44b13a9e...EEa45eaCA
0x629dBB4e...43D7F5575
(OpenAlexa.io: Deployer)
5.561753456484081268 Eth5.576753456484081268 Eth0.015
0x7b769a4e...806D9e89D 18.0775596028 Eth18.0925596028 Eth0.015
(F2Pool Old)
1,887.023365640185993379 Eth1,887.027145880185993379 Eth0.00378024
0x898b4cDa...28F63B63C 304.885 Eth304.9 Eth0.015
0xA798B797...0a92E3474 0.039696742452777205 Eth0.054696742452777205 Eth0.015
0xbFe22d45...8854bd34e 63.546060431 Eth63.561060431 Eth0.015
0xD56604BE...450094761
0.11839543398630414 Eth
Nonce: 3
0.01461519398630414 Eth
Nonce: 4
0.10378024

Execution Trace

ETH 0.1 0xfa54969a776f57b6af8117b6b157b448b6c1ef7f.985225db( )
  • OpenAlexalO.userList( 35424 ) => ( 0x2eC9e15f1E53fE30b030C5585B6257DcA52201Ba )
  • OpenAlexalO.users( 0xD56604BEa4188FB61e60EdC261923b5450094761 ) => ( isExist=True, id=43805, referrerID=35481, currentLevel=1, totalEarningEth=200000000000000000 )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.7de41a01( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.7de41a01( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.3dbdae4e( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.0ef12aa9( )
  • OpenAlexalO.users( 0xD56604BEa4188FB61e60EdC261923b5450094761 ) => ( isExist=True, id=43805, referrerID=35481, currentLevel=1, totalEarningEth=200000000000000000 )
  • OpenAlexalO.users( 0xD56604BEa4188FB61e60EdC261923b5450094761 ) => ( isExist=True, id=43805, referrerID=35481, currentLevel=1, totalEarningEth=200000000000000000 )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.3dbdae4e( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.b634fb7d( )
  • OpenAlexalO.users( 0xD56604BEa4188FB61e60EdC261923b5450094761 ) => ( isExist=True, id=43805, referrerID=35481, currentLevel=1, totalEarningEth=200000000000000000 )
  • OpenAlexalO.users( 0xD56604BEa4188FB61e60EdC261923b5450094761 ) => ( isExist=True, id=43805, referrerID=35481, currentLevel=1, totalEarningEth=200000000000000000 )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.829886f4( )
  • OpenAlexaProtocol.transfer( _to=0xD56604BEa4188FB61e60EdC261923b5450094761, _value=10000000000000000000 ) => ( True )
  • OpenAlexalO.userList( 35424 ) => ( 0x2eC9e15f1E53fE30b030C5585B6257DcA52201Ba )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.0ef12aa9( )
  • OpenAlexalO.userList( 35424 ) => ( 0x2eC9e15f1E53fE30b030C5585B6257DcA52201Ba )
  • ETH 0.01 0x2ec9e15f1e53fe30b030c5585b6257dca52201ba.CALL( )
  • OpenAlexalO.userList( 35424 ) => ( 0x2eC9e15f1E53fE30b030C5585B6257DcA52201Ba )
  • OpenAlexalO.userList( 1 ) => ( 0x629dBB4eCdE5Fa809fDc68cB1b75f6f43D7F5575 )
  • ETH 0.015 OpenAlexa.io: Deployer.CALL( )
  • OpenAlexalO.users( 0xA798B797B396f08085758096976dD480a92E3474 ) => ( isExist=True, id=35432, referrerID=35424, currentLevel=1, totalEarningEth=200000000000000000 )
  • ETH 0.015 0xa798b797b396f08085758096976dd480a92e3474.CALL( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.5d48f08c( )
  • OpenAlexalO.users( 0x2eC9e15f1E53fE30b030C5585B6257DcA52201Ba ) => ( isExist=True, id=35424, referrerID=35333, currentLevel=1, totalEarningEth=200000000000000000 )
  • ETH 0.015 0x2ec9e15f1e53fe30b030c5585b6257dca52201ba.CALL( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.5d48f08c( )
  • OpenAlexalO.users( 0x7b769a4e72AB595Ee4c0F549b310c80806D9e89D ) => ( isExist=True, id=25358, referrerID=25340, currentLevel=2, totalEarningEth=1100000000000000000 )
  • ETH 0.015 0x7b769a4e72ab595ee4c0f549b310c80806d9e89d.CALL( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.5d48f08c( )
  • OpenAlexalO.users( 0xbFe22d45f9183f4702DEFe8FfB83f1c8854bd34e ) => ( isExist=True, id=25285, referrerID=25272, currentLevel=1, totalEarningEth=200000000000000000 )
  • ETH 0.015 0xbfe22d45f9183f4702defe8ffb83f1c8854bd34e.CALL( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.5d48f08c( )
  • OpenAlexalO.users( 0x898b4cDaAe3d6E638c5C139a3909C1928F63B63C ) => ( isExist=True, id=30, referrerID=15, currentLevel=2, totalEarningEth=60000000000000000 )
  • ETH 0.015 0x898b4cdaae3d6e638c5c139a3909c1928f63b63c.CALL( )
  • 0x44b13a9ec5bba78a52a1e074e37a690eea45eaca.5d48f08c( )
    File 1 of 2: OpenAlexaProtocol
    pragma solidity 0.5.14;
    
    
    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) {
            require(b <= a, "SafeMath: Subtraction overflow");
            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) {
            // Solidity only automatically asserts when divide by 0
            require(b > 0, "SafeMath: division by zero");
            uint256 c = a / b;
            // assert(a == b * c + a % b); // There is no case in which this doesn't hold
            return c;
        }
        
        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b != 0, "SafeMath: Modulo by zero");
            return a % b;
        }
    }
    
    
    contract ERC20 {
        function transferFrom(address from, address to, uint256 value) public returns (bool);
        function approve(address spender, uint256 value) public returns (bool);
        function transfer(address to, uint256 value) public returns(bool);
        function allowance(address owner, address spender) public view returns (uint256);
        event Transfer(address indexed from, address indexed to, uint256 value);
        event Approval(address indexed owner, address indexed spender, uint256 value);
    }
    
    
    contract OpenAlexaProtocol is ERC20 {
        
        using SafeMath for uint256;
        
        string public name;
        string public symbol;
        uint8 public decimals;
        uint256 public totalSupply;
        address public burnAddress;
        address public owner;
        address public sigAddress;
        
        mapping (address => uint256) public balances;
        mapping (address => mapping (address => uint256)) public allowed;
        mapping (bytes32 => bool) private hashConfirmation;
    
        constructor (address _burnAddress, address _sigAddress) public {
            symbol = "OAP";
            name = "Open Alexa Protocol";
            decimals = 18;
            burnAddress = _burnAddress;
            owner = msg.sender;
            sigAddress = _sigAddress;
        }
        
        modifier onlyOwner() {
            require(msg.sender == owner, "Only owner");
            _;
        }
        
        /**
         * @dev Check balance of the holder
         * @param _owner Token holder address
         */ 
        function balanceOf(address _owner) public view returns (uint256) {
            return balances[_owner];
        }
    
        /**
         * @dev Transfer token to specified address
         * @param _to Receiver address
         * @param _value Amount of the tokens
         */
        function transfer(address _to, uint256 _value) public returns (bool) {
            require(_to != address(0), "Invalid address");
            require(_value <= balances[msg.sender], "Insufficient balance");
            
            balances[msg.sender] = balances[msg.sender].sub(_value);
            uint256 burnFee = (_value.mul(0.1 ether)).div(10**20);
            uint256 balanceFee = _value.sub(burnFee);
            balances[burnAddress] = balances[burnAddress].add(burnFee);
            balances[_to] = balances[_to].add(balanceFee);
            
            emit Transfer(msg.sender, _to, balanceFee);
            emit Transfer(msg.sender, burnAddress, burnFee);
            return true;
        }
    
        /**
         * @dev Transfer tokens from one address to another
         * @param _from  The holder address
         * @param _to  The Receiver address
         * @param _value  the amount of tokens to be transferred
         */
        function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
            require(_from != address(0), "Invalid from address");
            require(_to != address(0), "Invalid to address");
            require(_value <= balances[_from], "Invalid balance");
            require(_value <= allowed[_from][msg.sender], "Invalid allowance");
            
            balances[_from] = balances[_from].sub(_value);
            uint256 burnFee = (_value.mul(0.1 ether)).div(10**20);
            uint256 balanceFee = _value.sub(burnFee);
            balances[burnAddress] = balances[burnAddress].add(burnFee);
            balances[msg.sender] = balances[msg.sender].add(balanceFee);
            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
            
            emit Transfer(_from, _to, balanceFee);
            emit Transfer(_from, burnAddress, burnFee);
            return true;
        }
        
        /**
         * @dev Approve respective tokens for spender
         * @param _spender Spender address
         * @param _value Amount of tokens to be allowed
         */
        function approve(address _spender, uint256 _value) public returns (bool) {
            require(_spender != address(0), "Null address");
            require(_value > 0, "Invalid value");
            allowed[msg.sender][_spender] = _value;
            emit Approval(msg.sender, _spender, _value);
            return true;
        }
    
        /**
         * @dev To view approved balance
         * @param _owner Holder address
         * @param _spender Spender address
         */ 
        function allowance(address _owner, address _spender) public view returns (uint256) {
            return allowed[_owner][_spender];
        }  
        
        /**
         * @dev To change burnt Address
         * @param _newOwner New owner address
         */ 
        function changeowner(address _newOwner) public onlyOwner returns(bool) {
            require(_newOwner != address(0), "Invalid Address");
            owner = _newOwner;
            return true;
        }
       
        
        /**
         * @dev To change burnt Address
         * @param _burnAddress New burn address
         */ 
        function changeburnt(address _burnAddress) public onlyOwner returns(bool) {
            require(_burnAddress != address(0), "Invalid Address");
            burnAddress = _burnAddress;
            return true;
        }
        
        /**
         * @dev To change signature Address
         * @param _newSigAddress New sigOwner address
         */ 
        function changesigAddress(address _newSigAddress) public onlyOwner returns(bool) {
            require(_newSigAddress != address(0), "Invalid Address");
            sigAddress = _newSigAddress;
            return true;
        }
        
        /**
         * @dev To mint OAP Tokens
         * @param _receiver Reciever address
         * @param _amount Amount to mint
         * @param _mrs _mrs[0] - message hash _mrs[1] - r of signature _mrs[2] - s of signature 
         * @param _v  v of signature
         */ 
        function mint(address _receiver, uint256 _amount,bytes32[3] memory _mrs, uint8 _v) public returns (bool) {
            require(_receiver != address(0), "Invalid address");
            require(_amount >= 0, "Invalid amount");
            require(hashConfirmation[_mrs[0]] != true, "Hash exists");
            require(ecrecover(_mrs[0], _v, _mrs[1], _mrs[2]) == sigAddress, "Invalid Signature");
            totalSupply = totalSupply.add(_amount);
            balances[_receiver] = balances[_receiver].add(_amount);
            hashConfirmation[_mrs[0]] = true;
            emit Transfer(address(0), _receiver, _amount);
            return true;
        }
        
        /**
         * @dev To mint OAP Tokens
         * @param _receiver Reciever address
         * @param _amount Amount to mint
         */ 
        function ownerMint(address _receiver, uint256 _amount) public onlyOwner returns (bool) {
            require(_receiver != address(0), "Invalid address");
            require(_amount >= 0, "Invalid amount");
            totalSupply = totalSupply.add(_amount);
            balances[_receiver] = balances[_receiver].add(_amount);
            emit Transfer(address(0), _receiver, _amount);
            return true;
        }
    }

    File 2 of 2: OpenAlexalO
    /**
     *
     * Updated OpenAlexa v1.2 (Fixed)
     * URL: https://openalexa.io 
     *
    */
    
    pragma solidity 0.5.14;
    
    
    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) {
            require(b <= a, "SafeMath: subtraction overflow");
            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) {
            require(b > 0, "SafeMath: division by zero");
            uint256 c = a / b;
            return c;
        }
    }
    
    
    contract ERC20 {
        function mint(address reciever, uint256 value, bytes32[3] memory _mrs, uint8 _v) public returns(bool);
        function transfer(address to, uint256 value) public returns(bool);
    }
    
    
    contract OpenAlexalO {
        using SafeMath for uint256;
    
        struct UserStruct {
            bool isExist;
            uint id;
            uint referrerID;
            uint currentLevel;
            uint totalEarningEth;
            address[] referral;
            mapping(uint => uint) levelExpired;
        }
        
        ERC20 Token;
        OpenAlexalO public oldAlexa;
        address public ownerAddress;
        uint public adminFee = 16 ether;
        uint public currentId = 0;
        uint public oldAlexaId = 1;
        uint public PERIOD_LENGTH = 60 days;
        uint referrer1Limit = 2;
        bool public lockStatus;
        
        mapping (uint => uint) public LEVEL_PRICE;
        mapping (address => UserStruct) public users;
        mapping (uint => address) public userList;
        mapping (address => mapping (uint => uint)) public EarnedEth;
        mapping (address => uint) public loopCheck;
        mapping (address => uint) public createdDate;
        
        event regLevelEvent(address indexed UserAddress, address indexed ReferrerAddress, uint Time);
        event buyLevelEvent(address indexed UserAddress, uint Levelno, uint Time);
        event getMoneyForLevelEvent(address indexed UserAddress, uint UserId, address indexed ReferrerAddress, uint ReferrerId, uint Levelno, uint LevelPrice, uint Time);
        event lostMoneyForLevelEvent(address indexed UserAddress, uint UserId, address indexed ReferrerAddress, uint ReferrerId, uint Levelno, uint LevelPrice, uint Time);    
        
        constructor() public {
            ownerAddress = msg.sender;
            Token = ERC20(0x1788430620960F9a70e3DC14202a3A35ddE1A316);
            oldAlexa = OpenAlexalO(0xaB3FB81f8660788997CFD379f7A87e9527F1301b);
    
            LEVEL_PRICE[1] = 0.03 ether;
            LEVEL_PRICE[2] = 0.05 ether;
            LEVEL_PRICE[3] = 0.1 ether;
            LEVEL_PRICE[4] = 0.5 ether;
            LEVEL_PRICE[5] = 1 ether;
            LEVEL_PRICE[6] = 3 ether;
            LEVEL_PRICE[7] = 7 ether;
            LEVEL_PRICE[8] = 12 ether;
            LEVEL_PRICE[9] = 15 ether;
            LEVEL_PRICE[10] = 25 ether;
            LEVEL_PRICE[11] = 30 ether;
            LEVEL_PRICE[12] = 39 ether;
        } 
    
        /**
         * @dev User registration
         */ 
        function regUser(uint _referrerID, bytes32[3] calldata _mrs, uint8 _v) external payable {
            require(lockStatus == false, "Contract Locked");
            require(users[msg.sender].isExist == false, "User exist");
            require(_referrerID > 0 && _referrerID <= currentId, "Incorrect referrer Id");
            require(msg.value == LEVEL_PRICE[1], "Incorrect Value");
            
            if (users[userList[_referrerID]].referral.length >= referrer1Limit) 
                _referrerID = users[findFreeReferrer(userList[_referrerID])].id;
    
            UserStruct memory userStruct;
            currentId++;
            
            userStruct = UserStruct({
                isExist: true,
                id: currentId,
                referrerID: _referrerID,
                currentLevel: 1,
                totalEarningEth:0,
                referral: new address[](0)
            });
    
            users[msg.sender] = userStruct;
            userList[currentId] = msg.sender;
            users[msg.sender].levelExpired[1] = now.add(PERIOD_LENGTH);
            users[userList[_referrerID]].referral.push(msg.sender);
            loopCheck[msg.sender] = 0;
            createdDate[msg.sender] = now;
    
            payForLevel(0, 1, msg.sender, ((LEVEL_PRICE[1].mul(adminFee)).div(10**20)), _mrs, _v, msg.value);
    
            emit regLevelEvent(msg.sender, userList[_referrerID], now);
        }
        
        /**
         * @dev To buy the next level by User
         */ 
        function buyLevel(uint256 _level, bytes32[3] calldata _mrs, uint8 _v) external payable {
            require(lockStatus == false, "Contract Locked");
            require(users[msg.sender].isExist, "User not exist"); 
            require(_level > 0 && _level <= 12, "Incorrect level");
    
            if (_level == 1) {
                require(msg.value == LEVEL_PRICE[1], "Incorrect Value");
                users[msg.sender].levelExpired[1] = users[msg.sender].levelExpired[1].add(PERIOD_LENGTH);
                users[msg.sender].currentLevel = 1;
            } else {
                require(msg.value == LEVEL_PRICE[_level], "Incorrect Value");
                users[msg.sender].currentLevel = _level;
                for (uint i = _level - 1; i > 0; i--) 
                    require(users[msg.sender].levelExpired[i] >= 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;
            }
            loopCheck[msg.sender] = 0;
           
            payForLevel(0, _level, msg.sender, ((LEVEL_PRICE[_level].mul(adminFee)).div(10**20)), _mrs, _v, msg.value);
    
            emit buyLevelEvent(msg.sender, _level, now);
        }
        
        /**
         * @dev Internal function for payment
         */ 
        function payForLevel(uint _flag, uint _level, address _userAddress, uint _adminPrice, bytes32[3] memory _mrs, uint8 _v, uint256 _amt) internal {
            address[6] memory referer;
            
            if (_flag == 0) {
                if (_level == 1 || _level == 7) {
                    referer[0] = userList[users[_userAddress].referrerID];
                } else if (_level == 2 || _level == 8) {
                    referer[1] = userList[users[_userAddress].referrerID];
                    referer[0] = userList[users[referer[1]].referrerID];
                } else if (_level == 3 || _level == 9) {
                    referer[1] = userList[users[_userAddress].referrerID];
                    referer[2] = userList[users[referer[1]].referrerID];
                    referer[0] = userList[users[referer[2]].referrerID];
                } else if (_level == 4 || _level == 10) {
                    referer[1] = userList[users[_userAddress].referrerID];
                    referer[2] = userList[users[referer[1]].referrerID];
                    referer[3] = userList[users[referer[2]].referrerID];
                    referer[0] = userList[users[referer[3]].referrerID];
                } else if (_level == 5 || _level == 11) {
                    referer[1] = userList[users[_userAddress].referrerID];
                    referer[2] = userList[users[referer[1]].referrerID];
                    referer[3] = userList[users[referer[2]].referrerID];
                    referer[4] = userList[users[referer[3]].referrerID];
                    referer[0] = userList[users[referer[4]].referrerID];
                } else if (_level == 6 || _level == 12) {
                    referer[1] = userList[users[_userAddress].referrerID];
                    referer[2] = userList[users[referer[1]].referrerID];
                    referer[3] = userList[users[referer[2]].referrerID];
                    referer[4] = userList[users[referer[3]].referrerID];
                    referer[5] = userList[users[referer[4]].referrerID];
                    referer[0] = userList[users[referer[5]].referrerID];
                }
            } else if (_flag == 1) {
                referer[0] = userList[users[_userAddress].referrerID];
            }
            if (!users[referer[0]].isExist) referer[0] = userList[1];
            
            if (loopCheck[msg.sender] >= 12) {
                referer[0] = userList[1];
            }
            if (users[referer[0]].levelExpired[_level] >= now) {
              
                uint256 tobeminted = ((_amt).mul(10**18)).div(0.01 ether);
                // transactions 
                require((address(uint160(referer[0])).send(LEVEL_PRICE[_level].sub(_adminPrice))) && 
                        (address(uint160(ownerAddress)).send(_adminPrice)) &&   
                        Token.mint(msg.sender, tobeminted, _mrs, _v), "Transaction Failure");
               
                users[referer[0]].totalEarningEth = users[referer[0]].totalEarningEth.add(LEVEL_PRICE[_level]);
                EarnedEth[referer[0]][_level] = EarnedEth[referer[0]][_level].add(LEVEL_PRICE[_level]);
              
                emit getMoneyForLevelEvent(msg.sender, users[msg.sender].id, referer[0], users[referer[0]].id, _level, LEVEL_PRICE[_level], now);
            } else {
                if (loopCheck[msg.sender] < 12) {
                    loopCheck[msg.sender] = loopCheck[msg.sender].add(1);
    
                emit lostMoneyForLevelEvent(msg.sender, users[msg.sender].id, referer[0], users[referer[0]].id, _level, LEVEL_PRICE[_level],now);
                    
                payForLevel(1, _level, referer[0], _adminPrice, _mrs, _v, _amt);
                }
            }
        }
    
        /**
         * @dev Update old contract data
         */ 
        function oldAlexaSync(uint limit) public {
            require(address(oldAlexa) != address(0), "Initialize closed");
            require(msg.sender == ownerAddress, "Access denied");
            
            for (uint i = 0; i <= limit; i++) {
                UserStruct  memory olduser;
                address oldusers = oldAlexa.userList(oldAlexaId);
                (olduser.isExist, 
                olduser.id, 
                olduser.referrerID, 
                olduser.currentLevel,  
                olduser.totalEarningEth) = oldAlexa.users(oldusers);
                address ref = oldAlexa.userList(olduser.referrerID);
    
                if (olduser.isExist) {
                    if (!users[oldusers].isExist) {
                        users[oldusers].isExist = true;
                        users[oldusers].id = oldAlexaId;
                        users[oldusers].referrerID = olduser.referrerID;
                        users[oldusers].currentLevel = olduser.currentLevel;
                        users[oldusers].totalEarningEth = olduser.totalEarningEth;
                        userList[oldAlexaId] = oldusers;
                        users[ref].referral.push(oldusers);
                        createdDate[oldusers] = now;
                        
                        emit regLevelEvent(oldusers, ref, now);
                        
                        for (uint j = 1; j <= 12; j++) {
                            users[oldusers].levelExpired[j] = oldAlexa.viewUserLevelExpired(oldusers, j);
                            EarnedEth[oldusers][j] = oldAlexa.EarnedEth(oldusers, j);
                        } 
                    }
                    oldAlexaId++;
                } else {
                    currentId = oldAlexaId.sub(1);
                    break;
                    
                }
            }
        }
        
        /**
         * @dev Update old contract data
         */ 
        function setOldAlexaID(uint _id) public returns(bool) {
            require(ownerAddress == msg.sender, "Access Denied");
            
            oldAlexaId = _id;
            return true;
        }
    
        /**
         * @dev Close old contract interaction
         */ 
        function oldAlexaSyncClosed() external {
            require(address(oldAlexa) != address(0), "Initialize already closed");
            require(msg.sender == ownerAddress, "Access denied");
    
            oldAlexa = OpenAlexalO(0);
        }
        
        /**
         * @dev Contract balance withdraw
         */ 
        function failSafe(address payable _toUser, uint _amount) public returns (bool) {
            require(msg.sender == ownerAddress, "only Owner Wallet");
            require(_toUser != address(0), "Invalid Address");
            require(address(this).balance >= _amount, "Insufficient balance");
    
            (_toUser).transfer(_amount);
            return true;
        }
                
        /**
         * @dev Update admin fee percentage
         */ 
        function updateFeePercentage(uint256 _adminFee) public returns (bool) {
            require(msg.sender == ownerAddress, "only OwnerWallet");
    
            adminFee = _adminFee;
            return true;  
        }
        
        /**
         * @dev Update level price
         */ 
        function updatePrice(uint _level, uint _price) public returns (bool) {
            require(msg.sender == ownerAddress, "only OwnerWallet");
    
            LEVEL_PRICE[_level] = _price;
            return true;
        }
    
        /**
         * @dev Update contract status
         */ 
        function contractLock(bool _lockStatus) public returns (bool) {
            require(msg.sender == ownerAddress, "Invalid User");
    
            lockStatus = _lockStatus;
            return true;
        }
        
        /**
        * @dev Update token contract
        */ 
        function updateToken(address _newToken) public returns (bool) {
            require(msg.sender == ownerAddress, "Invalid User");
            require(_newToken != address(0), "Invalid Token Address");
            
            Token = ERC20(_newToken);
            return true;
        }
            
        /**
         * @dev View free Referrer Address
         */ 
        function findFreeReferrer(address _userAddress) public view returns (address) {
            if (users[_userAddress].referral.length < referrer1Limit) 
                return _userAddress;
    
            address[] memory referrals = new address[](254);
            referrals[0] = users[_userAddress].referral[0];
            referrals[1] = users[_userAddress].referral[1];
    
            address freeReferrer;
            bool noFreeReferrer = true;
    
            for (uint i = 0; i < 254; i++) { 
                if (users[referrals[i]].referral.length == referrer1Limit) {
                    if (i < 126) {
                        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;
        }
        
        /**
         * @dev Total earned ETH
         */
        function getTotalEarnedEther() public view returns (uint) {
            uint totalEth;
            for (uint i = 1; i <= currentId; i++) {
                totalEth = totalEth.add(users[userList[i]].totalEarningEth);
            }
            return totalEth;
        }
            
       /**
         * @dev View referrals
         */ 
        function viewUserReferral(address _userAddress) external view returns (address[] memory) {
            return users[_userAddress].referral;
        }
        
        /**
         * @dev View level expired time
         */ 
        function viewUserLevelExpired(address _userAddress,uint _level) external view returns (uint) {
            return users[_userAddress].levelExpired[_level];
        }
    
        // fallback
        function () external payable {
            revert("Invalid Transaction");
        }
    }