ETH Price: $3,318.75 (-1.22%)

Contract

0x5520E9e5475985BD078458205F51fd4d4820EFD2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Claim Enable...211150992024-11-04 15:11:4718 days ago1730733107IN
0x5520E9e5...d4820EFD2
0 ETH0.000203737.57757848
Claim210569932024-10-27 12:33:5926 days ago1730032439IN
0x5520E9e5...d4820EFD2
0 ETH0.000903197.33950516
Change Lock Info210569862024-10-27 12:32:3526 days ago1730032355IN
0x5520E9e5...d4820EFD2
0 ETH0.000232176.79755852
Set Claim Enable...210569762024-10-27 12:30:3526 days ago1730032235IN
0x5520E9e5...d4820EFD2
0 ETH0.000159395.92596313
Change Lock Info210569732024-10-27 12:29:5926 days ago1730032199IN
0x5520E9e5...d4820EFD2
0 ETH0.000207786.08368542
Change Lock Info210569632024-10-27 12:27:5926 days ago1730032079IN
0x5520E9e5...d4820EFD2
0 ETH0.000179325.25034543
Set Claim Enable...210558972024-10-27 8:53:4726 days ago1730019227IN
0x5520E9e5...d4820EFD2
0 ETH0.000153545.71095657
Claim210558852024-10-27 8:51:2326 days ago1730019083IN
0x5520E9e5...d4820EFD2
0 ETH0.000588215.55135976
Claim210558292024-10-27 8:40:1126 days ago1730018411IN
0x5520E9e5...d4820EFD2
0 ETH0.000699794.99286535
Set Claim Enable...210558242024-10-27 8:39:1126 days ago1730018351IN
0x5520E9e5...d4820EFD2
0 ETH0.000132024.90847242
Change Lock Info210541852024-10-27 3:10:1126 days ago1729998611IN
0x5520E9e5...d4820EFD2
0 ETH0.000150474.40554845
Change Investmen...210541692024-10-27 3:06:5926 days ago1729998419IN
0x5520E9e5...d4820EFD2
0 ETH0.000149514.0342806
Set Invest Enabl...210540992024-10-27 2:52:5926 days ago1729997579IN
0x5520E9e5...d4820EFD2
0 ETH0.000112574.19618642
Invest210540892024-10-27 2:50:5926 days ago1729997459IN
0x5520E9e5...d4820EFD2
0 ETH0.001242894.1162654
Set Invest Enabl...210540632024-10-27 2:45:4726 days ago1729997147IN
0x5520E9e5...d4820EFD2
0 ETH0.000118344.40914071
Set Invitee210449002024-10-25 20:04:1128 days ago1729886651IN
0x5520E9e5...d4820EFD2
0 ETH0.000472095.45177871
Set Invest Enabl...210435842024-10-25 15:40:1128 days ago1729870811IN
0x5520E9e5...d4820EFD2
0 ETH0.0004662517.37929516
Set Claim Enable...210435802024-10-25 15:39:2328 days ago1729870763IN
0x5520E9e5...d4820EFD2
0 ETH0.0004718317.54953468
Invest210424312024-10-25 11:47:5928 days ago1729856879IN
0x5520E9e5...d4820EFD2
0 ETH0.001706396.18747458
Invest210424062024-10-25 11:42:5928 days ago1729856579IN
0x5520E9e5...d4820EFD2
0 ETH0.001606395.82232797
Claim210423882024-10-25 11:39:2328 days ago1729856363IN
0x5520E9e5...d4820EFD2
0 ETH0.000807775.66041685
Invest210421682024-10-25 10:55:2328 days ago1729853723IN
0x5520E9e5...d4820EFD2
0 ETH0.001681415.91626376
Claim210421652024-10-25 10:54:4728 days ago1729853687IN
0x5520E9e5...d4820EFD2
0 ETH0.001170686.02454164
Claim210421582024-10-25 10:53:2328 days ago1729853603IN
0x5520E9e5...d4820EFD2
0 ETH0.00092256.26218472
Set Invitee210421572024-10-25 10:53:1128 days ago1729853591IN
0x5520E9e5...d4820EFD2
0 ETH0.000429684.96204199
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EsgSHIPV3

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 300 runs

Other Settings:
istanbul EvmVersion
File 1 of 3 : EsgSHIPV3.sol
pragma solidity >=0.5.16;
pragma experimental ABIEncoderV2;

import "./EIP20Interface.sol";
import "./SafeMath.sol";

contract EsgSHIPV3{
    using SafeMath for uint256;
    /// @notice ESG token
    EIP20Interface public esg;

    /// @notice Emitted when referral set invitee
    event SetInvitee(address inviteeAddress);

    /// @notice Emitted when owner set invitee
    event SetInviteeByOwner(address referrerAddress, address inviteeAddress);

    /// @notice Emitted when ESG is invest  
    event EsgInvest(address account, uint amount, uint price);

    /// @notice Emitted when ESG is invest by owner 
    event EsgInvestByOwner(address account, uint amount, uint price);

    /// @notice Emitted when ESG is claimed 
    event EsgClaimed(address account, uint amount, uint price);

    /// @notice Emitted when change Lock info
    event EsgChangeLockInfo(address _user, uint256 _rate, uint256 i);

    /// @notice Emitted when change Investment info
    event EsgChangeInvestmentInfo(address _user, uint256 _userTotalValue, uint256 _withdraw, uint256 _lastCollectionTime);

    /// @notice Emitted when change Referrer info
    event EsgChangeReferrerInfo(address _user, uint256 _totalInvestment, uint256 _referrerRewardLimit, uint256 _totalReferrerRaward, uint256 _teamRewardTime, uint256 _teamRewardRate, uint256 _noExtract);

    struct Lock {
        uint256 amount;
        uint256 esgPrice;
        uint256 value;
        uint256 start;
        uint256 end;
        uint256 investDays;
        uint256 releaseRate;
    }
    mapping(address => Lock[]) public locks;

    struct Investment {
        uint256 userTotalValue;
        uint256 withdraw; 
        uint256 lastCollectionTime;
    }
    mapping(address => Investment) public investments;

    modifier onlyOwner() {
        require(msg.sender == owner, "Only owner can call this function.");
        _;
    }

    struct Referrer {
        address[] referrals;
        uint256 totalInvestment;
        uint256 referrerRewardLimit;
        uint256 totalReferrerRaward;
        uint256 teamRewardTime;
        uint256 teamRewardRate;
        uint256 noExtract;
    }
    mapping(address => Referrer) public referrers;//1:n

    struct User {
        address referrer_addr;
    }
    mapping (address => User) public referrerlist;//1:1

    address private feeWallet; 
    uint256 public fee = 5;
    uint256 public invest_days1 = 350;
    uint256 public invest_days2 = 350;
    uint256 public invest_days3 = 350;
    uint256 public invest_days4 = 350;
    uint256 public invest_days5 = 300;
    uint256 public referralThreshold = 1000 * 1e24;
    uint256 public total_deposited;
    uint256 public total_user;
    uint256 public total_amount;
    uint256 public total_extracted;
    uint256 public total_claim_amount;
    uint256 public lockRates = 100; 
    uint256 public staticRewardRate = 10;
    uint256 public dynamicRewardRate = 10;
    uint256 public teamRewardThreshold = 30000 * 1e24;
    uint256 public teamRewardThresholdRate = 30 * 1e24;
    uint256 public teamRewardThresholdStep = 10000 * 1e24;
    uint256 public teamRewardThresholdStepRate = 10 * 1e24;
    uint256 public price;
    bool public investEnabled;
    bool public claimEnabled;
    address public owner;

    constructor(address esgAddress, address feeWalletAddress) public {
        owner = msg.sender;
        investEnabled = true;
        claimEnabled = true;
        esg = EIP20Interface(esgAddress);
        feeWallet = feeWalletAddress;
    }

    function setPrice(uint256 _price) onlyOwner public {
        require(_price > 0, "Price must be positive");
        price = _price;
    }

    function setFee(uint256 _fee) onlyOwner public {
        require(_fee > 0, "Fee must be positive");
        fee = _fee;
    }

    function setInvestEnabled(bool _investEnabled) onlyOwner public {
        investEnabled = _investEnabled;
    }

    function setClaimEnabled(bool _claimEnabled) onlyOwner public {
        claimEnabled = _claimEnabled;
    }

    function setInvestDays(uint256 days1, uint256 days2, uint256 days3, uint256 days4, uint256 days5) onlyOwner public {
        require(days1 > 0, "days1 should be greater than 0");
        require(days2 > 0, "days2 should be greater than 0");
        require(days3 > 0, "days3 should be greater than 0");
        require(days4 > 0, "days4 should be greater than 0");
        require(days5 > 0, "days5 should be greater than 0");
        invest_days1 = days1;
        invest_days2 = days2;
        invest_days3 = days3;
        invest_days4 = days4;
        invest_days5 = days5;
    }

    function setLockRates(uint256 _lockRates) onlyOwner public {
        lockRates = _lockRates;
    }

    function setReferralThreshold(uint256 _referralThreshold) onlyOwner public {
        referralThreshold = _referralThreshold;
    }

    function setStaticRewardRate(uint256 _staticRewardRate) onlyOwner public {
        staticRewardRate = _staticRewardRate;
    }

    function setDynamicRewardRate(uint256 _dynamicRewardRate) onlyOwner public {
        dynamicRewardRate = _dynamicRewardRate;
    }

    function setTeamRewardThreshold(uint256 _teamRewardThreshold) onlyOwner public {
        teamRewardThreshold = _teamRewardThreshold;
    }

    function setTeamRewardThresholdRate(uint256 _teamRewardThresholdRate) onlyOwner public {
        teamRewardThresholdRate = _teamRewardThresholdRate;
    }

    function setTeamRewardThresholdStep(uint256 _teamRewardThresholdStep) onlyOwner public {
        teamRewardThresholdStep = _teamRewardThresholdStep;
    }

    function setTeamRewardThresholdStepRate(uint256 _teamRewardThresholdStepRate) onlyOwner public {
        teamRewardThresholdStepRate = _teamRewardThresholdStepRate;
    }

    function setInvitee(address inviteeAddress) public returns (bool) {
        require(inviteeAddress != address(0), "inviteeAddress cannot be 0x0.");

        User storage user = referrerlist[inviteeAddress];
        require(user.referrer_addr == address(0), "This account had been invited!");
        
        Investment storage investment = investments[msg.sender];
        require(investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue).sub(investment.withdraw) >= referralThreshold, "Referrer has no referral qualification.");

        Lock[] storage inviteeLocks = locks[inviteeAddress];
        require(inviteeLocks.length == 0, "This account had staked!");
        
        Referrer storage referrer = referrers[msg.sender];
        referrer.referrals.push(inviteeAddress);
        if(referrer.referrerRewardLimit == 0){
            referrer.referrerRewardLimit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
        }

        User storage _user = referrerlist[inviteeAddress];
        _user.referrer_addr = msg.sender;

        emit SetInvitee(inviteeAddress);
        return true;   
    }

    function setInviteeByOwner(address referrerAddress, address inviteeAddress) public onlyOwner returns (bool) {
        require(referrerAddress != address(0), "referrerAddress cannot be 0x0.");
        require(inviteeAddress != address(0), "inviteeAddress cannot be 0x0.");

        User storage user = referrerlist[inviteeAddress];
        require(user.referrer_addr == address(0), "This account had been invited!");
        
        Investment storage investment = investments[referrerAddress];
        require(investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue).sub(investment.withdraw) >= referralThreshold, "Referrer has no referral qualification.");

        Lock[] storage inviteeLocks = locks[inviteeAddress];
        require(inviteeLocks.length == 0, "This account had staked!");
        
        Referrer storage referrer = referrers[referrerAddress];
        referrer.referrals.push(inviteeAddress);
        if(referrer.referrerRewardLimit == 0){
            referrer.referrerRewardLimit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
        }

        User storage _user = referrerlist[inviteeAddress];
        _user.referrer_addr = referrerAddress;

        emit SetInviteeByOwner(referrerAddress, inviteeAddress);
        return true;   
    }

    function getInviteelist(address referrerAddress) public view returns (address[] memory) {
        require(referrerAddress != address(0), "referrerAddress cannot be 0x0.");
        Referrer storage referrer = referrers[referrerAddress];
        return referrer.referrals;
    }

    function getReferrer(address inviteeAddress) public view returns (address) {
        require(inviteeAddress != address(0), "inviteeAddress cannot be 0x0.");
        User storage user = referrerlist[inviteeAddress];
        return user.referrer_addr;
    }

    function invest(uint256 _amount) public returns (bool) {
        require(investEnabled == true, "No invest allowed!");
        require(_amount > 0, "Invalid amount.");

        esg.transferFrom(msg.sender, address(this), _amount);

        uint256 nowTime = block.timestamp;
        Lock[] storage user_locks = locks[msg.sender];
        if(user_locks.length > 0){
            Investment storage user_investment = investments[msg.sender];
            uint256 userDeposit = user_investment.userTotalValue.mul(lockRates).div(100).add(user_investment.userTotalValue);
            uint256 userWithdraw = user_investment.withdraw;
            if(userDeposit == userWithdraw){
                user_investment.lastCollectionTime = nowTime;
            }
        }

        uint256 invest_days = 0;
        uint256 deposit = _amount.mul(price);
        if(deposit < 500 * 1e24){
            invest_days = invest_days1;
        }else if(deposit >= 500 * 1e24 && deposit < 2000 * 1e24){
            invest_days = invest_days2;
        }else if(deposit >= 2000 * 1e24 && deposit < 5000 * 1e24){
            invest_days = invest_days3;
        }else if(deposit >= 5000 * 1e24 && deposit < 10000 * 1e24){
            invest_days = invest_days4;
        }else if(deposit >= 10000 * 1e24){
            invest_days = invest_days5;
        }
        
        locks[msg.sender].push(
            Lock(
                _amount,
                price,
                deposit,
                nowTime,
                nowTime + (invest_days * 86400),
                invest_days,
                (deposit.mul(lockRates).div(100).add(deposit)).div(invest_days).div(86400)
            )
        );

        Investment storage investment = investments[msg.sender];
        if(investment.userTotalValue == 0){
            investment.lastCollectionTime = nowTime;
            total_user = total_user + 1;
        }
        investment.userTotalValue += deposit;

        total_deposited = total_deposited + deposit;
        total_amount = total_amount + _amount;

        Referrer storage userReferrer = referrers[msg.sender];
        if(userReferrer.referrals.length > 0){
            userReferrer.referrerRewardLimit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
            if(userReferrer.totalInvestment >= teamRewardThreshold){
                uint256 statistics = 0;
                if(userReferrer.teamRewardTime == 0){
                    userReferrer.teamRewardTime = block.timestamp;
                    statistics = (userReferrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                    userReferrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                    userReferrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                }
            }
        }
            
        User storage user = referrerlist[msg.sender];

        if(user.referrer_addr != address(0)){
            referrers[user.referrer_addr].totalInvestment += deposit;
            uint256 staticReward = deposit.mul(staticRewardRate).div(100);
            Referrer storage referrer = referrers[user.referrer_addr];

            Lock[] storage userLocks = locks[user.referrer_addr];
            if(referrer.totalReferrerRaward < referrer.referrerRewardLimit){
                if(referrer.totalReferrerRaward + staticReward < referrer.referrerRewardLimit){
                    referrer.noExtract += staticReward;
                    if(referrer.noExtract >= referrer.referrerRewardLimit){
                        for (uint256 i = 0; i < userLocks.length; i++) {
                            Lock storage lock = userLocks[i];
                            lock.releaseRate = 0;
                        }
                    }
                }else{
                    referrer.noExtract = referrer.referrerRewardLimit - referrer.totalReferrerRaward;
                    for (uint256 i = 0; i < userLocks.length; i++) {
                        Lock storage lock = userLocks[i];
                        lock.releaseRate = 0;
                    }
                }
            }
            
            if(referrer.totalInvestment >= teamRewardThreshold){
                uint256 statistics = 0;
                if(referrer.teamRewardTime == 0){
                    referrer.teamRewardTime = block.timestamp;
                    statistics = (referrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                    referrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                    referrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                }else{
                    uint256 team_reward = (block.timestamp.sub(referrer.teamRewardTime)).mul(referrer.teamRewardRate);
                    if(referrer.totalReferrerRaward < referrer.referrerRewardLimit){
                        if(referrer.totalReferrerRaward + team_reward < referrer.referrerRewardLimit){
                            referrer.noExtract += team_reward;
                            if(referrer.noExtract >= referrer.referrerRewardLimit){
                                for (uint256 i = 0; i < userLocks.length; i++) {
                                    Lock storage lock = userLocks[i];
                                    lock.releaseRate = 0;
                                }
                            }
                        }else{
                            referrer.noExtract = referrer.referrerRewardLimit - referrer.totalReferrerRaward;
                            for (uint256 i = 0; i < userLocks.length; i++) {
                                Lock storage lock = userLocks[i];
                                lock.releaseRate = 0;
                            }
                        }
                        referrer.teamRewardTime = block.timestamp;
                        statistics = (referrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                        referrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                        referrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                    }
                }
            }
        }

        emit EsgInvest(msg.sender, _amount, price);
        return true;
    }

    function investByOwner(address investAddress, uint256 _amount) public onlyOwner returns (bool) {
        require(investEnabled == true, "No invest allowed!");
        require(_amount > 0, "Invalid amount.");

        uint256 invest_days = 0;
        uint256 deposit = _amount.mul(price);
        if(deposit < 500 * 1e24){
            invest_days = invest_days1;
        }else if(deposit >= 500 * 1e24 && deposit < 2000 * 1e24){
            invest_days = invest_days2;
        }else if(deposit >= 2000 * 1e24 && deposit < 5000 * 1e24){
            invest_days = invest_days3;
        }else if(deposit >= 5000 * 1e24 && deposit < 10000 * 1e24){
            invest_days = invest_days4;
        }else if(deposit >= 10000 * 1e24){
            invest_days = invest_days5;
        }

        uint256 nowTime = block.timestamp;
        Lock[] storage user_locks = locks[msg.sender];
        if(user_locks.length > 0){
            Investment storage user_investment = investments[msg.sender];
            uint256 userDeposit = user_investment.userTotalValue.mul(lockRates).div(100).add(user_investment.userTotalValue);
            uint256 userWithdraw = user_investment.withdraw;
            if(userDeposit == userWithdraw){
                user_investment.lastCollectionTime = nowTime;
            }
        }

        locks[investAddress].push(
            Lock(
                _amount,
                price,
                deposit,
                nowTime,
                nowTime + (invest_days * 86400),
                invest_days,
                (deposit.mul(lockRates).div(100).add(deposit)).div(invest_days).div(86400)
            )
        );

        Investment storage investment = investments[investAddress];
        if(investment.userTotalValue == 0){
            investment.lastCollectionTime = nowTime;
            total_user = total_user + 1;
        }
        investment.userTotalValue += deposit;

        total_deposited = total_deposited + deposit;
        total_amount = total_amount + _amount;

        Referrer storage userReferrer = referrers[msg.sender];
        if(userReferrer.referrals.length > 0){
            userReferrer.referrerRewardLimit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
            if(userReferrer.totalInvestment >= teamRewardThreshold){
                uint256 statistics = 0;
                if(userReferrer.teamRewardTime == 0){
                    userReferrer.teamRewardTime = block.timestamp;
                    statistics = (userReferrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                    userReferrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                    userReferrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                }
            }
        }
            
        User storage user = referrerlist[investAddress];

        if(user.referrer_addr != address(0)){
            referrers[user.referrer_addr].totalInvestment += deposit;
            uint256 staticReward = deposit.mul(staticRewardRate).div(100);
            Referrer storage referrer = referrers[user.referrer_addr];
            Lock[] storage userLocks = locks[user.referrer_addr];
            if(referrer.totalReferrerRaward < referrer.referrerRewardLimit){
                if(referrer.totalReferrerRaward + staticReward < referrer.referrerRewardLimit){
                    referrer.noExtract += staticReward;
                    if(referrer.noExtract >= referrer.referrerRewardLimit){
                        for (uint256 i = 0; i < userLocks.length; i++) {
                            Lock storage lock = userLocks[i];
                            lock.releaseRate = 0;
                        }
                    }
                }else{
                    referrer.noExtract = referrer.referrerRewardLimit - referrer.totalReferrerRaward;
                    for (uint256 i = 0; i < userLocks.length; i++) {
                        Lock storage lock = userLocks[i];
                        lock.releaseRate = 0;
                    }
                }
            }
            
            if(referrer.totalInvestment >= teamRewardThreshold){
                uint256 statistics = 0;
                if(referrer.teamRewardTime == 0){
                    referrer.teamRewardTime = block.timestamp;
                    statistics = (referrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                    referrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                    referrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                }else{
                    uint256 team_reward = (block.timestamp.sub(referrer.teamRewardTime)).mul(referrer.teamRewardRate);
                    if(referrer.totalReferrerRaward < referrer.referrerRewardLimit){
                        if(referrer.totalReferrerRaward + team_reward < referrer.referrerRewardLimit){
                            referrer.noExtract += team_reward;
                            if(referrer.noExtract >= referrer.referrerRewardLimit){
                                for (uint256 i = 0; i < userLocks.length; i++) {
                                    Lock storage lock = userLocks[i];
                                    lock.releaseRate = 0;
                                }
                            }
                        }else{
                            referrer.noExtract = referrer.referrerRewardLimit - referrer.totalReferrerRaward;
                            for (uint256 i = 0; i < userLocks.length; i++) {
                                Lock storage lock = userLocks[i];
                                lock.releaseRate = 0;
                            }
                        }
                        referrer.teamRewardTime = block.timestamp;
                        statistics = (referrer.totalInvestment.sub(teamRewardThreshold)).div(teamRewardThresholdStep);
                        referrer.teamRewardRate = teamRewardThresholdStepRate.mul(statistics).div(86400);
                        referrer.teamRewardRate += teamRewardThresholdRate.div(86400);
                    }
                }
            }
        }

        emit EsgInvestByOwner(investAddress, _amount, price);
        return true;
    }

    function claim() public returns (bool) {
        require(claimEnabled == true, "No claim allowed!");
        Lock[] storage userLocks = locks[msg.sender];
        require(userLocks.length > 0, "No locked amount.");

        uint256 totalInterest = 0;
        Investment storage investment = investments[msg.sender];
        uint256 userDeposit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
        uint256 userWithdraw = investment.withdraw;
        require(userDeposit > userWithdraw, "All investments have been fully withdrawn");

        for (uint256 i = 0; i < userLocks.length; i++) {
            Lock storage lock = userLocks[i];
            uint256 interest = (block.timestamp.sub(investment.lastCollectionTime)).mul(lock.releaseRate);
            if (interest > 0) {
                totalInterest += interest;
            }
        }

        Referrer storage referrer_user = referrers[msg.sender];
        if(userDeposit - userWithdraw >= referralThreshold){
            if(referrer_user.totalInvestment > 0){
                if(referrer_user.totalReferrerRaward + referrer_user.noExtract <= referrer_user.referrerRewardLimit){
                    totalInterest += referrer_user.noExtract;
                    referrer_user.totalReferrerRaward += referrer_user.noExtract;
                    if(referrer_user.totalReferrerRaward > referrer_user.referrerRewardLimit){
                        referrer_user.totalReferrerRaward = referrer_user.referrerRewardLimit;
                    }
                    referrer_user.noExtract = 0;
                }else{
                    if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                        totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                    }
                    referrer_user.totalReferrerRaward = referrer_user.referrerRewardLimit;
                    referrer_user.noExtract = 0;
                }
                
                uint256 team_reward = (block.timestamp.sub(referrer_user.teamRewardTime)).mul(referrer_user.teamRewardRate);
                if(referrer_user.teamRewardTime > 0 && referrer_user.teamRewardRate > 0){
                    if(referrer_user.totalReferrerRaward + team_reward <= referrer_user.referrerRewardLimit){
                        totalInterest += team_reward;
                        referrer_user.totalReferrerRaward += team_reward;
                        if(referrer_user.totalReferrerRaward > referrer_user.referrerRewardLimit){
                            referrer_user.totalReferrerRaward = referrer_user.referrerRewardLimit;
                        }
                        referrer_user.teamRewardTime = block.timestamp;
                    }else{
                        if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                            totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                        }
                        referrer_user.totalReferrerRaward = referrer_user.referrerRewardLimit;
                        referrer_user.teamRewardTime = block.timestamp;
                    }
                }
            }
        }
        require(totalInterest > 0, "No interest to claim.");
        investment.lastCollectionTime = block.timestamp;

        uint256 transfer_amount = 0;
        uint256 feeAmount = 0;
        uint256 total_withdraw = investment.withdraw + totalInterest;
        if(total_withdraw >= userDeposit){
            transfer_amount = (userDeposit.sub(userWithdraw)).div(price);
            investment.withdraw = userDeposit;
            feeAmount = transfer_amount.mul(fee).div(100);
            esg.transfer(feeWallet, feeAmount);   
            esg.transfer(msg.sender, transfer_amount.sub(feeAmount));
            for (uint256 i = 0; i < userLocks.length; i++) {
                Lock storage user_lock = userLocks[i];
                user_lock.releaseRate = 0;
            }
            if(referrer_user.totalInvestment > 0){
                referrer_user.teamRewardTime = 0;
                referrer_user.teamRewardRate = 0;
            }
        }else{
            transfer_amount = totalInterest.div(price);
            investment.withdraw += totalInterest;
            feeAmount = transfer_amount.mul(fee).div(100);
            esg.transfer(feeWallet, feeAmount);
            esg.transfer(msg.sender, transfer_amount.sub(feeAmount));
        }
        total_claim_amount += transfer_amount;
        total_extracted += transfer_amount.mul(price);
        
        User storage user = referrerlist[msg.sender];
        if (user.referrer_addr != address(0)) {
            Referrer storage referrer = referrers[user.referrer_addr];
            uint256 dynamic_reward = totalInterest.mul(dynamicRewardRate).div(100);
            Lock[] storage referrerLocks = locks[user.referrer_addr];
            if(referrer.totalReferrerRaward < referrer.referrerRewardLimit){
                if(referrer.totalReferrerRaward + dynamic_reward < referrer.referrerRewardLimit){
                    referrer.noExtract += dynamic_reward;
                    if(referrer.noExtract >= referrer.referrerRewardLimit){
                        for (uint256 i = 0; i < userLocks.length; i++) {
                            Lock storage lock = userLocks[i];
                            lock.releaseRate = 0;
                        }
                    }
                }else{
                    referrer.noExtract = referrer.referrerRewardLimit - referrer.totalReferrerRaward;
                    for (uint256 i = 0; i < referrerLocks.length; i++) {
                        Lock storage referrer_lock = referrerLocks[i];
                        referrer_lock.releaseRate = 0;
                    }
                }
            }
        }

        emit EsgClaimed (msg.sender, transfer_amount, price); 
        return true;
    }

    function getClaimAmount(address _user) public view returns (uint256) {
        require(_user != address(0), "_user cannot be 0x0.");
        Lock[] storage userLocks = locks[_user];
        uint256 totalInterest = 0;
        Investment storage investment = investments[_user];
        uint256 userDeposit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
        uint256 userWithdraw = investment.withdraw;
        if(userWithdraw >= userDeposit){
            return 0;
        }

        for (uint256 i = 0; i < userLocks.length; i++) {
            Lock storage lock = userLocks[i];
            uint256 interest = (block.timestamp.sub(investment.lastCollectionTime)).mul(lock.releaseRate);
            if (interest > 0) {
                totalInterest += interest;
            }
        }

        Referrer storage referrer_user = referrers[_user];
        uint256 total_reward = referrer_user.totalReferrerRaward;
        if(userDeposit.sub(userWithdraw) >= referralThreshold){
            if(referrer_user.totalInvestment > 0){
                if(total_reward + referrer_user.noExtract <= referrer_user.referrerRewardLimit){
                    totalInterest += referrer_user.noExtract;
                    total_reward += referrer_user.noExtract;
                }else{
                    if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                        totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                        total_reward = referrer_user.referrerRewardLimit;
                    }
                }
                
                uint256 team_reward = (block.timestamp.sub(referrer_user.teamRewardTime)).mul(referrer_user.teamRewardRate);
                if(referrer_user.teamRewardTime > 0 && referrer_user.teamRewardRate > 0){
                    if(total_reward + team_reward <= referrer_user.referrerRewardLimit){
                        totalInterest += team_reward;
                    }else{
                        if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                            totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                        }
                    }
                }
            }
        }

        uint256 total_withdraw = investment.withdraw + totalInterest;
        uint256 transfer_amount = 0;
        if(total_withdraw >= userDeposit){   
            transfer_amount = userDeposit.sub(userWithdraw);
        }else{
            transfer_amount = totalInterest;
        }
        return transfer_amount;
    }

    function getNoExtract(address _user) public view returns (uint256) {
        require(_user != address(0), "_user cannot be 0x0.");
        uint256 totalInterest = 0;
        Investment storage investment = investments[_user];
        uint256 userDeposit = investment.userTotalValue.mul(lockRates).div(100).add(investment.userTotalValue);
        uint256 userWithdraw = investment.withdraw;
        if(userWithdraw >= userDeposit){
            return 0;
        }

        Referrer storage referrer_user = referrers[_user];
        uint256 total_reward = referrer_user.totalReferrerRaward;
        if(userDeposit.sub(userWithdraw) >= referralThreshold){
            if(referrer_user.totalInvestment > 0){
                if(total_reward + referrer_user.noExtract <= referrer_user.referrerRewardLimit){
                    totalInterest += referrer_user.noExtract;
                    total_reward += referrer_user.noExtract;
                }else{
                    if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                        totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                        total_reward = referrer_user.referrerRewardLimit;
                    }
                }
                
                uint256 team_reward = (block.timestamp.sub(referrer_user.teamRewardTime)).mul(referrer_user.teamRewardRate);
                if(referrer_user.teamRewardTime > 0 && referrer_user.teamRewardRate > 0){
                    if(total_reward + team_reward <= referrer_user.referrerRewardLimit){
                        totalInterest += team_reward;
                    }else{
                        if(referrer_user.referrerRewardLimit > referrer_user.totalReferrerRaward){
                            totalInterest += referrer_user.referrerRewardLimit - referrer_user.totalReferrerRaward;
                        }
                    }
                }
            }
        }

        uint256 total_withdraw = investment.withdraw + totalInterest;
        uint256 transfer_amount = 0;
        if(total_withdraw >= userDeposit){
            transfer_amount = userDeposit.sub(userWithdraw); 
        }else{
            transfer_amount = totalInterest;
        }
        return transfer_amount;
    }

    function changeLockInfo(address _user, uint256 _rate, uint256 i) public onlyOwner returns (bool) {
        require(_user != address(0), "_user cannot be 0x0.");
        Lock storage userLocks = locks[_user][i];
        userLocks.releaseRate = _rate;

        emit EsgChangeLockInfo(_user, _rate, i);
        return true;
    }

    function changeInvestmentInfo(address _user, uint256 _userTotalValue, uint256 _withdraw, uint256 _lastCollectionTime) public onlyOwner returns (bool) {
        require(_user != address(0), "_user cannot be 0x0.");
        Investment storage investment = investments[_user];
        investment.userTotalValue = _userTotalValue;
        investment.withdraw = _withdraw;
        investment.lastCollectionTime = _lastCollectionTime;

        emit EsgChangeInvestmentInfo(_user, _userTotalValue, _withdraw, _lastCollectionTime);
        return true;
    }

    function changeReferrerInfo(address _user, uint256 _totalInvestment, uint256 _referrerRewardLimit, uint256 _totalReferrerRaward, uint256 _teamRewardTime, uint256 _teamRewardRate, uint256 _noExtract) public onlyOwner returns (bool) {
        require(_user != address(0), "_user cannot be 0x0.");
        Referrer storage referrer = referrers[_user];
        referrer.totalInvestment = _totalInvestment;
        referrer.referrerRewardLimit = _referrerRewardLimit;
        referrer.totalReferrerRaward = _totalReferrerRaward;
        referrer.teamRewardTime = _teamRewardTime;
        referrer.teamRewardRate = _teamRewardRate;
        referrer.noExtract = _noExtract;

        emit EsgChangeReferrerInfo(_user, _totalInvestment, _referrerRewardLimit, _totalReferrerRaward, _teamRewardTime, _teamRewardRate, _noExtract);
        return true;
    }

    function getLockInfo(address _user) public view returns (
            uint256[] memory,
            uint256[] memory,
            uint256[] memory,
            uint256[] memory,
            uint256[] memory,
            uint256[] memory,
            uint256[] memory
        )
    {
        Lock[] storage userLocks = locks[_user];
        uint256 length = userLocks.length;

        uint256[] memory amounts = new uint256[](length);
        uint256[] memory esgprices = new uint256[](length);
        uint256[] memory values = new uint256[](length);
        uint256[] memory starts = new uint256[](length);
        uint256[] memory ends = new uint256[](length);
        uint256[] memory investdays = new uint256[](length);
        uint256[] memory rates = new uint256[](length);

        for (uint256 i = 0; i < length; i++) {
            Lock storage lock = userLocks[i];
            amounts[i] = lock.amount;
            esgprices[i] = lock.esgPrice;
            values[i] = lock.value;
            starts[i] = lock.start;
            ends[i] = lock.end;
            investdays[i] = lock.investDays;
            rates[i] = lock.releaseRate;
        }

        return (amounts, esgprices, values, starts, ends, investdays, rates);
    }

    function transferOwnership(address newOwner) onlyOwner public {
        if (newOwner != address(0)) {
        owner = newOwner;
      }
    }
}

File 2 of 3 : SafeMath.sol
pragma solidity ^0.5.16;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction underflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot underflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers.
     * Reverts with custom message on division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    /**
   * @dev gives square root of given x.
   */
  function sqrt(uint256 x) internal pure returns(uint256 y) {
        uint256 z = ((add(x, 1)) / 2);
        y = x;
        while (z < y) {
            y = z;
            z = ((add((x / z), z)) / 2);
        }
  }

  /**
   * @dev gives square. multiplies x by x
   */
  function sq(uint256 x) internal pure returns(uint256) {
       return (mul(x, x));
  }

  /**
   * @dev x to the power of y
   */
  function pwr(uint256 x, uint256 y) internal pure returns(uint256) {
    if (x == 0)
      return (0);
    else if (y == 0)
      return (1);
    else {
      uint256 z = x;
      for (uint256 i = 1; i < y; i++)
        z = mul(z, x);
      return (z);
    }
  }
}

File 3 of 3 : EIP20Interface.sol
pragma solidity ^0.5.16;

/**
 * @title ERC 20 Token Standard Interface
 *  https://eips.ethereum.org/EIPS/eip-20
 */
interface EIP20Interface {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);

    /**
      * @notice Get the total number of tokens in circulation
      * @return The supply of tokens
      */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Gets the balance of the specified address
     * @param owner The address from which the balance will be retrieved
     * @return The balance
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
      * @notice Transfer `amount` tokens from `msg.sender` to `dst`
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transfer(address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Transfer `amount` tokens from `src` to `dst`
      * @param src The address of the source account
      * @param dst The address of the destination account
      * @param amount The number of tokens to transfer
      * @return Whether or not the transfer succeeded
      */
    function transferFrom(address src, address dst, uint256 amount) external returns (bool success);

    /**
      * @notice Approve `spender` to transfer up to `amount` from `src`
      * @dev This will overwrite the approval amount for `spender`
      *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
      * @param spender The address of the account which may transfer tokens
      * @param amount The number of tokens that are approved (-1 means infinite)
      * @return Whether or not the approval succeeded
      */
    function approve(address spender, uint256 amount) external returns (bool success);

    /**
      * @notice Get the current allowance from `owner` for `spender`
      * @param owner The address of the account which owns the tokens to be spent
      * @param spender The address of the account which may transfer tokens
      * @return The number of tokens allowed to be spent (-1 means infinite)
      */
    function allowance(address owner, address spender) external view returns (uint256 remaining);

    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 300
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"esgAddress","type":"address"},{"internalType":"address","name":"feeWalletAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_userTotalValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_withdraw","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_lastCollectionTime","type":"uint256"}],"name":"EsgChangeInvestmentInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"i","type":"uint256"}],"name":"EsgChangeLockInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_totalInvestment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_referrerRewardLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_totalReferrerRaward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_teamRewardTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_teamRewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_noExtract","type":"uint256"}],"name":"EsgChangeReferrerInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EsgClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EsgInvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EsgInvestByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"SetInvitee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"referrerAddress","type":"address"},{"indexed":false,"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"SetInviteeByOwner","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_userTotalValue","type":"uint256"},{"internalType":"uint256","name":"_withdraw","type":"uint256"},{"internalType":"uint256","name":"_lastCollectionTime","type":"uint256"}],"name":"changeInvestmentInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"i","type":"uint256"}],"name":"changeLockInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_totalInvestment","type":"uint256"},{"internalType":"uint256","name":"_referrerRewardLimit","type":"uint256"},{"internalType":"uint256","name":"_totalReferrerRaward","type":"uint256"},{"internalType":"uint256","name":"_teamRewardTime","type":"uint256"},{"internalType":"uint256","name":"_teamRewardRate","type":"uint256"},{"internalType":"uint256","name":"_noExtract","type":"uint256"}],"name":"changeReferrerInfo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dynamicRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"esg","outputs":[{"internalType":"contract EIP20Interface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"referrerAddress","type":"address"}],"name":"getInviteelist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getLockInfo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNoExtract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"getReferrer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"invest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"investAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"investByOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"investEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_days1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_days2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_days3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_days4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"invest_days5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"investments","outputs":[{"internalType":"uint256","name":"userTotalValue","type":"uint256"},{"internalType":"uint256","name":"withdraw","type":"uint256"},{"internalType":"uint256","name":"lastCollectionTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lockRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"locks","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"esgPrice","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"investDays","type":"uint256"},{"internalType":"uint256","name":"releaseRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referralThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrerlist","outputs":[{"internalType":"address","name":"referrer_addr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"uint256","name":"totalInvestment","type":"uint256"},{"internalType":"uint256","name":"referrerRewardLimit","type":"uint256"},{"internalType":"uint256","name":"totalReferrerRaward","type":"uint256"},{"internalType":"uint256","name":"teamRewardTime","type":"uint256"},{"internalType":"uint256","name":"teamRewardRate","type":"uint256"},{"internalType":"uint256","name":"noExtract","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_claimEnabled","type":"bool"}],"name":"setClaimEnabled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_dynamicRewardRate","type":"uint256"}],"name":"setDynamicRewardRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"days1","type":"uint256"},{"internalType":"uint256","name":"days2","type":"uint256"},{"internalType":"uint256","name":"days3","type":"uint256"},{"internalType":"uint256","name":"days4","type":"uint256"},{"internalType":"uint256","name":"days5","type":"uint256"}],"name":"setInvestDays","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"_investEnabled","type":"bool"}],"name":"setInvestEnabled","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"setInvitee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"referrerAddress","type":"address"},{"internalType":"address","name":"inviteeAddress","type":"address"}],"name":"setInviteeByOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_lockRates","type":"uint256"}],"name":"setLockRates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_referralThreshold","type":"uint256"}],"name":"setReferralThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_staticRewardRate","type":"uint256"}],"name":"setStaticRewardRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_teamRewardThreshold","type":"uint256"}],"name":"setTeamRewardThreshold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_teamRewardThresholdRate","type":"uint256"}],"name":"setTeamRewardThresholdRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_teamRewardThresholdStep","type":"uint256"}],"name":"setTeamRewardThresholdStep","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_teamRewardThresholdStepRate","type":"uint256"}],"name":"setTeamRewardThresholdStepRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"staticRewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"teamRewardThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"teamRewardThresholdRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"teamRewardThresholdStep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"teamRewardThresholdStepRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_claim_amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_extracted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"total_user","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600560065561015e60075561015e60085561015e60095561015e600a5561012c600b556b033b2e3c9fd0803ce8000000600c556064601255600a601355600a6014556b60ef6b1aba6f0723300000006015556a18d0bf423c03d8de0000006016556b204fce5e3e250261100000006017556a084595161401484a0000006018553480156200009157600080fd5b50604051620041b6380380620041b6833981016040819052620000b49162000128565b601a8054610100600162010000600160b01b03199092163362010000021760ff19169190911761ff001916179055600080546001600160a01b03199081166001600160a01b0394851617909155600580549091169190921617905562000193565b8051620001228162000179565b92915050565b600080604083850312156200013c57600080fd5b60006200014a858562000115565b92505060206200015d8582860162000115565b9150509250929050565b60006001600160a01b03821662000122565b620001848162000167565b81146200019057600080fd5b50565b61401380620001a36000396000f3fe608060405234801561001057600080fd5b506004361061036d5760003560e01c80637c42d2b5116101d3578063b553207e11610104578063d88e71e0116100a2578063de560cca1161007c578063de560cca146106d1578063e085c952146106d9578063e9920181146106e1578063f2fde38b146106f45761036d565b8063d88e71e0146106ae578063ddca3f43146106b6578063dde070e8146106be5761036d565b8063c84ba291116100de578063c84ba29114610681578063cac0652214610689578063d5ef14231461069e578063d660e6ab146106a65761036d565b8063b553207e14610653578063b6812eaf1461065b578063b6d4efd01461066e5761036d565b806396b9886211610171578063a035b1fe1161014b578063a035b1fe1461060a578063a0cbadb314610612578063ad82c2541461061a578063b425f8021461062d5761036d565b806396b98862146105c25780639cbdc6c1146105e45780639fd1b2fc146105f75761036d565b80638da5cb5b116101ad5780638da5cb5b146105815780638fc1ea1e1461058957806391b7f5ed1461059c57806392929a09146105af5761036d565b80637c42d2b5146105535780637cb04a211461055b5780638016f8241461056e5761036d565b80635a6da1e9116102ad57806369fe0e2d1161024b57806376ec6e8c1161022557806376ec6e8c14610512578063788af7861461052557806379a53592146105385780637bfc52111461054b5761036d565b806369fe0e2d146104d157806371f4f3fb146104e45780637238ccdb146104ec5761036d565b80635fc43dd0116102875780635fc43dd01461049b57806364e731aa146104ae57806365ab4477146104c1578063673cd98e146104c95761036d565b80635a6da1e9146104835780635ab09c1e1461048b5780635ebd5872146104935761036d565b8063384c9aef1161031a5780634a9fefc7116102f45780634a9fefc7146104405780634e71d92d146104605780634fa77a4814610468578063513eb0221461047b5761036d565b8063384c9aef146103fe57806340912990146104135780634a3b68cc1461041b5761036d565b80632e5e83341161034b5780632e5e8334146103b6578063357b97dd146103cb57806336d8a893146103de5761036d565b806323361b79146103725780632866ed211461039b5780632afcf480146103a3575b600080fd5b610385610380366004613359565b610707565b6040516103929190613d26565b60405180910390f35b6103856107e0565b6103856103b1366004613492565b6107ee565b6103be610f90565b6040516103929190613eb3565b6103856103d936600461330c565b610f96565b6103f16103ec366004613284565b611074565b6040516103929190613c8c565b61041161040c366004613492565b611115565b005b6103be61114a565b61042e610429366004613284565b611150565b60405161039296959493929190613ecf565b61045361044e366004613284565b61118c565b6040516103929190613b43565b6103856111d3565b610385610476366004613284565b61192d565b6103be611b07565b6103be611b0d565b6103be611b13565b6103be611b19565b6103856104a93660046132a2565b611b1f565b6103856104bc3660046132dc565b611d5e565b6103be612491565b6103be612497565b6104116104df366004613492565b61249d565b6103856124f2565b6104ff6104fa366004613284565b6124fb565b6040516103929796959493929190613c9d565b610411610520366004613492565b61279c565b6104116105333660046134b0565b6127d1565b610411610546366004613492565b6128b8565b6103be6128ed565b6103be6128f3565b610411610569366004613492565b6128f9565b6103be61057c366004613284565b61292e565b610453612ae1565b610411610597366004613456565b612af6565b6104116105aa366004613492565b612b39565b6104116105bd366004613456565b612b8e565b6105d56105d0366004613284565b612bd8565b60405161039293929190613ec1565b6103856105f23660046133ba565b612bf8565b610411610605366004613492565b612cea565b6103be612d1f565b6103be612d25565b610411610628366004613492565b612d2b565b61064061063b3660046132dc565b612d60565b6040516103929796959493929190613f1e565b6103be612db7565b610411610669366004613492565b612dbd565b61041161067c366004613492565b612df2565b6103be612e27565b610691612e2d565b6040516103929190613d34565b6103be612e3c565b6103be612e42565b6103be612e48565b6103be612e4e565b6103be6106cc366004613284565b612e54565b6103be613079565b6103be61307f565b6104536106ef366004613284565b613085565b610411610702366004613284565b6130a0565b601a546000906201000090046001600160a01b031633146107435760405162461bcd60e51b815260040161073a90613d73565b60405180910390fd5b6001600160a01b0385166107695760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b0385166000908152600260208190526040918290208681556001810186905590810184905590517f54840d35ba54ac621adbc02d6b559075470a1a77f6f5b5394f7a2e994dd8230b906107ca908890889088908890613be6565b60405180910390a160019150505b949350505050565b601a54610100900460ff1681565b601a5460009060ff1615156001146108185760405162461bcd60e51b815260040161073a90613de3565b600082116108385760405162461bcd60e51b815260040161073a90613d53565b6000546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061086c90339030908790600401613b51565b602060405180830381600087803b15801561088657600080fd5b505af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108be9190810190613474565b5033600090815260016020526040902080544291901561094057336000908152600260205260408120805460125491929161092491906109189060649061090c90849063ffffffff61311216565b9063ffffffff61314c16565b9063ffffffff61318e16565b60018301549091508082141561093c57600283018590555b5050505b601954600090819061095990879063ffffffff61311216565b90506b019d971e4fe8401e74000000811015610979576007549150610a34565b6b019d971e4fe8401e7400000081101580156109a057506b06765c793fa10079d000000081105b156109af576008549150610a34565b6b06765c793fa10079d000000081101580156109d657506b1027e72f1f1281308800000081105b156109e5576009549150610a34565b6b1027e72f1f128130880000008110158015610a0c57506b204fce5e3e2502611000000081105b15610a1b57600a549150610a34565b6b204fce5e3e250261100000008110610a3457600b5491505b60016000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060e00160405280888152602001601954815260200183815260200186815260200184620151800287018152602001848152602001610aba6201518061090c8761090c88610918606461090c6012548d61311290919063ffffffff16565b90528154600181810184556000938452602080852084516007909402019283558084015191830191909155604080840151600280850191909155606085015160038501556080850151600485015560a0850151600585015560c0909401516006909301929092553384529190915290208054610b415760028101859055600e805460010190555b805482018155600d805483019055600f805488019055336000908152600360205260409020805415610c1a578154601254610b8f91906109189060649061090c90849063ffffffff61311216565b6002820155601554600182015410610c1a576004810154600090610c18574260048301556017546015546001840154610bd3929161090c919063ffffffff6131b316565b9050610bf16201518061090c8360185461311290919063ffffffff16565b6005830155601654610c0c906201518063ffffffff61314c16565b60058301805490910190555b505b33600090815260046020526040902080546001600160a01b031615610f425780546001600160a01b03166000908152600360205260408120600101805486019055601354610c769060649061090c90889063ffffffff61311216565b82546001600160a01b03166000908152600360208181526040808420600190925290922060028301549183015493945091921015610d5b578160020154838360030154011015610d1357600682018054840190819055600283015411610d0e5760005b8154811015610d0c576000828281548110610cf057fe5b6000918252602082206006600790920201015550600101610cd9565b505b610d5b565b6003820154600283015403600683015560005b8154811015610d59576000828281548110610d3d57fe5b6000918252602082206006600790920201015550600101610d26565b505b601554826001015410610f3e576004820154600090610de3574260048401556017546015546001850154610d9a929161090c919063ffffffff6131b316565b9050610db86201518061090c8360185461311290919063ffffffff16565b6005840155601654610dd3906201518063ffffffff61314c16565b6005840180549091019055610f3c565b6000610e108460050154610e048660040154426131b390919063ffffffff16565b9063ffffffff61311216565b9050836002015484600301541015610f3a578360020154818560030154011015610e8757600684018054820190819055600285015411610e825760005b8354811015610e80576000848281548110610e6457fe5b6000918252602082206006600790920201015550600101610e4d565b505b610ecf565b6003840154600285015403600685015560005b8354811015610ecd576000848281548110610eb157fe5b6000918252602082206006600790920201015550600101610e9a565b505b4260048501556017546015546001860154610ef5929161090c919063ffffffff6131b316565b9150610f136201518061090c8460185461311290919063ffffffff16565b6005850155601654610f2e906201518063ffffffff61314c16565b60058501805490910190555b505b505b5050505b7f3eb0f553d9ec38e0ff3a72db450f9d6f5e372e70e824a3195a09ead1c01fb876338a601954604051610f7793929190613b94565b60405180910390a160019750505050505050505b919050565b60085481565b601a546000906201000090046001600160a01b03163314610fc95760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038416610fef5760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038416600090815260016020526040812080548490811061101357fe5b906000526020600020906007020190508381600601819055507f47f6b9e3974adf5c2be82125be9f7a02fb53010c65a3bfd9f4751cdf547538cf85858560405161105f93929190613bd8565b60405180910390a160019150505b9392505050565b60606001600160a01b03821661109c5760405162461bcd60e51b815260040161073a90613dd3565b6001600160a01b038216600090815260036020908152604091829020805483518184028101840190945280845290929183919083018282801561110857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110ea575b5050505050915050919050565b601a546201000090046001600160a01b031633146111455760405162461bcd60e51b815260040161073a90613d73565b601255565b600e5481565b60036020528060005260406000206000915090508060010154908060020154908060030154908060040154908060050154908060060154905086565b60006001600160a01b0382166111b45760405162461bcd60e51b815260040161073a90613e33565b506001600160a01b039081166000908152600460205260409020541690565b601a5460009060ff6101009091041615156001146112035760405162461bcd60e51b815260040161073a90613e93565b33600090815260016020526040902080546112305760405162461bcd60e51b815260040161073a90613e23565b33600090815260026020526040812080546012548391611262916109189060649061090c90849063ffffffff61311216565b60018301549091508082116112895760405162461bcd60e51b815260040161073a90613e63565b60005b85548110156112eb5760008682815481106112a357fe5b9060005260206000209060070201905060006112d48260060154610e048860020154426131b390919063ffffffff16565b905080156112e157958601955b505060010161128c565b50336000908152600360205260409020600c54828403106114445760018101541561144457806002015481600601548260030154011161135d57600681015460038201805482019081905560028301549690910195101561135157600281015460038201555b6000600682015561138f565b80600301548160020154111561137d578060030154816002015403850194505b60028101546003820155600060068201555b60006113b08260050154610e048460040154426131b390919063ffffffff16565b9050600082600401541180156113ca575060008260050154115b15611442578160020154818360030154011161141157600382018054820190819055600283015496820196101561140657600282015460038301555b426004830155611442565b816003015482600201541115611431578160030154826002015403860195505b600282015460038301554260048301555b505b600085116114645760405162461bcd60e51b815260040161073a90613dc3565b42600285015560018401546000908190870185811061162b576019546114949061090c888863ffffffff6131b316565b92508587600101819055506114b9606461090c6006548661311290919063ffffffff16565b60005460055460405163a9059cbb60e01b81529294506001600160a01b039182169263a9059cbb926114f19216908690600401613bca565b602060405180830381600087803b15801561150b57600080fd5b505af115801561151f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115439190810190613474565b506000546001600160a01b031663a9059cbb33611566868663ffffffff6131b316565b6040518363ffffffff1660e01b8152600401611583929190613b79565b602060405180830381600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115d59190810190613474565b5060005b895481101561160c5760008a82815481106115f057fe5b60009182526020822060066007909202010155506001016115d9565b506001840154156116265760006004850181905560058501555b611785565b60195461163f90899063ffffffff61314c16565b6001880180548a0190556006549093506116679060649061090c90869063ffffffff61311216565b60005460055460405163a9059cbb60e01b81529294506001600160a01b039182169263a9059cbb9261169f9216908690600401613bca565b602060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f19190810190613474565b506000546001600160a01b031663a9059cbb33611714868663ffffffff6131b316565b6040518363ffffffff1660e01b8152600401611731929190613b79565b602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117839190810190613474565b505b60118054840190556019546117a190849063ffffffff61311216565b60108054909101905533600090815260046020526040902080546001600160a01b0316156118df5780546001600160a01b031660009081526003602052604081206014549091906118009060649061090c908e9063ffffffff61311216565b83546001600160a01b0316600090815260016020526040902060028401546003850154929350909110156118db5782600201548284600301540110156118935760068301805483019081905560028401541161188e5760005b8d5481101561188c5760008e828154811061187057fe5b6000918252602082206006600790920201015550600101611859565b505b6118db565b6003830154600284015403600684015560005b81548110156118d95760008282815481106118bd57fe5b60009182526020822060066007909202010155506001016118a6565b505b5050505b7f4343fc0436cb075772fdb7e28d5380cc610e5334add5537e2d2b2946b8e2836f338560195460405161191493929190613b94565b60405180910390a160019a505050505050505050505090565b60006001600160a01b0382166119555760405162461bcd60e51b815260040161073a90613e33565b6001600160a01b0380831660009081526004602052604090208054909116156119905760405162461bcd60e51b815260040161073a90613e83565b336000908152600260205260409020600c54600182015482546012546119d992916119cd916109189060649061090c90849063ffffffff61311216565b9063ffffffff6131b316565b10156119f75760405162461bcd60e51b815260040161073a90613d63565b6001600160a01b0384166000908152600160205260409020805415611a2e5760405162461bcd60e51b815260040161073a90613db3565b33600090815260036020908152604082208054600181018255818452919092200180546001600160a01b0319166001600160a01b0388161790556002810154611a99578254601254611a9391906109189060649061090c90849063ffffffff61311216565b60028201555b6001600160a01b0386166000908152600460205260409081902080546001600160a01b0319163317815590517f5460efa9aaef49adcbdec085b22993bea41d8d5abd3124de8faeea893ce9593a90611af2908990613b43565b60405180910390a15060019695505050505050565b60165481565b60125481565b60095481565b600b5481565b601a546000906201000090046001600160a01b03163314611b525760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038316611b785760405162461bcd60e51b815260040161073a90613dd3565b6001600160a01b038216611b9e5760405162461bcd60e51b815260040161073a90613e33565b6001600160a01b038083166000908152600460205260409020805490911615611bd95760405162461bcd60e51b815260040161073a90613e83565b6001600160a01b0384166000908152600260205260409020600c5460018201548254601254611c1f92916119cd916109189060649061090c90849063ffffffff61311216565b1015611c3d5760405162461bcd60e51b815260040161073a90613d63565b6001600160a01b0384166000908152600160205260409020805415611c745760405162461bcd60e51b815260040161073a90613db3565b6001600160a01b03868116600090815260036020908152604082208054600181018255818452919092200180546001600160a01b031916928816929092179091556002810154611ce6578254601254611ce091906109189060649061090c90849063ffffffff61311216565b60028201555b6001600160a01b038681166000908152600460205260409081902080546001600160a01b031916928a16929092178255517f0d984a86460fe7e0cd7646fc932b7cb5185793e3053c6d6eb5f73fb94b9a969490611d46908a908a90613baf565b60405180910390a16001955050505050505b92915050565b601a546000906201000090046001600160a01b03163314611d915760405162461bcd60e51b815260040161073a90613d73565b601a5460ff161515600114611db85760405162461bcd60e51b815260040161073a90613de3565b60008211611dd85760405162461bcd60e51b815260040161073a90613d53565b6019546000908190611df190859063ffffffff61311216565b90506b019d971e4fe8401e74000000811015611e11576007549150611ecc565b6b019d971e4fe8401e740000008110158015611e3857506b06765c793fa10079d000000081105b15611e47576008549150611ecc565b6b06765c793fa10079d00000008110158015611e6e57506b1027e72f1f1281308800000081105b15611e7d576009549150611ecc565b6b1027e72f1f128130880000008110158015611ea457506b204fce5e3e2502611000000081105b15611eb357600a549150611ecc565b6b204fce5e3e250261100000008110611ecc57600b5491505b336000908152600160205260409020805442919015611f35573360009081526002602052604081208054601254919291611f1991906109189060649061090c90849063ffffffff61311216565b600183015490915080821415611f3157600283018590555b5050505b60016000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060e00160405280888152602001601954815260200185815260200184815260200186620151800285018152602001868152602001611fbb6201518061090c8961090c8a610918606461090c6012548f61311290919063ffffffff16565b90528154600181810184556000938452602080852084516007909402019283558084015191830191909155604080840151600280850191909155606085015160038501556080850151600485015560a0850151600585015560c0909401516006909301929092556001600160a01b038b168452919091529020805461204b5760028101839055600e805460010190555b805484018155600d805485019055600f80548801905533600090815260036020526040902080541561212457815460125461209991906109189060649061090c90849063ffffffff61311216565b60028201556015546001820154106121245760048101546000906121225742600483015560175460155460018401546120dd929161090c919063ffffffff6131b316565b90506120fb6201518061090c8360185461311290919063ffffffff16565b6005830155601654612116906201518063ffffffff61314c16565b60058301805490910190555b505b6001600160a01b03808a1660009081526004602052604090208054909116156124445780546001600160a01b031660009081526003602052604081206001018054880190556013546121849060649061090c908a9063ffffffff61311216565b82546001600160a01b031660009081526003602081815260408084206001909252909220600283015491830154939450919210156122695781600201548383600301540110156122215760068201805484019081905560028301541161221c5760005b815481101561221a5760008282815481106121fe57fe5b60009182526020822060066007909202010155506001016121e7565b505b612269565b6003820154600283015403600683015560005b815481101561226757600082828154811061224b57fe5b6000918252602082206006600790920201015550600101612234565b505b6015548260010154106124405760048201546000906122f15742600484015560175460155460018501546122a8929161090c919063ffffffff6131b316565b90506122c66201518061090c8360185461311290919063ffffffff16565b60058401556016546122e1906201518063ffffffff61314c16565b600584018054909101905561243e565b60006123128460050154610e048660040154426131b390919063ffffffff16565b905083600201548460030154101561243c578360020154818560030154011015612389576006840180548201908190556002850154116123845760005b835481101561238257600084828154811061236657fe5b600091825260208220600660079092020101555060010161234f565b505b6123d1565b6003840154600285015403600685015560005b83548110156123cf5760008482815481106123b357fe5b600091825260208220600660079092020101555060010161239c565b505b42600485015560175460155460018601546123f7929161090c919063ffffffff6131b316565b91506124156201518061090c8460185461311290919063ffffffff16565b6005850155601654612430906201518063ffffffff61314c16565b60058501805490910190555b505b505b5050505b7f9a9654e283717250eb1f515593102e2024a5f6b264ed5659bdc199ae3cf9e3158a8a60195460405161247993929190613bd8565b60405180910390a15060019998505050505050505050565b600c5481565b600f5481565b601a546201000090046001600160a01b031633146124cd5760405162461bcd60e51b815260040161073a90613d73565b600081116124ed5760405162461bcd60e51b815260040161073a90613d93565b600655565b601a5460ff1681565b60608060608060608060606000600160008a6001600160a01b03166001600160a01b031681526020019081526020016000209050600081805490509050606081604051908082528060200260200182016040528015612564578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015612593578160200160208202803883390190505b5090506060836040519080825280602002602001820160405280156125c2578160200160208202803883390190505b5090506060846040519080825280602002602001820160405280156125f1578160200160208202803883390190505b509050606085604051908082528060200260200182016040528015612620578160200160208202803883390190505b50905060608660405190808252806020026020018201604052801561264f578160200160208202803883390190505b50905060608760405190808252806020026020018201604052801561267e578160200160208202803883390190505b50905060005b8881101561277d5760008a828154811061269a57fe5b9060005260206000209060070201905080600001548983815181106126bb57fe5b60200260200101818152505080600101548883815181106126d857fe5b60200260200101818152505080600201548783815181106126f557fe5b602002602001018181525050806003015486838151811061271257fe5b602002602001018181525050806004015485838151811061272f57fe5b602002602001018181525050806005015484838151811061274c57fe5b602002602001018181525050806006015483838151811061276957fe5b602090810291909101015250600101612684565b50959e50939c50919a5098509650945092505050919395979092949650565b601a546201000090046001600160a01b031633146127cc5760405162461bcd60e51b815260040161073a90613d73565b601755565b601a546201000090046001600160a01b031633146128015760405162461bcd60e51b815260040161073a90613d73565b600085116128215760405162461bcd60e51b815260040161073a90613da3565b600084116128415760405162461bcd60e51b815260040161073a90613e43565b600083116128615760405162461bcd60e51b815260040161073a90613e03565b600082116128815760405162461bcd60e51b815260040161073a90613df3565b600081116128a15760405162461bcd60e51b815260040161073a90613ea3565b600794909455600892909255600955600a55600b55565b601a546201000090046001600160a01b031633146128e85760405162461bcd60e51b815260040161073a90613d73565b601655565b60145481565b60155481565b601a546201000090046001600160a01b031633146129295760405162461bcd60e51b815260040161073a90613d73565b601355565b60006001600160a01b0382166129565760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038216600090815260026020526040812080546012548391612991916109189060649061090c90849063ffffffff61311216565b60018301549091508181106129ad576000945050505050610f8b565b6001600160a01b038616600090815260036020819052604090912090810154600c546129df858563ffffffff6131b316565b10612aaa57600182015415612aaa5781600201548260060154820111612a0e5760068201549586019501612a32565b816003015482600201541115612a3257506003810154600282015490810395909501945b6000612a538360050154610e048560040154426131b390919063ffffffff16565b905060008360040154118015612a6d575060008360050154115b15612aa857826002015481830111612a885795860195612aa8565b826003015483600201541115612aa8578260030154836002015403870196505b505b600185015486016000858210612ad157612aca868663ffffffff6131b316565b9050612ad4565b50865b9998505050505050505050565b601a546201000090046001600160a01b031681565b601a546201000090046001600160a01b03163314612b265760405162461bcd60e51b815260040161073a90613d73565b601a805460ff1916911515919091179055565b601a546201000090046001600160a01b03163314612b695760405162461bcd60e51b815260040161073a90613d73565b60008111612b895760405162461bcd60e51b815260040161073a90613e53565b601955565b601a546201000090046001600160a01b03163314612bbe5760405162461bcd60e51b815260040161073a90613d73565b601a80549115156101000261ff0019909216919091179055565b600260208190526000918252604090912080546001820154919092015483565b601a546000906201000090046001600160a01b03163314612c2b5760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038816612c515760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038816600090815260036020819052604091829020600181018a90556002810189905590810187905560048101869055600581018590556006810184905590517f0ebff4f4881dd1e533b0ea6168da45b5c184454dac4f1da5b56766c2c7ea738890612cd1908b908b908b908b908b908b908b90613c24565b60405180910390a160019150505b979650505050505050565b601a546201000090046001600160a01b03163314612d1a5760405162461bcd60e51b815260040161073a90613d73565b601855565b60195481565b60105481565b601a546201000090046001600160a01b03163314612d5b5760405162461bcd60e51b815260040161073a90613d73565b600c55565b60016020528160005260406000208181548110612d7957fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601549497509295509093909287565b60075481565b601a546201000090046001600160a01b03163314612ded5760405162461bcd60e51b815260040161073a90613d73565b601555565b601a546201000090046001600160a01b03163314612e225760405162461bcd60e51b815260040161073a90613d73565b601455565b60175481565b6000546001600160a01b031681565b60185481565b600a5481565b60135481565b60065481565b60006001600160a01b038216612e7c5760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b03821660009081526001602090815260408083206002909252822080546012549293928391612ec4916109189060649061090c90849063ffffffff61311216565b6001830154909150818110612ee157600095505050505050610f8b565b60005b8554811015612f43576000868281548110612efb57fe5b906000526020600020906007020190506000612f2c8260060154610e048860020154426131b390919063ffffffff16565b90508015612f3957958601955b5050600101612ee4565b506001600160a01b038716600090815260036020819052604090912090810154600c54612f76858563ffffffff6131b316565b10613041576001820154156130415781600201548260060154820111612fa55760068201549586019501612fc9565b816003015482600201541115612fc957506003810154600282015490810395909501945b6000612fea8360050154610e048560040154426131b390919063ffffffff16565b905060008360040154118015613004575060008360050154115b1561303f5782600201548183011161301f579586019561303f565b82600301548360020154111561303f578260030154836002015403870196505b505b60018501548601600085821061306857613061868663ffffffff6131b316565b905061306b565b50865b9a9950505050505050505050565b600d5481565b60115481565b6004602052600090815260409020546001600160a01b031681565b601a546201000090046001600160a01b031633146130d05760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b0381161561310f57601a805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038416021790555b50565b60008261312157506000611d58565b8282028284828161312e57fe5b041461106d5760405162461bcd60e51b815260040161073a90613e13565b600061106d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131f5565b60008282018381101561106d5760405162461bcd60e51b815260040161073a90613d83565b600061106d83836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f770081525061322c565b600081836132165760405162461bcd60e51b815260040161073a9190613d42565b50600083858161322257fe5b0495945050505050565b600081848411156132505760405162461bcd60e51b815260040161073a9190613d42565b505050900390565b8035611d5881613faa565b8035611d5881613fbe565b8051611d5881613fbe565b8035611d5881613fc7565b60006020828403121561329657600080fd5b60006107d88484613258565b600080604083850312156132b557600080fd5b60006132c18585613258565b92505060206132d285828601613258565b9150509250929050565b600080604083850312156132ef57600080fd5b60006132fb8585613258565b92505060206132d285828601613279565b60008060006060848603121561332157600080fd5b600061332d8686613258565b935050602061333e86828701613279565b925050604061334f86828701613279565b9150509250925092565b6000806000806080858703121561336f57600080fd5b600061337b8787613258565b945050602061338c87828801613279565b935050604061339d87828801613279565b92505060606133ae87828801613279565b91505092959194509250565b600080600080600080600060e0888a0312156133d557600080fd5b60006133e18a8a613258565b97505060206133f28a828b01613279565b96505060406134038a828b01613279565b95505060606134148a828b01613279565b94505060806134258a828b01613279565b93505060a06134368a828b01613279565b92505060c06134478a828b01613279565b91505092959891949750929550565b60006020828403121561346857600080fd5b60006107d88484613263565b60006020828403121561348657600080fd5b60006107d8848461326e565b6000602082840312156134a457600080fd5b60006107d88484613279565b600080600080600060a086880312156134c857600080fd5b60006134d48888613279565b95505060206134e588828901613279565b94505060406134f688828901613279565b935050606061350788828901613279565b925050608061351888828901613279565b9150509295509295909350565b60006135318383613554565b505060200190565b60006135318383613b3a565b61354e81613f5e565b82525050565b61354e81613f3f565b600061356882613f32565b6135728185613f36565b935061357d83613f2c565b8060005b838110156135ab5781516135958882613525565b97506135a083613f2c565b925050600101613581565b509495945050505050565b60006135c182613f32565b6135cb8185613f36565b93506135d683613f2c565b8060005b838110156135ab5781516135ee8882613539565b97506135f983613f2c565b9250506001016135da565b61354e81613f4a565b61354e81613f65565b600061362182613f32565b61362b8185613f36565b935061363b818560208601613f70565b61364481613fa0565b9093019392505050565b600061365b600f83613f36565b6e24b73b30b634b21030b6b7bab73a1760891b815260200192915050565b6000613686602783613f36565b7f526566657272657220686173206e6f20726566657272616c207175616c69666981526631b0ba34b7b71760c91b602082015260400192915050565b60006136cf602283613f36565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f815261371760f11b602082015260400192915050565b6000613713601b83613f36565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b600061374c601483613f36565b7f466565206d75737420626520706f736974697665000000000000000000000000815260200192915050565b6000613785601e83613f36565b7f64617973312073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006137be601883613f36565b7f54686973206163636f756e7420686164207374616b6564210000000000000000815260200192915050565b60006137f7601583613f36565b7f4e6f20696e74657265737420746f20636c61696d2e0000000000000000000000815260200192915050565b6000613830601e83613f36565b7f7265666572726572416464726573732063616e6e6f74206265203078302e0000815260200192915050565b6000613869601283613f36565b714e6f20696e7665737420616c6c6f7765642160701b815260200192915050565b6000613897601e83613f36565b7f64617973342073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006138d0601e83613f36565b7f64617973332073686f756c642062652067726561746572207468616e20300000815260200192915050565b6000613909602183613f36565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061394c601183613f36565b702737903637b1b5b2b21030b6b7bab73a1760791b815260200192915050565b6000613979601d83613f36565b7f696e7669746565416464726573732063616e6e6f74206265203078302e000000815260200192915050565b60006139b2601e83613f36565b7f64617973322073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006139eb601683613f36565b7f5072696365206d75737420626520706f73697469766500000000000000000000815260200192915050565b6000613a24602983613f36565b7f416c6c20696e766573746d656e74732068617665206265656e2066756c6c79208152683bb4ba34323930bbb760b91b602082015260400192915050565b6000613a6f601483613f36565b7f5f757365722063616e6e6f74206265203078302e000000000000000000000000815260200192915050565b6000613aa8601e83613f36565b7f54686973206163636f756e7420686164206265656e20696e7669746564210000815260200192915050565b6000613ae1601183613f36565b704e6f20636c61696d20616c6c6f7765642160781b815260200192915050565b6000613b0e601e83613f36565b7f64617973352073686f756c642062652067726561746572207468616e20300000815260200192915050565b61354e81613f5b565b60208101611d588284613554565b60608101613b5f8286613545565b613b6c6020830185613554565b6107d86040830184613b3a565b60408101613b878285613545565b61106d6020830184613b3a565b60608101613ba28286613545565b613b6c6020830185613b3a565b60408101613bbd8285613554565b61106d6020830184613554565b60408101613b878285613554565b60608101613ba28286613554565b60808101613bf48287613554565b613c016020830186613b3a565b613c0e6040830185613b3a565b613c1b6060830184613b3a565b95945050505050565b60e08101613c32828a613554565b613c3f6020830189613b3a565b613c4c6040830188613b3a565b613c596060830187613b3a565b613c666080830186613b3a565b613c7360a0830185613b3a565b613c8060c0830184613b3a565b98975050505050505050565b6020808252810161106d818461355d565b60e08082528101613cae818a6135b6565b90508181036020830152613cc281896135b6565b90508181036040830152613cd681886135b6565b90508181036060830152613cea81876135b6565b90508181036080830152613cfe81866135b6565b905081810360a0830152613d1281856135b6565b905081810360c0830152612ad481846135b6565b60208101611d588284613604565b60208101611d58828461360d565b6020808252810161106d8184613616565b60208082528101611d588161364e565b60208082528101611d5881613679565b60208082528101611d58816136c2565b60208082528101611d5881613706565b60208082528101611d588161373f565b60208082528101611d5881613778565b60208082528101611d58816137b1565b60208082528101611d58816137ea565b60208082528101611d5881613823565b60208082528101611d588161385c565b60208082528101611d588161388a565b60208082528101611d58816138c3565b60208082528101611d58816138fc565b60208082528101611d588161393f565b60208082528101611d588161396c565b60208082528101611d58816139a5565b60208082528101611d58816139de565b60208082528101611d5881613a17565b60208082528101611d5881613a62565b60208082528101611d5881613a9b565b60208082528101611d5881613ad4565b60208082528101611d5881613b01565b60208101611d588284613b3a565b60608101613ba28286613b3a565b60c08101613edd8289613b3a565b613eea6020830188613b3a565b613ef76040830187613b3a565b613f046060830186613b3a565b613f116080830185613b3a565b612cdf60a0830184613b3a565b60e08101613c32828a613b3a565b60200190565b5190565b90815260200190565b6000611d5882613f4f565b151590565b6001600160a01b031690565b90565b6000611d58825b6000611d5882613f3f565b60005b83811015613f8b578181015183820152602001613f73565b83811115613f9a576000848401525b50505050565b601f01601f191690565b613fb381613f3f565b811461310f57600080fd5b613fb381613f4a565b613fb381613f5b56fea365627a7a72315820b5b158fa03229187075a00c4ffd04e63eb82315738e511b5d4be38470dafce616c6578706572696d656e74616cf564736f6c6343000510004000000000000000000000000020cd2e7ec8f5d8b337fe46a4f565ccef1561b9a9000000000000000000000000aac08d7cf5e7d9b0418e841d1e68cb5a2904a08c

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061036d5760003560e01c80637c42d2b5116101d3578063b553207e11610104578063d88e71e0116100a2578063de560cca1161007c578063de560cca146106d1578063e085c952146106d9578063e9920181146106e1578063f2fde38b146106f45761036d565b8063d88e71e0146106ae578063ddca3f43146106b6578063dde070e8146106be5761036d565b8063c84ba291116100de578063c84ba29114610681578063cac0652214610689578063d5ef14231461069e578063d660e6ab146106a65761036d565b8063b553207e14610653578063b6812eaf1461065b578063b6d4efd01461066e5761036d565b806396b9886211610171578063a035b1fe1161014b578063a035b1fe1461060a578063a0cbadb314610612578063ad82c2541461061a578063b425f8021461062d5761036d565b806396b98862146105c25780639cbdc6c1146105e45780639fd1b2fc146105f75761036d565b80638da5cb5b116101ad5780638da5cb5b146105815780638fc1ea1e1461058957806391b7f5ed1461059c57806392929a09146105af5761036d565b80637c42d2b5146105535780637cb04a211461055b5780638016f8241461056e5761036d565b80635a6da1e9116102ad57806369fe0e2d1161024b57806376ec6e8c1161022557806376ec6e8c14610512578063788af7861461052557806379a53592146105385780637bfc52111461054b5761036d565b806369fe0e2d146104d157806371f4f3fb146104e45780637238ccdb146104ec5761036d565b80635fc43dd0116102875780635fc43dd01461049b57806364e731aa146104ae57806365ab4477146104c1578063673cd98e146104c95761036d565b80635a6da1e9146104835780635ab09c1e1461048b5780635ebd5872146104935761036d565b8063384c9aef1161031a5780634a9fefc7116102f45780634a9fefc7146104405780634e71d92d146104605780634fa77a4814610468578063513eb0221461047b5761036d565b8063384c9aef146103fe57806340912990146104135780634a3b68cc1461041b5761036d565b80632e5e83341161034b5780632e5e8334146103b6578063357b97dd146103cb57806336d8a893146103de5761036d565b806323361b79146103725780632866ed211461039b5780632afcf480146103a3575b600080fd5b610385610380366004613359565b610707565b6040516103929190613d26565b60405180910390f35b6103856107e0565b6103856103b1366004613492565b6107ee565b6103be610f90565b6040516103929190613eb3565b6103856103d936600461330c565b610f96565b6103f16103ec366004613284565b611074565b6040516103929190613c8c565b61041161040c366004613492565b611115565b005b6103be61114a565b61042e610429366004613284565b611150565b60405161039296959493929190613ecf565b61045361044e366004613284565b61118c565b6040516103929190613b43565b6103856111d3565b610385610476366004613284565b61192d565b6103be611b07565b6103be611b0d565b6103be611b13565b6103be611b19565b6103856104a93660046132a2565b611b1f565b6103856104bc3660046132dc565b611d5e565b6103be612491565b6103be612497565b6104116104df366004613492565b61249d565b6103856124f2565b6104ff6104fa366004613284565b6124fb565b6040516103929796959493929190613c9d565b610411610520366004613492565b61279c565b6104116105333660046134b0565b6127d1565b610411610546366004613492565b6128b8565b6103be6128ed565b6103be6128f3565b610411610569366004613492565b6128f9565b6103be61057c366004613284565b61292e565b610453612ae1565b610411610597366004613456565b612af6565b6104116105aa366004613492565b612b39565b6104116105bd366004613456565b612b8e565b6105d56105d0366004613284565b612bd8565b60405161039293929190613ec1565b6103856105f23660046133ba565b612bf8565b610411610605366004613492565b612cea565b6103be612d1f565b6103be612d25565b610411610628366004613492565b612d2b565b61064061063b3660046132dc565b612d60565b6040516103929796959493929190613f1e565b6103be612db7565b610411610669366004613492565b612dbd565b61041161067c366004613492565b612df2565b6103be612e27565b610691612e2d565b6040516103929190613d34565b6103be612e3c565b6103be612e42565b6103be612e48565b6103be612e4e565b6103be6106cc366004613284565b612e54565b6103be613079565b6103be61307f565b6104536106ef366004613284565b613085565b610411610702366004613284565b6130a0565b601a546000906201000090046001600160a01b031633146107435760405162461bcd60e51b815260040161073a90613d73565b60405180910390fd5b6001600160a01b0385166107695760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b0385166000908152600260208190526040918290208681556001810186905590810184905590517f54840d35ba54ac621adbc02d6b559075470a1a77f6f5b5394f7a2e994dd8230b906107ca908890889088908890613be6565b60405180910390a160019150505b949350505050565b601a54610100900460ff1681565b601a5460009060ff1615156001146108185760405162461bcd60e51b815260040161073a90613de3565b600082116108385760405162461bcd60e51b815260040161073a90613d53565b6000546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061086c90339030908790600401613b51565b602060405180830381600087803b15801561088657600080fd5b505af115801561089a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108be9190810190613474565b5033600090815260016020526040902080544291901561094057336000908152600260205260408120805460125491929161092491906109189060649061090c90849063ffffffff61311216565b9063ffffffff61314c16565b9063ffffffff61318e16565b60018301549091508082141561093c57600283018590555b5050505b601954600090819061095990879063ffffffff61311216565b90506b019d971e4fe8401e74000000811015610979576007549150610a34565b6b019d971e4fe8401e7400000081101580156109a057506b06765c793fa10079d000000081105b156109af576008549150610a34565b6b06765c793fa10079d000000081101580156109d657506b1027e72f1f1281308800000081105b156109e5576009549150610a34565b6b1027e72f1f128130880000008110158015610a0c57506b204fce5e3e2502611000000081105b15610a1b57600a549150610a34565b6b204fce5e3e250261100000008110610a3457600b5491505b60016000336001600160a01b03166001600160a01b031681526020019081526020016000206040518060e00160405280888152602001601954815260200183815260200186815260200184620151800287018152602001848152602001610aba6201518061090c8761090c88610918606461090c6012548d61311290919063ffffffff16565b90528154600181810184556000938452602080852084516007909402019283558084015191830191909155604080840151600280850191909155606085015160038501556080850151600485015560a0850151600585015560c0909401516006909301929092553384529190915290208054610b415760028101859055600e805460010190555b805482018155600d805483019055600f805488019055336000908152600360205260409020805415610c1a578154601254610b8f91906109189060649061090c90849063ffffffff61311216565b6002820155601554600182015410610c1a576004810154600090610c18574260048301556017546015546001840154610bd3929161090c919063ffffffff6131b316565b9050610bf16201518061090c8360185461311290919063ffffffff16565b6005830155601654610c0c906201518063ffffffff61314c16565b60058301805490910190555b505b33600090815260046020526040902080546001600160a01b031615610f425780546001600160a01b03166000908152600360205260408120600101805486019055601354610c769060649061090c90889063ffffffff61311216565b82546001600160a01b03166000908152600360208181526040808420600190925290922060028301549183015493945091921015610d5b578160020154838360030154011015610d1357600682018054840190819055600283015411610d0e5760005b8154811015610d0c576000828281548110610cf057fe5b6000918252602082206006600790920201015550600101610cd9565b505b610d5b565b6003820154600283015403600683015560005b8154811015610d59576000828281548110610d3d57fe5b6000918252602082206006600790920201015550600101610d26565b505b601554826001015410610f3e576004820154600090610de3574260048401556017546015546001850154610d9a929161090c919063ffffffff6131b316565b9050610db86201518061090c8360185461311290919063ffffffff16565b6005840155601654610dd3906201518063ffffffff61314c16565b6005840180549091019055610f3c565b6000610e108460050154610e048660040154426131b390919063ffffffff16565b9063ffffffff61311216565b9050836002015484600301541015610f3a578360020154818560030154011015610e8757600684018054820190819055600285015411610e825760005b8354811015610e80576000848281548110610e6457fe5b6000918252602082206006600790920201015550600101610e4d565b505b610ecf565b6003840154600285015403600685015560005b8354811015610ecd576000848281548110610eb157fe5b6000918252602082206006600790920201015550600101610e9a565b505b4260048501556017546015546001860154610ef5929161090c919063ffffffff6131b316565b9150610f136201518061090c8460185461311290919063ffffffff16565b6005850155601654610f2e906201518063ffffffff61314c16565b60058501805490910190555b505b505b5050505b7f3eb0f553d9ec38e0ff3a72db450f9d6f5e372e70e824a3195a09ead1c01fb876338a601954604051610f7793929190613b94565b60405180910390a160019750505050505050505b919050565b60085481565b601a546000906201000090046001600160a01b03163314610fc95760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038416610fef5760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038416600090815260016020526040812080548490811061101357fe5b906000526020600020906007020190508381600601819055507f47f6b9e3974adf5c2be82125be9f7a02fb53010c65a3bfd9f4751cdf547538cf85858560405161105f93929190613bd8565b60405180910390a160019150505b9392505050565b60606001600160a01b03821661109c5760405162461bcd60e51b815260040161073a90613dd3565b6001600160a01b038216600090815260036020908152604091829020805483518184028101840190945280845290929183919083018282801561110857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110ea575b5050505050915050919050565b601a546201000090046001600160a01b031633146111455760405162461bcd60e51b815260040161073a90613d73565b601255565b600e5481565b60036020528060005260406000206000915090508060010154908060020154908060030154908060040154908060050154908060060154905086565b60006001600160a01b0382166111b45760405162461bcd60e51b815260040161073a90613e33565b506001600160a01b039081166000908152600460205260409020541690565b601a5460009060ff6101009091041615156001146112035760405162461bcd60e51b815260040161073a90613e93565b33600090815260016020526040902080546112305760405162461bcd60e51b815260040161073a90613e23565b33600090815260026020526040812080546012548391611262916109189060649061090c90849063ffffffff61311216565b60018301549091508082116112895760405162461bcd60e51b815260040161073a90613e63565b60005b85548110156112eb5760008682815481106112a357fe5b9060005260206000209060070201905060006112d48260060154610e048860020154426131b390919063ffffffff16565b905080156112e157958601955b505060010161128c565b50336000908152600360205260409020600c54828403106114445760018101541561144457806002015481600601548260030154011161135d57600681015460038201805482019081905560028301549690910195101561135157600281015460038201555b6000600682015561138f565b80600301548160020154111561137d578060030154816002015403850194505b60028101546003820155600060068201555b60006113b08260050154610e048460040154426131b390919063ffffffff16565b9050600082600401541180156113ca575060008260050154115b15611442578160020154818360030154011161141157600382018054820190819055600283015496820196101561140657600282015460038301555b426004830155611442565b816003015482600201541115611431578160030154826002015403860195505b600282015460038301554260048301555b505b600085116114645760405162461bcd60e51b815260040161073a90613dc3565b42600285015560018401546000908190870185811061162b576019546114949061090c888863ffffffff6131b316565b92508587600101819055506114b9606461090c6006548661311290919063ffffffff16565b60005460055460405163a9059cbb60e01b81529294506001600160a01b039182169263a9059cbb926114f19216908690600401613bca565b602060405180830381600087803b15801561150b57600080fd5b505af115801561151f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115439190810190613474565b506000546001600160a01b031663a9059cbb33611566868663ffffffff6131b316565b6040518363ffffffff1660e01b8152600401611583929190613b79565b602060405180830381600087803b15801561159d57600080fd5b505af11580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115d59190810190613474565b5060005b895481101561160c5760008a82815481106115f057fe5b60009182526020822060066007909202010155506001016115d9565b506001840154156116265760006004850181905560058501555b611785565b60195461163f90899063ffffffff61314c16565b6001880180548a0190556006549093506116679060649061090c90869063ffffffff61311216565b60005460055460405163a9059cbb60e01b81529294506001600160a01b039182169263a9059cbb9261169f9216908690600401613bca565b602060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f19190810190613474565b506000546001600160a01b031663a9059cbb33611714868663ffffffff6131b316565b6040518363ffffffff1660e01b8152600401611731929190613b79565b602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117839190810190613474565b505b60118054840190556019546117a190849063ffffffff61311216565b60108054909101905533600090815260046020526040902080546001600160a01b0316156118df5780546001600160a01b031660009081526003602052604081206014549091906118009060649061090c908e9063ffffffff61311216565b83546001600160a01b0316600090815260016020526040902060028401546003850154929350909110156118db5782600201548284600301540110156118935760068301805483019081905560028401541161188e5760005b8d5481101561188c5760008e828154811061187057fe5b6000918252602082206006600790920201015550600101611859565b505b6118db565b6003830154600284015403600684015560005b81548110156118d95760008282815481106118bd57fe5b60009182526020822060066007909202010155506001016118a6565b505b5050505b7f4343fc0436cb075772fdb7e28d5380cc610e5334add5537e2d2b2946b8e2836f338560195460405161191493929190613b94565b60405180910390a160019a505050505050505050505090565b60006001600160a01b0382166119555760405162461bcd60e51b815260040161073a90613e33565b6001600160a01b0380831660009081526004602052604090208054909116156119905760405162461bcd60e51b815260040161073a90613e83565b336000908152600260205260409020600c54600182015482546012546119d992916119cd916109189060649061090c90849063ffffffff61311216565b9063ffffffff6131b316565b10156119f75760405162461bcd60e51b815260040161073a90613d63565b6001600160a01b0384166000908152600160205260409020805415611a2e5760405162461bcd60e51b815260040161073a90613db3565b33600090815260036020908152604082208054600181018255818452919092200180546001600160a01b0319166001600160a01b0388161790556002810154611a99578254601254611a9391906109189060649061090c90849063ffffffff61311216565b60028201555b6001600160a01b0386166000908152600460205260409081902080546001600160a01b0319163317815590517f5460efa9aaef49adcbdec085b22993bea41d8d5abd3124de8faeea893ce9593a90611af2908990613b43565b60405180910390a15060019695505050505050565b60165481565b60125481565b60095481565b600b5481565b601a546000906201000090046001600160a01b03163314611b525760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038316611b785760405162461bcd60e51b815260040161073a90613dd3565b6001600160a01b038216611b9e5760405162461bcd60e51b815260040161073a90613e33565b6001600160a01b038083166000908152600460205260409020805490911615611bd95760405162461bcd60e51b815260040161073a90613e83565b6001600160a01b0384166000908152600260205260409020600c5460018201548254601254611c1f92916119cd916109189060649061090c90849063ffffffff61311216565b1015611c3d5760405162461bcd60e51b815260040161073a90613d63565b6001600160a01b0384166000908152600160205260409020805415611c745760405162461bcd60e51b815260040161073a90613db3565b6001600160a01b03868116600090815260036020908152604082208054600181018255818452919092200180546001600160a01b031916928816929092179091556002810154611ce6578254601254611ce091906109189060649061090c90849063ffffffff61311216565b60028201555b6001600160a01b038681166000908152600460205260409081902080546001600160a01b031916928a16929092178255517f0d984a86460fe7e0cd7646fc932b7cb5185793e3053c6d6eb5f73fb94b9a969490611d46908a908a90613baf565b60405180910390a16001955050505050505b92915050565b601a546000906201000090046001600160a01b03163314611d915760405162461bcd60e51b815260040161073a90613d73565b601a5460ff161515600114611db85760405162461bcd60e51b815260040161073a90613de3565b60008211611dd85760405162461bcd60e51b815260040161073a90613d53565b6019546000908190611df190859063ffffffff61311216565b90506b019d971e4fe8401e74000000811015611e11576007549150611ecc565b6b019d971e4fe8401e740000008110158015611e3857506b06765c793fa10079d000000081105b15611e47576008549150611ecc565b6b06765c793fa10079d00000008110158015611e6e57506b1027e72f1f1281308800000081105b15611e7d576009549150611ecc565b6b1027e72f1f128130880000008110158015611ea457506b204fce5e3e2502611000000081105b15611eb357600a549150611ecc565b6b204fce5e3e250261100000008110611ecc57600b5491505b336000908152600160205260409020805442919015611f35573360009081526002602052604081208054601254919291611f1991906109189060649061090c90849063ffffffff61311216565b600183015490915080821415611f3157600283018590555b5050505b60016000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060e00160405280888152602001601954815260200185815260200184815260200186620151800285018152602001868152602001611fbb6201518061090c8961090c8a610918606461090c6012548f61311290919063ffffffff16565b90528154600181810184556000938452602080852084516007909402019283558084015191830191909155604080840151600280850191909155606085015160038501556080850151600485015560a0850151600585015560c0909401516006909301929092556001600160a01b038b168452919091529020805461204b5760028101839055600e805460010190555b805484018155600d805485019055600f80548801905533600090815260036020526040902080541561212457815460125461209991906109189060649061090c90849063ffffffff61311216565b60028201556015546001820154106121245760048101546000906121225742600483015560175460155460018401546120dd929161090c919063ffffffff6131b316565b90506120fb6201518061090c8360185461311290919063ffffffff16565b6005830155601654612116906201518063ffffffff61314c16565b60058301805490910190555b505b6001600160a01b03808a1660009081526004602052604090208054909116156124445780546001600160a01b031660009081526003602052604081206001018054880190556013546121849060649061090c908a9063ffffffff61311216565b82546001600160a01b031660009081526003602081815260408084206001909252909220600283015491830154939450919210156122695781600201548383600301540110156122215760068201805484019081905560028301541161221c5760005b815481101561221a5760008282815481106121fe57fe5b60009182526020822060066007909202010155506001016121e7565b505b612269565b6003820154600283015403600683015560005b815481101561226757600082828154811061224b57fe5b6000918252602082206006600790920201015550600101612234565b505b6015548260010154106124405760048201546000906122f15742600484015560175460155460018501546122a8929161090c919063ffffffff6131b316565b90506122c66201518061090c8360185461311290919063ffffffff16565b60058401556016546122e1906201518063ffffffff61314c16565b600584018054909101905561243e565b60006123128460050154610e048660040154426131b390919063ffffffff16565b905083600201548460030154101561243c578360020154818560030154011015612389576006840180548201908190556002850154116123845760005b835481101561238257600084828154811061236657fe5b600091825260208220600660079092020101555060010161234f565b505b6123d1565b6003840154600285015403600685015560005b83548110156123cf5760008482815481106123b357fe5b600091825260208220600660079092020101555060010161239c565b505b42600485015560175460155460018601546123f7929161090c919063ffffffff6131b316565b91506124156201518061090c8460185461311290919063ffffffff16565b6005850155601654612430906201518063ffffffff61314c16565b60058501805490910190555b505b505b5050505b7f9a9654e283717250eb1f515593102e2024a5f6b264ed5659bdc199ae3cf9e3158a8a60195460405161247993929190613bd8565b60405180910390a15060019998505050505050505050565b600c5481565b600f5481565b601a546201000090046001600160a01b031633146124cd5760405162461bcd60e51b815260040161073a90613d73565b600081116124ed5760405162461bcd60e51b815260040161073a90613d93565b600655565b601a5460ff1681565b60608060608060608060606000600160008a6001600160a01b03166001600160a01b031681526020019081526020016000209050600081805490509050606081604051908082528060200260200182016040528015612564578160200160208202803883390190505b509050606082604051908082528060200260200182016040528015612593578160200160208202803883390190505b5090506060836040519080825280602002602001820160405280156125c2578160200160208202803883390190505b5090506060846040519080825280602002602001820160405280156125f1578160200160208202803883390190505b509050606085604051908082528060200260200182016040528015612620578160200160208202803883390190505b50905060608660405190808252806020026020018201604052801561264f578160200160208202803883390190505b50905060608760405190808252806020026020018201604052801561267e578160200160208202803883390190505b50905060005b8881101561277d5760008a828154811061269a57fe5b9060005260206000209060070201905080600001548983815181106126bb57fe5b60200260200101818152505080600101548883815181106126d857fe5b60200260200101818152505080600201548783815181106126f557fe5b602002602001018181525050806003015486838151811061271257fe5b602002602001018181525050806004015485838151811061272f57fe5b602002602001018181525050806005015484838151811061274c57fe5b602002602001018181525050806006015483838151811061276957fe5b602090810291909101015250600101612684565b50959e50939c50919a5098509650945092505050919395979092949650565b601a546201000090046001600160a01b031633146127cc5760405162461bcd60e51b815260040161073a90613d73565b601755565b601a546201000090046001600160a01b031633146128015760405162461bcd60e51b815260040161073a90613d73565b600085116128215760405162461bcd60e51b815260040161073a90613da3565b600084116128415760405162461bcd60e51b815260040161073a90613e43565b600083116128615760405162461bcd60e51b815260040161073a90613e03565b600082116128815760405162461bcd60e51b815260040161073a90613df3565b600081116128a15760405162461bcd60e51b815260040161073a90613ea3565b600794909455600892909255600955600a55600b55565b601a546201000090046001600160a01b031633146128e85760405162461bcd60e51b815260040161073a90613d73565b601655565b60145481565b60155481565b601a546201000090046001600160a01b031633146129295760405162461bcd60e51b815260040161073a90613d73565b601355565b60006001600160a01b0382166129565760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038216600090815260026020526040812080546012548391612991916109189060649061090c90849063ffffffff61311216565b60018301549091508181106129ad576000945050505050610f8b565b6001600160a01b038616600090815260036020819052604090912090810154600c546129df858563ffffffff6131b316565b10612aaa57600182015415612aaa5781600201548260060154820111612a0e5760068201549586019501612a32565b816003015482600201541115612a3257506003810154600282015490810395909501945b6000612a538360050154610e048560040154426131b390919063ffffffff16565b905060008360040154118015612a6d575060008360050154115b15612aa857826002015481830111612a885795860195612aa8565b826003015483600201541115612aa8578260030154836002015403870196505b505b600185015486016000858210612ad157612aca868663ffffffff6131b316565b9050612ad4565b50865b9998505050505050505050565b601a546201000090046001600160a01b031681565b601a546201000090046001600160a01b03163314612b265760405162461bcd60e51b815260040161073a90613d73565b601a805460ff1916911515919091179055565b601a546201000090046001600160a01b03163314612b695760405162461bcd60e51b815260040161073a90613d73565b60008111612b895760405162461bcd60e51b815260040161073a90613e53565b601955565b601a546201000090046001600160a01b03163314612bbe5760405162461bcd60e51b815260040161073a90613d73565b601a80549115156101000261ff0019909216919091179055565b600260208190526000918252604090912080546001820154919092015483565b601a546000906201000090046001600160a01b03163314612c2b5760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b038816612c515760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b038816600090815260036020819052604091829020600181018a90556002810189905590810187905560048101869055600581018590556006810184905590517f0ebff4f4881dd1e533b0ea6168da45b5c184454dac4f1da5b56766c2c7ea738890612cd1908b908b908b908b908b908b908b90613c24565b60405180910390a160019150505b979650505050505050565b601a546201000090046001600160a01b03163314612d1a5760405162461bcd60e51b815260040161073a90613d73565b601855565b60195481565b60105481565b601a546201000090046001600160a01b03163314612d5b5760405162461bcd60e51b815260040161073a90613d73565b600c55565b60016020528160005260406000208181548110612d7957fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601549497509295509093909287565b60075481565b601a546201000090046001600160a01b03163314612ded5760405162461bcd60e51b815260040161073a90613d73565b601555565b601a546201000090046001600160a01b03163314612e225760405162461bcd60e51b815260040161073a90613d73565b601455565b60175481565b6000546001600160a01b031681565b60185481565b600a5481565b60135481565b60065481565b60006001600160a01b038216612e7c5760405162461bcd60e51b815260040161073a90613e73565b6001600160a01b03821660009081526001602090815260408083206002909252822080546012549293928391612ec4916109189060649061090c90849063ffffffff61311216565b6001830154909150818110612ee157600095505050505050610f8b565b60005b8554811015612f43576000868281548110612efb57fe5b906000526020600020906007020190506000612f2c8260060154610e048860020154426131b390919063ffffffff16565b90508015612f3957958601955b5050600101612ee4565b506001600160a01b038716600090815260036020819052604090912090810154600c54612f76858563ffffffff6131b316565b10613041576001820154156130415781600201548260060154820111612fa55760068201549586019501612fc9565b816003015482600201541115612fc957506003810154600282015490810395909501945b6000612fea8360050154610e048560040154426131b390919063ffffffff16565b905060008360040154118015613004575060008360050154115b1561303f5782600201548183011161301f579586019561303f565b82600301548360020154111561303f578260030154836002015403870196505b505b60018501548601600085821061306857613061868663ffffffff6131b316565b905061306b565b50865b9a9950505050505050505050565b600d5481565b60115481565b6004602052600090815260409020546001600160a01b031681565b601a546201000090046001600160a01b031633146130d05760405162461bcd60e51b815260040161073a90613d73565b6001600160a01b0381161561310f57601a805475ffffffffffffffffffffffffffffffffffffffff00001916620100006001600160a01b038416021790555b50565b60008261312157506000611d58565b8282028284828161312e57fe5b041461106d5760405162461bcd60e51b815260040161073a90613e13565b600061106d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506131f5565b60008282018381101561106d5760405162461bcd60e51b815260040161073a90613d83565b600061106d83836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f770081525061322c565b600081836132165760405162461bcd60e51b815260040161073a9190613d42565b50600083858161322257fe5b0495945050505050565b600081848411156132505760405162461bcd60e51b815260040161073a9190613d42565b505050900390565b8035611d5881613faa565b8035611d5881613fbe565b8051611d5881613fbe565b8035611d5881613fc7565b60006020828403121561329657600080fd5b60006107d88484613258565b600080604083850312156132b557600080fd5b60006132c18585613258565b92505060206132d285828601613258565b9150509250929050565b600080604083850312156132ef57600080fd5b60006132fb8585613258565b92505060206132d285828601613279565b60008060006060848603121561332157600080fd5b600061332d8686613258565b935050602061333e86828701613279565b925050604061334f86828701613279565b9150509250925092565b6000806000806080858703121561336f57600080fd5b600061337b8787613258565b945050602061338c87828801613279565b935050604061339d87828801613279565b92505060606133ae87828801613279565b91505092959194509250565b600080600080600080600060e0888a0312156133d557600080fd5b60006133e18a8a613258565b97505060206133f28a828b01613279565b96505060406134038a828b01613279565b95505060606134148a828b01613279565b94505060806134258a828b01613279565b93505060a06134368a828b01613279565b92505060c06134478a828b01613279565b91505092959891949750929550565b60006020828403121561346857600080fd5b60006107d88484613263565b60006020828403121561348657600080fd5b60006107d8848461326e565b6000602082840312156134a457600080fd5b60006107d88484613279565b600080600080600060a086880312156134c857600080fd5b60006134d48888613279565b95505060206134e588828901613279565b94505060406134f688828901613279565b935050606061350788828901613279565b925050608061351888828901613279565b9150509295509295909350565b60006135318383613554565b505060200190565b60006135318383613b3a565b61354e81613f5e565b82525050565b61354e81613f3f565b600061356882613f32565b6135728185613f36565b935061357d83613f2c565b8060005b838110156135ab5781516135958882613525565b97506135a083613f2c565b925050600101613581565b509495945050505050565b60006135c182613f32565b6135cb8185613f36565b93506135d683613f2c565b8060005b838110156135ab5781516135ee8882613539565b97506135f983613f2c565b9250506001016135da565b61354e81613f4a565b61354e81613f65565b600061362182613f32565b61362b8185613f36565b935061363b818560208601613f70565b61364481613fa0565b9093019392505050565b600061365b600f83613f36565b6e24b73b30b634b21030b6b7bab73a1760891b815260200192915050565b6000613686602783613f36565b7f526566657272657220686173206e6f20726566657272616c207175616c69666981526631b0ba34b7b71760c91b602082015260400192915050565b60006136cf602283613f36565b7f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f815261371760f11b602082015260400192915050565b6000613713601b83613f36565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b600061374c601483613f36565b7f466565206d75737420626520706f736974697665000000000000000000000000815260200192915050565b6000613785601e83613f36565b7f64617973312073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006137be601883613f36565b7f54686973206163636f756e7420686164207374616b6564210000000000000000815260200192915050565b60006137f7601583613f36565b7f4e6f20696e74657265737420746f20636c61696d2e0000000000000000000000815260200192915050565b6000613830601e83613f36565b7f7265666572726572416464726573732063616e6e6f74206265203078302e0000815260200192915050565b6000613869601283613f36565b714e6f20696e7665737420616c6c6f7765642160701b815260200192915050565b6000613897601e83613f36565b7f64617973342073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006138d0601e83613f36565b7f64617973332073686f756c642062652067726561746572207468616e20300000815260200192915050565b6000613909602183613f36565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f8152607760f81b602082015260400192915050565b600061394c601183613f36565b702737903637b1b5b2b21030b6b7bab73a1760791b815260200192915050565b6000613979601d83613f36565b7f696e7669746565416464726573732063616e6e6f74206265203078302e000000815260200192915050565b60006139b2601e83613f36565b7f64617973322073686f756c642062652067726561746572207468616e20300000815260200192915050565b60006139eb601683613f36565b7f5072696365206d75737420626520706f73697469766500000000000000000000815260200192915050565b6000613a24602983613f36565b7f416c6c20696e766573746d656e74732068617665206265656e2066756c6c79208152683bb4ba34323930bbb760b91b602082015260400192915050565b6000613a6f601483613f36565b7f5f757365722063616e6e6f74206265203078302e000000000000000000000000815260200192915050565b6000613aa8601e83613f36565b7f54686973206163636f756e7420686164206265656e20696e7669746564210000815260200192915050565b6000613ae1601183613f36565b704e6f20636c61696d20616c6c6f7765642160781b815260200192915050565b6000613b0e601e83613f36565b7f64617973352073686f756c642062652067726561746572207468616e20300000815260200192915050565b61354e81613f5b565b60208101611d588284613554565b60608101613b5f8286613545565b613b6c6020830185613554565b6107d86040830184613b3a565b60408101613b878285613545565b61106d6020830184613b3a565b60608101613ba28286613545565b613b6c6020830185613b3a565b60408101613bbd8285613554565b61106d6020830184613554565b60408101613b878285613554565b60608101613ba28286613554565b60808101613bf48287613554565b613c016020830186613b3a565b613c0e6040830185613b3a565b613c1b6060830184613b3a565b95945050505050565b60e08101613c32828a613554565b613c3f6020830189613b3a565b613c4c6040830188613b3a565b613c596060830187613b3a565b613c666080830186613b3a565b613c7360a0830185613b3a565b613c8060c0830184613b3a565b98975050505050505050565b6020808252810161106d818461355d565b60e08082528101613cae818a6135b6565b90508181036020830152613cc281896135b6565b90508181036040830152613cd681886135b6565b90508181036060830152613cea81876135b6565b90508181036080830152613cfe81866135b6565b905081810360a0830152613d1281856135b6565b905081810360c0830152612ad481846135b6565b60208101611d588284613604565b60208101611d58828461360d565b6020808252810161106d8184613616565b60208082528101611d588161364e565b60208082528101611d5881613679565b60208082528101611d58816136c2565b60208082528101611d5881613706565b60208082528101611d588161373f565b60208082528101611d5881613778565b60208082528101611d58816137b1565b60208082528101611d58816137ea565b60208082528101611d5881613823565b60208082528101611d588161385c565b60208082528101611d588161388a565b60208082528101611d58816138c3565b60208082528101611d58816138fc565b60208082528101611d588161393f565b60208082528101611d588161396c565b60208082528101611d58816139a5565b60208082528101611d58816139de565b60208082528101611d5881613a17565b60208082528101611d5881613a62565b60208082528101611d5881613a9b565b60208082528101611d5881613ad4565b60208082528101611d5881613b01565b60208101611d588284613b3a565b60608101613ba28286613b3a565b60c08101613edd8289613b3a565b613eea6020830188613b3a565b613ef76040830187613b3a565b613f046060830186613b3a565b613f116080830185613b3a565b612cdf60a0830184613b3a565b60e08101613c32828a613b3a565b60200190565b5190565b90815260200190565b6000611d5882613f4f565b151590565b6001600160a01b031690565b90565b6000611d58825b6000611d5882613f3f565b60005b83811015613f8b578181015183820152602001613f73565b83811115613f9a576000848401525b50505050565b601f01601f191690565b613fb381613f3f565b811461310f57600080fd5b613fb381613f4a565b613fb381613f5b56fea365627a7a72315820b5b158fa03229187075a00c4ffd04e63eb82315738e511b5d4be38470dafce616c6578706572696d656e74616cf564736f6c63430005100040

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000020cd2e7ec8f5d8b337fe46a4f565ccef1561b9a9000000000000000000000000aac08d7cf5e7d9b0418e841d1e68cb5a2904a08c

-----Decoded View---------------
Arg [0] : esgAddress (address): 0x20cD2E7Ec8F5d8b337fe46a4F565Ccef1561b9a9
Arg [1] : feeWalletAddress (address): 0xaAc08D7CF5e7D9b0418e841d1E68cb5a2904A08C

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000020cd2e7ec8f5d8b337fe46a4f565ccef1561b9a9
Arg [1] : 000000000000000000000000aac08d7cf5e7d9b0418e841d1e68cb5a2904a08c


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.