false
true
0

Contract Address Details

0x1E887E7115321B4ee5d58DD446eC09e12B45d81B

Contract Name
GFarm
Creator
0xc66fbe–6fe00f at 0xeac4f6–611ac3
Balance
2.9176394 PLS ( )
Tokens
Fetching tokens...
Transactions
6,840 Transactions
Transfers
0 Transfers
Gas Used
1,086,569,849
Last Balance Update
26069084
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify. View contract in Sourcify repository
Contract name:
GFarm




Optimization enabled
true
Compiler version
v0.7.5+commit.eb77ed08




Optimization runs
1000
EVM Version
istanbul




Verified at
2026-03-20T04:57:06.226453Z

Constructor Arguments

000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d

Arg [0] (address) : 0xc66fbe50dd33c9aadd65707f7088d597c86fe00f
Arg [1] (address) : 0xd39a38bd2d2d552f3908ff698a5530aa397fb92d

              

GFarm.sol

// File: contracts\GFarmTokenInterface.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.7.5;

interface GFarmTokenInterface{
	function balanceOf(address account) external view returns (uint256);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function burn(address from, uint256 amount) external;
    function mint(address to, uint256 amount) external;
}

// File: @openzeppelin\contracts\math\SafeMath.sol

pragma solidity ^0.7.0;

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    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 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) {
        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;
    }
}

// File: @uniswap\v2-core\contracts\interfaces\IUniswapV2Pair.sol

pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: contracts\GFarm.sol

pragma solidity 0.7.5;




contract GFarm {

    using SafeMath for uint;

    // VARIABLES & CONSTANTS

    // 1. Tokens
    GFarmTokenInterface public token;
    IUniswapV2Pair public lp;
    address public nft;

    // 2. Pool 1
    uint public POOL1_MULTIPLIER; // 1e18
    uint public POOL1_MULTIPLIER_UPDATED;
    uint public constant POOL1_MULTIPLIER_UPDATE_EVERY = 45000; // 1 week (blocks)
    uint public POOL1_lastRewardBlock;
    uint public POOL1_accTokensPerLP; // 1e18
    uint public constant POOL1_REFERRAL_P = 6; // % 2 == 0
    uint public constant POOL1_CREDITS_MIN_P = 1;

    // 3. Pool 2
    uint public immutable POOL2_MULTIPLIER; // 1e18
    uint public constant POOL2_DURATION = 32000; // 5 days
    uint public immutable POOL2_END;
    uint public POOL2_lastRewardBlock;
    uint public POOL2_accTokensPerETH; // 1e18

    // 4. Pool 1 & Pool 2
    uint public immutable POOLS_START;
    uint public constant POOLS_START_DELAY = 1775;
    uint public constant PRECISION = 1e5;

    // 5. Useful Uniswap addresses (for TVL & APY)
    address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IUniswapV2Pair constant ETH_USDC_PAIR = IUniswapV2Pair(0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc);

    // 6. Governance & dev fund
    address public GOVERNANCE;
    address public immutable DEV_FUND;
    uint constant GOVERNANCE_P = 500000; // PRECISION
    uint constant DEV_FUND_P = 500000; // PRECISION

    // 7. Info about each user
    struct User {
        uint POOL1_provided;
        uint POOL1_rewardDebt;
        address POOL1_referral;
        uint POOL1_referralReward;

        uint POOL2_provided;
        uint POOL2_rewardDebt;

        uint NFT_CREDITS_amount;
        uint NFT_CREDITS_lastUpdated;
        bool NFT_CREDITS_receiving;
    }
    mapping(address => User) public users;

    constructor(address _GOV, address _DEV){
        // Distribution = 7500 * (3/4)^(n-1) (n = week)
        POOL1_MULTIPLIER = uint(7500 * 1e18) / 45000;
        POOL1_MULTIPLIER_UPDATED = block.number.add(POOLS_START_DELAY);

        POOL2_MULTIPLIER = POOL1_MULTIPLIER.div(10);
        POOL2_END = block.number.add(POOLS_START_DELAY)
                    .add(POOL2_DURATION);

        POOLS_START = block.number.add(POOLS_START_DELAY);

        GOVERNANCE = _GOV;
        DEV_FUND = _DEV;
    }

    // GOVERNANCE

    // 0. Modifier
    modifier onlyGov(){
        require(msg.sender == GOVERNANCE);
        _;
    }

    // 1. Update governance address
    function set_GOVERNANCE(address _gov) external onlyGov{
        GOVERNANCE = _gov;
    }

    // 2. Set token address
    function set_TOKEN(address _token) external onlyGov{
        require(token == GFarmTokenInterface(0), "Token address already set");
        token = GFarmTokenInterface(_token);
    }

    // 3. Set lp address
    function set_LP(address _lp) external onlyGov{
        require(lp == IUniswapV2Pair(0), "LP address already set");
        lp = IUniswapV2Pair(_lp);
    }

    // 4. Set token address
    function set_NFT(address _nft) external onlyGov{
        require(nft == address(0), "NFT address already set");
        nft = _nft;
    }

    // POOL REWARDS BETWEEN 2 BLOCKS

    // 1. Pool 1 (1e18)
    function POOL1_getReward(uint _from, uint _to) private view returns (uint){
        uint blocks;

        if(_from >= POOLS_START && _to >= POOLS_START){
            blocks = _to.sub(_from);
        }

        return blocks.mul(POOL1_MULTIPLIER);
    }

    // 2. Pool 2 (1e18)
    function POOL2_getReward(uint _from, uint _to) private view returns (uint){
        uint blocks;

        if(_from >= POOLS_START && _to >= POOLS_START){
            // Before pool 2 has ended
            if(_from <= POOL2_END && _to <= POOL2_END){
                blocks = _to.sub(_from);
            // Between before and after pool 2 has ended
            }else if(_from <= POOL2_END && _to > POOL2_END){
                blocks = POOL2_END.sub(_from);
            // After pool 2 has ended
            }else if(_from > POOL2_END && _to > POOL2_END){
                blocks = 0;
            }
        }

        return blocks.mul(POOL2_MULTIPLIER);
    }

    // UPDATE POOL VARIABLES

    // 1. Pool 1
    function POOL1_update() private {
        uint lpSupply = lp.balanceOf(address(this));

        if (POOL1_lastRewardBlock == 0 || lpSupply == 0) {
            POOL1_lastRewardBlock = block.number;
            return;
        }

        uint reward = POOL1_getReward(POOL1_lastRewardBlock, block.number);
        
        token.mint(address(this), reward);
        token.mint(GOVERNANCE, reward.mul(GOVERNANCE_P).div(100*PRECISION));
        token.mint(DEV_FUND, reward.mul(DEV_FUND_P).div(100*PRECISION));

        POOL1_accTokensPerLP = POOL1_accTokensPerLP.add(
            reward.mul(1e18).div(lpSupply)
        );
        POOL1_lastRewardBlock = block.number;

        if(block.number >= POOL1_MULTIPLIER_UPDATED.add(POOL1_MULTIPLIER_UPDATE_EVERY)){
            POOL1_MULTIPLIER = POOL1_MULTIPLIER.mul(3).div(4);
            POOL1_MULTIPLIER_UPDATED = block.number;
        }
    }   

    // 2. Pool 2
    function POOL2_update(uint ethJustStaked) private {
        // ETH balance is updated before the rest of the code
        uint ethSupply = address(this).balance.sub(ethJustStaked);

        if (POOL2_lastRewardBlock == 0 || ethSupply == 0) {
            POOL2_lastRewardBlock = block.number;
            return;
        }

        uint reward = POOL2_getReward(POOL2_lastRewardBlock, block.number);
        
        token.mint(address(this), reward);
        token.mint(GOVERNANCE, reward.mul(GOVERNANCE_P).div(100*PRECISION));
        token.mint(DEV_FUND, reward.mul(DEV_FUND_P).div(100*PRECISION));

        POOL2_accTokensPerETH = POOL2_accTokensPerETH.add(reward.mul(1e18).div(ethSupply));
        POOL2_lastRewardBlock = block.number;
    }

    // PENDING REWARD

    // 1. Pool 1 external (1e18)
    function POOL1_pendingReward() external view returns(uint){
        return _POOL1_pendingReward(users[msg.sender]);
    }

    // 2. Pool 1 private (1e18)
    function _POOL1_pendingReward(User memory u) private view returns(uint){
        uint _POOL1_accTokensPerLP = POOL1_accTokensPerLP;
        uint lpSupply = lp.balanceOf(address(this));

        if (block.number > POOL1_lastRewardBlock && lpSupply != 0) {
            uint pendingReward = POOL1_getReward(POOL1_lastRewardBlock, block.number);
            _POOL1_accTokensPerLP = _POOL1_accTokensPerLP.add(
                pendingReward.mul(1e18).div(lpSupply)
            );
        }

        return u.POOL1_provided.mul(_POOL1_accTokensPerLP).div(1e18)
                .sub(u.POOL1_rewardDebt);
    }

    // 3. Pool 2 external (1e18)
    function POOL2_pendingReward() external view returns(uint){
        return _POOL2_pendingReward(users[msg.sender], 0);
    }
    
    // 4. Pool 2 private (1e18)
    function _POOL2_pendingReward(User memory u, uint ethJustStaked) private view returns(uint){
        uint _POOL2_accTokensPerETH = POOL2_accTokensPerETH;
        // ETH balance is updated before the rest of the code
        uint ethSupply = address(this).balance.sub(ethJustStaked);

        if (block.number > POOL2_lastRewardBlock && ethSupply != 0) {
            uint pendingReward = POOL2_getReward(POOL2_lastRewardBlock, block.number);
            _POOL2_accTokensPerETH = _POOL2_accTokensPerETH.add(
                pendingReward.mul(1e18).div(ethSupply)
            );
        }

        return u.POOL2_provided.mul(_POOL2_accTokensPerETH).div(1e18)
            .sub(u.POOL2_rewardDebt);
    }

    // HARVEST REWARDS

    // 1. Pool 1 external
    function POOL1_harvest() external{
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        _POOL1_harvest(msg.sender);
    }

    // 2. Pool 1 private
    function _POOL1_harvest(address a) private{
        User storage u = users[a];
        uint pending = _POOL1_pendingReward(u);
        POOL1_update();

        if(pending > 0){
            if(u.POOL1_referral == address(0)){
                POOLS_safeTokenTransfer(a, pending);
                token.burn(a, pending.mul(POOL1_REFERRAL_P).div(100));
            }else{
                uint referralReward = pending.mul(POOL1_REFERRAL_P.div(2)).div(100);
                uint userReward = pending.sub(referralReward);

                POOLS_safeTokenTransfer(a, userReward);
                POOLS_safeTokenTransfer(u.POOL1_referral, referralReward);

                User storage referralUser = users[u.POOL1_referral];
                referralUser.POOL1_referralReward = referralUser.POOL1_referralReward
                                                    .add(referralReward);
            }
        }

        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);
    }

    // 3. Pool 2 external
    function POOL2_harvest() external{
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        _POOL2_harvest(msg.sender, 0);
    }
    
    // 4. Pool 2 private
    function _POOL2_harvest(address a, uint ethJustStaked) private{
        User storage u = users[a];
        uint pending = _POOL2_pendingReward(u, ethJustStaked);
        POOL2_update(ethJustStaked);

        if(pending > 0){
            POOLS_safeTokenTransfer(a, pending);
        }

        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // STAKE

    // 1. Pool 1
    function POOL1_stake(uint amount, address referral) external{
        require(tx.origin == msg.sender, "Contracts not allowed.");
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        require(amount > 0, "Staking 0 lp.");

        uint lpSupplyBefore = lp.balanceOf(address(this));

        _POOL1_harvest(msg.sender);
        lp.transferFrom(msg.sender, address(this), amount);

        User storage u = users[msg.sender];
        u.POOL1_provided = u.POOL1_provided.add(amount);
        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);

        if(!u.NFT_CREDITS_receiving
            && u.POOL1_provided >= lpSupplyBefore.mul(POOL1_CREDITS_MIN_P).div(100)){
            u.NFT_CREDITS_receiving = true;
            u.NFT_CREDITS_lastUpdated = block.number;
        }

        if(u.POOL1_referral == address(0) && referral != address(0)
            && referral != msg.sender){
            u.POOL1_referral = referral;
        }
    }

    // 2. Pool 2
    function POOL2_stake() payable external{
        require(tx.origin == msg.sender, "Contracts not allowed.");
        require(block.number >= POOLS_START, "Pool hasn't started yet.");
        require(block.number <= POOL2_END, "Pool is finished, no more staking.");
        require(msg.value > 0, "Staking 0 ETH.");

        _POOL2_harvest(msg.sender, msg.value);

        User storage u = users[msg.sender];
        u.POOL2_provided = u.POOL2_provided.add(msg.value);
        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // UNSTAKE

    // 1. Pool 1
    function POOL1_unstake(uint amount) external{
        User storage u = users[msg.sender];
        require(amount > 0, "Unstaking 0 lp.");
        require(u.POOL1_provided >= amount, "Unstaking more than currently staked.");

        _POOL1_harvest(msg.sender);
        lp.transfer(msg.sender, amount);

        u.POOL1_provided = u.POOL1_provided.sub(amount);
        u.POOL1_rewardDebt = u.POOL1_provided.mul(POOL1_accTokensPerLP).div(1e18);

        uint lpSupply = lp.balanceOf(address(this));

        if(u.NFT_CREDITS_receiving
            && u.POOL1_provided < lpSupply.mul(POOL1_CREDITS_MIN_P).div(100)
            || u.NFT_CREDITS_receiving && lpSupply == 0){
            u.NFT_CREDITS_amount = NFT_CREDITS_amount(msg.sender);
            u.NFT_CREDITS_receiving = false;
            u.NFT_CREDITS_lastUpdated = block.number;
        }
    }

    // 2. Pool 2
    function POOL2_unstake(uint amount) external{
        User storage u = users[msg.sender];
        require(amount > 0, "Unstaking 0 ETH.");
        require(u.POOL2_provided >= amount, "Unstaking more than currently staked.");

        _POOL2_harvest(msg.sender, 0);
        msg.sender.transfer(amount);

        u.POOL2_provided = u.POOL2_provided.sub(amount);
        u.POOL2_rewardDebt = u.POOL2_provided.mul(POOL2_accTokensPerETH).div(1e18);
    }

    // NFTs

    // 1. NFT credits of msg.sender
    function NFT_CREDITS_amount(address a) public view returns(uint){
        User memory u = users[a];
        if(u.NFT_CREDITS_receiving){
            return u.NFT_CREDITS_amount.add(block.number.sub(u.NFT_CREDITS_lastUpdated));
        }else{
            return u.NFT_CREDITS_amount;
        }
    }

    // 2. Spend NFT credits when claiming an NFT
    function spendCredits(address a, uint requiredCredits) external{
        require(msg.sender == nft, "Can only called by GFarmNFT.");
        User storage u = users[a];
        u.NFT_CREDITS_amount = NFT_CREDITS_amount(a).sub(requiredCredits);
        u.NFT_CREDITS_lastUpdated = block.number;
    }

    // PREVENT ROUNDING ERRORS

    function POOLS_safeTokenTransfer(address _to, uint _amount) private {
        uint bal = token.balanceOf(address(this));
        if (_amount > bal) {
            token.transfer(_to, bal);
        } else {
            token.transfer(_to, _amount);
        }
    }

    // USEFUL PRICING FUNCTIONS (FOR TVL & APY)

    // 1. ETH/USD price (PRECISION)
    function getEthPrice() private view returns(uint){
        (uint112 reserves0, uint112 reserves1, ) = ETH_USDC_PAIR.getReserves();
        uint reserveUSDC;
        uint reserveETH;

        if(WETH == ETH_USDC_PAIR.token0()){
            reserveETH = reserves0;
            reserveUSDC = reserves1;
        }else{
            reserveUSDC = reserves0;
            reserveETH = reserves1;
        }
        // Divide number of USDC by number of ETH
        // we multiply by 1e12 because USDC only has 6 decimals
        return reserveUSDC.mul(1e12).mul(PRECISION).div(reserveETH);
    }
    // 2. GFARM/ETH price (PRECISION)
    function getGFarmPriceEth() private view returns(uint){
        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();

        uint reserveETH;
        uint reserveGFARM;

        if(WETH == lp.token0()){
            reserveETH = reserves0;
            reserveGFARM = reserves1;
        }else{
            reserveGFARM = reserves0;
            reserveETH = reserves1;
        }

        return reserveETH.mul(PRECISION).div(reserveGFARM);
    }

    // UI VIEW FUNCTIONS (READ-ONLY)
    
    function POOLS_blocksLeftUntilStart() external view returns(uint){
        if(block.number > POOLS_START){ return 0; }
        return POOLS_START.sub(block.number);
    }

    function POOL1_getMultiplier() public view returns (uint) {
        if(block.number < POOLS_START){
            return 0;
        }
        return POOL1_MULTIPLIER;
    }

    function POOL2_getMultiplier() public view returns (uint) {
        if(block.number < POOLS_START || block.number > POOL2_END){
            return 0;
        }
        return POOL2_MULTIPLIER;
    }

    function POOL1_provided() external view returns(uint){
        return users[msg.sender].POOL1_provided;
    }

    function POOL2_provided() external view returns(uint){
        return users[msg.sender].POOL2_provided;
    }

    function POOL1_referralReward() external view returns(uint){
        return users[msg.sender].POOL1_referralReward;
    }

    function POOL2_blocksLeft() external view returns(uint){
        if(block.number > POOL2_END){
            return 0;
        }
        return POOL2_END.sub(block.number);
    }

    function POOL1_referral() external view returns(address){
        return users[msg.sender].POOL1_referral;
    }

    function POOL1_minLpsNftCredits() external view returns(uint){
        return lp.balanceOf(address(this)).mul(POOL1_CREDITS_MIN_P).div(100);
    }

    // (PRECISION)
    function POOL1_tvl() public view returns(uint){
        if(lp.totalSupply() == 0){ return 0; }

        (uint112 reserves0, uint112 reserves1, ) = lp.getReserves();
        uint reserveEth;

        if(WETH == lp.token0()){
            reserveEth = reserves0;
        }else{
            reserveEth = reserves1;
        }

        uint lpPriceEth = reserveEth.mul(1e5).mul(2).div(lp.totalSupply());
        uint lpPriceUsd = lpPriceEth.mul(getEthPrice()).div(1e5);

        return lp.balanceOf(address(this)).mul(lpPriceUsd).div(1e18);
    }

    // (PRECISION)
    function POOL2_tvl() public view returns(uint){
        return address(this).balance.mul(getEthPrice()).div(1e18);
    }

    // (PRECISION)
    function POOLS_tvl() external view returns(uint){
        return POOL1_tvl().add(POOL2_tvl());
    }

    // (PRECISION)
    function POOL1_apy() external view returns(uint){
        if(POOL1_tvl() == 0){ return 0; }
        return POOL1_MULTIPLIER.mul(2336000)
                .mul(getGFarmPriceEth()).mul(getEthPrice())
                .mul(100).div(POOL1_tvl());
    }

    // (PRECISION)
    function POOL2_apy() external view returns(uint){
        if(POOL2_tvl() == 0){ return 0; }
        return POOL2_MULTIPLIER.mul(2336000)
                .mul(getGFarmPriceEth()).mul(getEthPrice())
                .mul(100).div(POOL2_tvl());
    }

    function myNftCredits() external view returns(uint){
        return NFT_CREDITS_amount(msg.sender);
    }

}
        

Compiler Settings

{"remappings":[],"optimizer":{"runs":1000,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"GFarm.sol":"GFarm"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_GOV","internalType":"address"},{"type":"address","name":"_DEV","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEV_FUND","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"GOVERNANCE","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"NFT_CREDITS_amount","inputs":[{"type":"address","name":"a","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_CREDITS_MIN_P","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_MULTIPLIER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_MULTIPLIER_UPDATED","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_MULTIPLIER_UPDATE_EVERY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_REFERRAL_P","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_accTokensPerLP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_apy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_getMultiplier","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"POOL1_harvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_lastRewardBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_minLpsNftCredits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_pendingReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_provided","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"POOL1_referral","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_referralReward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"POOL1_stake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"referral","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL1_tvl","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"POOL1_unstake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_DURATION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_END","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_MULTIPLIER","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_accTokensPerETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_apy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_blocksLeft","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_getMultiplier","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"POOL2_harvest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_lastRewardBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_pendingReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_provided","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"POOL2_stake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOL2_tvl","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"POOL2_unstake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOLS_START","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOLS_START_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOLS_blocksLeftUntilStart","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"POOLS_tvl","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"PRECISION","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Pair"}],"name":"lp","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"myNftCredits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"nft","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_GOVERNANCE","inputs":[{"type":"address","name":"_gov","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_LP","inputs":[{"type":"address","name":"_lp","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_NFT","inputs":[{"type":"address","name":"_nft","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_TOKEN","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"spendCredits","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"uint256","name":"requiredCredits","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract GFarmTokenInterface"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"POOL1_provided","internalType":"uint256"},{"type":"uint256","name":"POOL1_rewardDebt","internalType":"uint256"},{"type":"address","name":"POOL1_referral","internalType":"address"},{"type":"uint256","name":"POOL1_referralReward","internalType":"uint256"},{"type":"uint256","name":"POOL2_provided","internalType":"uint256"},{"type":"uint256","name":"POOL2_rewardDebt","internalType":"uint256"},{"type":"uint256","name":"NFT_CREDITS_amount","internalType":"uint256"},{"type":"uint256","name":"NFT_CREDITS_lastUpdated","internalType":"uint256"},{"type":"bool","name":"NFT_CREDITS_receiving","internalType":"bool"}],"name":"users","inputs":[{"type":"address","name":"","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x6101006040523480156200001257600080fd5b506040516200348138038062003481833981810160405260408110156200003857600080fd5b50805160209091015161afc86901969368974c05b00000046003556200006d436106ef6200011f602090811b62001e6b17901c565b60048190555062000090600a6003546200018160201b62001ece1790919060201c565b608052620000c8617d00620000b4436106ef6200011f602090811b62001e6b17901c565b6200011f60201b62001e6b1790919060201c565b60a052620000e5436106ef6200011f602090811b62001e6b17901c565b60c052600980546001600160a01b0319166001600160a01b03939093169290921790915560601b6001600160601b03191660e05262000272565b6000828201838110156200017a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006200017a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620001cb60201b60201c565b600081836200025b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200021f57818101518382015260200162000205565b50505050905090810190601f1680156200024d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200026857fe5b0495945050505050565b60805160a05160c05160e05160601c61314a6200033760003980611e1f52806129175280612d27525080610cba52806113a65280611426528061144c52806116925280611c295280611cad5280611dc55280611df85280612e2a5280612e555280612fe752806130125250806108e4528061128c52806112bf52806117075280611c525280612e7f5280612eaa5280612ee55280612f105280612f3c5280612f635280612f8d525080610c425280610fe35280611c845280612fbe525061314a6000f3fe6080604052600436106103295760003560e01c806398f17a3b116101a5578063be8682db116100ec578063dae8f1fd11610095578063f34184fa1161006f578063f34184fa1461088e578063fa8aa3d7146108a3578063fc0c546a146108b8578063fc60a096146108cd57610329565b8063dae8f1fd1461084f578063e3beb31414610864578063ea550ad91461087957610329565b8063cd312cc4116100c6578063cd312cc414610810578063cf71d21114610825578063d34d05b91461083a57610329565b8063be8682db146107b3578063c135916f146107c8578063c7b30602146107fb57610329565b8063a87430ba1161014e578063b4af648911610128578063b4af648914610763578063b53e51e114610796578063b568d8a41461079e57610329565b8063a87430ba146106b5578063aaf5eb6814610739578063b082d99c1461074e57610329565b80639d9165231161017f5780639d916523146106585780639f7fd11d1461066d578063a7ae510b1461068257610329565b806398f17a3b14610619578063997f5dac1461062e5780639acd5e831461064357610329565b80634edbbb5d1161027457806360f5a98b1161021d5780638a8cd1e3116101f75780638a8cd1e3146105a75780638b49f078146105bc57806392570992146105d15780639332fddc1461060457610329565b806360f5a98b146105535780637159ffd8146105685780637417f9261461057d57610329565b8063546ae0391161024e578063546ae03914610514578063577b4059146105295780635ee3f1a71461053e57610329565b80634edbbb5d146104b15780634f90ea4a146104c65780635407886c146104ff57610329565b8063313c06a0116102d657806347ccca02116102b057806347ccca021461045457806349263637146104695780634d159df71461049c57610329565b8063313c06a0146104005780633dfe7304146104155780633e2183611461043f57610329565b80632614d4a4116103075780632614d4a41461039b5780632ecf03f6146103d6578063307c7a26146103eb57610329565b8063054b3cfd1461032e57806314627834146103555780631c2f991814610386575b600080fd5b34801561033a57600080fd5b506103436108e2565b60408051918252519081900360200190f35b34801561036157600080fd5b5061036a610906565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b50610343610915565b3480156103a757600080fd5b506103d4600480360360408110156103be57600080fd5b506001600160a01b03813516906020013561091b565b005b3480156103e257600080fd5b506103436109b5565b3480156103f757600080fd5b506103436109bb565b34801561040c57600080fd5b5061036a6109dc565b34801561042157600080fd5b506103d46004803603602081101561043857600080fd5b50356109eb565b34801561044b57600080fd5b50610343610b08565b34801561046057600080fd5b5061036a610b0e565b34801561047557600080fd5b506103d46004803603602081101561048c57600080fd5b50356001600160a01b0316610b1d565b3480156104a857600080fd5b50610343610bb4565b3480156104bd57600080fd5b50610343610c40565b3480156104d257600080fd5b506103d4600480360360408110156104e957600080fd5b50803590602001356001600160a01b0316610c64565b34801561050b57600080fd5b50610343610f82565b34801561052057600080fd5b50610343610fa2565b34801561053557600080fd5b50610343611011565b34801561054a57600080fd5b5061034361101c565b34801561055f57600080fd5b50610343611022565b34801561057457600080fd5b5061036a611028565b34801561058957600080fd5b506103d4600480360360208110156105a057600080fd5b5035611047565b3480156105b357600080fd5b50610343611282565b3480156105c857600080fd5b50610343611288565b3480156105dd57600080fd5b506103d4600480360360208110156105f457600080fd5b50356001600160a01b03166112e4565b34801561061057600080fd5b5061034361137b565b34801561062557600080fd5b50610343611391565b34801561063a57600080fd5b506103d46113a4565b34801561064f57600080fd5b50610343611424565b34801561066457600080fd5b50610343611448565b34801561067957600080fd5b50610343611481565b34801561068e57600080fd5b506103d4600480360360208110156106a557600080fd5b50356001600160a01b03166114cd565b3480156106c157600080fd5b506106e8600480360360208110156106d857600080fd5b50356001600160a01b0316611506565b60408051998a5260208a01989098526001600160a01b03909616888801526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b34801561074557600080fd5b5061034361155e565b34801561075a57600080fd5b50610343611565565b34801561076f57600080fd5b506103436004803603602081101561078657600080fd5b50356001600160a01b031661156b565b6103d461163c565b3480156107aa57600080fd5b5061034361180b565b3480156107bf57600080fd5b50610343611896565b3480156107d457600080fd5b506103d4600480360360208110156107eb57600080fd5b50356001600160a01b0316611b8e565b34801561080757600080fd5b50610343611c25565b34801561081c57600080fd5b50610343611ca6565b34801561083157600080fd5b506103d4611cab565b34801561084657600080fd5b50610343611d2b565b34801561085b57600080fd5b50610343611db5565b34801561087057600080fd5b50610343611dbb565b34801561088557600080fd5b50610343611dc1565b34801561089a57600080fd5b5061036a611e1d565b3480156108af57600080fd5b50610343611e41565b3480156108c457600080fd5b5061036a611e57565b3480156108d957600080fd5b50610343611e66565b7f000000000000000000000000000000000000000000000000000000000000000081565b6009546001600160a01b031681565b60055481565b6002546001600160a01b0316331461097a576040805162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c792063616c6c656420627920474661726d4e46542e00000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090206109a58261099f8561156b565b90611f10565b6006820155436007909101555050565b60075481565b60006109d66109c8610f82565b6109d0611896565b90611e6b565b90505b90565b6001546001600160a01b031681565b336000908152600a6020526040902081610a4c576040805162461bcd60e51b815260206004820152601060248201527f556e7374616b696e672030204554482e00000000000000000000000000000000604482015290519081900360640190fd5b8181600401541015610a8f5760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b610a9a336000611f52565b604051339083156108fc029084906000818181858888f19350505050158015610ac7573d6000803e3d6000fd5b506004810154610ad79083611f10565b60048201819055600854610aff91670de0b6b3a764000091610af9919061202d565b90611ece565b60059091015550565b617d0081565b6002546001600160a01b031681565b6009546001600160a01b03163314610b3457600080fd5b6000546001600160a01b031615610b92576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320616c72656164792073657400000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60018054604080516370a0823160e01b815230600482015290516000936109d693606493610af9936001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d6020811015610c3857600080fd5b50519061202d565b7f000000000000000000000000000000000000000000000000000000000000000081565b323314610cb8576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000431015610d2d576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b60008211610d82576040805162461bcd60e51b815260206004820152600d60248201527f5374616b696e672030206c702e00000000000000000000000000000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610dcd57600080fd5b505afa158015610de1573d6000803e3d6000fd5b505050506040513d6020811015610df757600080fd5b50519050610e0433612086565b600154604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b5050336000908152600a602052604090208054610ebe9085611e6b565b808255600654610edc91670de0b6b3a764000091610af9919061202d565b6001820155600881015460ff16158015610f065750610f016064610af984600161202d565b815410155b15610f215760088101805460ff191660011790554360078201555b60028101546001600160a01b0316158015610f4457506001600160a01b03831615155b8015610f5957506001600160a01b0383163314155b15610f7c576002810180546001600160a01b0319166001600160a01b0385161790555b50505050565b60006109d6670de0b6b3a7640000610af9610f9b612268565b479061202d565b6000610fac610f82565b610fb8575060006109d9565b6109d6610fc3610f82565b610af9606461100b610fd3612268565b61100b610fde6123e7565b61100b7f00000000000000000000000000000000000000000000000000000000000000006223a50061202d565b9061202d565b60006109d63361156b565b60035481565b60045481565b336000908152600a60205260409020600201546001600160a01b031690565b336000908152600a60205260409020816110a8576040805162461bcd60e51b815260206004820152600f60248201527f556e7374616b696e672030206c702e0000000000000000000000000000000000604482015290519081900360640190fd5b80548211156110e85760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b6110f133612086565b6001546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050506040513d602081101561116f57600080fd5b5050805461117d9083611f10565b80825560065461119b91670de0b6b3a764000091610af9919061202d565b60018083019190915554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111ed57600080fd5b505afa158015611201573d6000803e3d6000fd5b505050506040513d602081101561121757600080fd5b5051600883015490915060ff16801561123f575061123b6064610af983600161202d565b8254105b806112575750600882015460ff168015611257575080155b1561127d576112653361156b565b600683015560088201805460ff191690554360078301555b505050565b61afc881565b60007f00000000000000000000000000000000000000000000000000000000000000004311156112ba575060006109d9565b6109d67f000000000000000000000000000000000000000000000000000000000000000043611f10565b6009546001600160a01b031633146112fb57600080fd5b6002546001600160a01b031615611359576040805162461bcd60e51b815260206004820152601760248201527f4e4654206164647265737320616c726561647920736574000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600a602052604090206003015490565b336000908152600a602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000000000431015611419576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b61142233612086565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000043101561147a575060006109d9565b5060035490565b600061148b611896565b611497575060006109d9565b6109d66114a2611896565b610af9606461100b6114b2612268565b61100b6114bd6123e7565b60035461100b906223a50061202d565b6009546001600160a01b031633146114e457600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160a01b039095169593949293919290919060ff1689565b620186a081565b6106ef81565b6000611575613055565b506001600160a01b038083166000908152600a6020908152604091829020825161012081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff161580156101008301526116305761162861161d8260e0015143611f1090919063ffffffff16565b60c083015190611e6b565b915050611637565b60c0015190505b919050565b323314611690576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000431015611705576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000004311156117645760405162461bcd60e51b81526004018080602001828103825260228152602001806130d26022913960400191505060405180910390fd5b600034116117b9576040805162461bcd60e51b815260206004820152600e60248201527f5374616b696e672030204554482e000000000000000000000000000000000000604482015290519081900360640190fd5b6117c33334611f52565b336000908152600a6020526040902060048101546117e19034611e6b565b6004820181905560085461180391670de0b6b3a764000091610af9919061202d565b600590910155565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6908261254d565b600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156118f457600080fd5b505afa158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b505161192c575060006109d9565b600080600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60608110156119a757600080fd5b50805160209182015160015460408051630dfe168160e01b815290519396509194506000936001600160a01b0390911692630dfe1681926004808201939291829003018186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611a6157506dffffffffffffffffffffffffffff8216611a74565b506dffffffffffffffffffffffffffff81165b6000611b05600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b5051610af9600261100b86620186a061202d565b90506000611b22620186a0610af9611b1b612268565b859061202d565b600154604080516370a0823160e01b81523060048201529051929350611b8492670de0b6b3a764000092610af99286926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b9550505050505090565b6009546001600160a01b03163314611ba557600080fd5b6001546001600160a01b031615611c03576040805162461bcd60e51b815260206004820152601660248201527f4c50206164647265737320616c72656164792073657400000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60007f0000000000000000000000000000000000000000000000000000000000000000431080611c7457507f000000000000000000000000000000000000000000000000000000000000000043115b15611c81575060006109d9565b507f000000000000000000000000000000000000000000000000000000000000000090565b600181565b7f0000000000000000000000000000000000000000000000000000000000000000431015611d20576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b611422336000611f52565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6906125dd565b60085481565b60065481565b60007f0000000000000000000000000000000000000000000000000000000000000000431115611df3575060006109d9565b6109d67f000000000000000000000000000000000000000000000000000000000000000043611f10565b7f000000000000000000000000000000000000000000000000000000000000000081565b336000908152600a602052604090206004015490565b6000546001600160a01b031681565b600681565b600082820183811015611ec5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611ec583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126d5565b6000611ec583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612777565b6001600160a01b038083166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152611fdf908461254d565b9050611fea836127d1565b8015611ffa57611ffa84826129e0565b61201f670de0b6b3a7640000610af9600854856004015461202d90919063ffffffff16565b826005018190555050505050565b60008261203c57506000611ec8565b8282028284828161204957fe5b0414611ec55760405162461bcd60e51b81526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b6001600160a01b038082166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152612112906125dd565b905061211c612b77565b801561223f5760028201546001600160a01b03166121c35761213e83826129e0565b6000546001600160a01b0316639dc29fac846121606064610af986600661202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505061223f565b60006121d96064610af9611b1b60066002611ece565b905060006121e78383611f10565b90506121f385826129e0565b600284015461220b906001600160a01b0316836129e0565b60028401546001600160a01b03166000908152600a6020526040902060038101546122369084611e6b565b60039091015550505b600654825461225b91670de0b6b3a764000091610af99161202d565b8260010181905550505050565b600080600073b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d60608110156122e457600080fd5b50805160209182015160408051630dfe168160e01b81529051929550909350600092839273b4e16d0168e52d35cacd2c6185b44281ec28c9dc92630dfe1681926004808301939192829003018186803b15801561234057600080fd5b505afa158015612354573d6000803e3d6000fd5b505050506040513d602081101561236a57600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156123ac5750506dffffffffffffffffffffffffffff8181169083166123c4565b50506dffffffffffffffffffffffffffff8083169082165b6123de81610af9620186a061100b8664e8d4a5100061202d565b94505050505090565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d606081101561246457600080fd5b50805160209182015160015460408051630dfe168160e01b8152905193965091945060009384936001600160a01b0390921692630dfe16819260048083019392829003018186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d60208110156124e257600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156125245750506dffffffffffffffffffffffffffff80831690821661253c565b50506dffffffffffffffffffffffffffff8181169083165b6123de81610af984620186a061202d565b6008546000908161255e4785611f10565b90506007544311801561257057508015155b156125a957600061258360075443612e25565b90506125a561259e83610af984670de0b6b3a764000061202d565b8490611e6b565b9250505b6125d48560a0015161099f670de0b6b3a7640000610af9868a6080015161202d90919063ffffffff16565b95945050505050565b600654600154604080516370a0823160e01b815230600482015290516000939284926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d602081101561265b57600080fd5b50516005549091504311801561267057508015155b156126a257600061268360055443612fe2565b905061269e61259e83610af984670de0b6b3a764000061202d565b9250505b6126cd846020015161099f670de0b6b3a7640000610af986896000015161202d90919063ffffffff16565b949350505050565b600081836127615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561272657818101518382015260200161270e565b50505050905090810190601f1680156127535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161276d57fe5b0495945050505050565b600081848411156127c95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561272657818101518382015260200161270e565b505050900390565b60006127dd4783611f10565b9050600754600014806127ee575080155b156127fd5750436007556129dd565b600061280b60075443612e25565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f199250166128a462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128ea57600080fd5b505af11580156128fe573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000000000000000000000000000000000000000000061294a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299057600080fd5b505af11580156129a4573d6000803e3d6000fd5b505050506129d36129ca83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60085490611e6b565b6008555050436007555b50565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a2c57600080fd5b505afa158015612a40573d6000803e3d6000fd5b505050506040513d6020811015612a5657600080fd5b5051905080821115612aed57600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5061127d9050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505050506040513d6020811015612b7057600080fd5b5050505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612bc257600080fd5b505afa158015612bd6573d6000803e3d6000fd5b505050506040513d6020811015612bec57600080fd5b50516005549091501580612bfe575080155b15612c0d575043600555611422565b6000612c1b60055443612fe2565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f19925016612cb462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612cfa57600080fd5b505af1158015612d0e573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f0000000000000000000000000000000000000000000000000000000000000000612d5a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612da057600080fd5b505af1158015612db4573d6000803e3d6000fd5b50505050612de3612dda83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60065490611e6b565b60065543600555600454612df99061afc8611e6b565b4310612e2157612e196004610af96003805461202d90919063ffffffff16565b600355436004555b5050565b6000807f00000000000000000000000000000000000000000000000000000000000000008410158015612e7857507f00000000000000000000000000000000000000000000000000000000000000008310155b15612fb8577f00000000000000000000000000000000000000000000000000000000000000008411158015612ecd57507f00000000000000000000000000000000000000000000000000000000000000008311155b15612ee357612edc8385611f10565b9050612fb8565b7f00000000000000000000000000000000000000000000000000000000000000008411158015612f3257507f000000000000000000000000000000000000000000000000000000000000000083115b15612f6157612edc7f000000000000000000000000000000000000000000000000000000000000000085611f10565b7f000000000000000000000000000000000000000000000000000000000000000084118015612faf57507f000000000000000000000000000000000000000000000000000000000000000083115b15612fb8575060005b6126cd817f000000000000000000000000000000000000000000000000000000000000000061202d565b6000807f0000000000000000000000000000000000000000000000000000000000000000841015801561303557507f00000000000000000000000000000000000000000000000000000000000000008310155b15613047576130448385611f10565b90505b6003546126cd90829061202d565b604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152509056fe556e7374616b696e67206d6f7265207468616e2063757272656e746c79207374616b65642e506f6f6c2069732066696e69736865642c206e6f206d6f7265207374616b696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200a4d01bf19c9be3ae010a82ca714584710abfd893d36fa31692f3ceea195c38f64736f6c63430007050033000000000000000000000000c66fbe50dd33c9aadd65707f7088d597c86fe00f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d

Deployed ByteCode

0x6080604052600436106103295760003560e01c806398f17a3b116101a5578063be8682db116100ec578063dae8f1fd11610095578063f34184fa1161006f578063f34184fa1461088e578063fa8aa3d7146108a3578063fc0c546a146108b8578063fc60a096146108cd57610329565b8063dae8f1fd1461084f578063e3beb31414610864578063ea550ad91461087957610329565b8063cd312cc4116100c6578063cd312cc414610810578063cf71d21114610825578063d34d05b91461083a57610329565b8063be8682db146107b3578063c135916f146107c8578063c7b30602146107fb57610329565b8063a87430ba1161014e578063b4af648911610128578063b4af648914610763578063b53e51e114610796578063b568d8a41461079e57610329565b8063a87430ba146106b5578063aaf5eb6814610739578063b082d99c1461074e57610329565b80639d9165231161017f5780639d916523146106585780639f7fd11d1461066d578063a7ae510b1461068257610329565b806398f17a3b14610619578063997f5dac1461062e5780639acd5e831461064357610329565b80634edbbb5d1161027457806360f5a98b1161021d5780638a8cd1e3116101f75780638a8cd1e3146105a75780638b49f078146105bc57806392570992146105d15780639332fddc1461060457610329565b806360f5a98b146105535780637159ffd8146105685780637417f9261461057d57610329565b8063546ae0391161024e578063546ae03914610514578063577b4059146105295780635ee3f1a71461053e57610329565b80634edbbb5d146104b15780634f90ea4a146104c65780635407886c146104ff57610329565b8063313c06a0116102d657806347ccca02116102b057806347ccca021461045457806349263637146104695780634d159df71461049c57610329565b8063313c06a0146104005780633dfe7304146104155780633e2183611461043f57610329565b80632614d4a4116103075780632614d4a41461039b5780632ecf03f6146103d6578063307c7a26146103eb57610329565b8063054b3cfd1461032e57806314627834146103555780631c2f991814610386575b600080fd5b34801561033a57600080fd5b506103436108e2565b60408051918252519081900360200190f35b34801561036157600080fd5b5061036a610906565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b50610343610915565b3480156103a757600080fd5b506103d4600480360360408110156103be57600080fd5b506001600160a01b03813516906020013561091b565b005b3480156103e257600080fd5b506103436109b5565b3480156103f757600080fd5b506103436109bb565b34801561040c57600080fd5b5061036a6109dc565b34801561042157600080fd5b506103d46004803603602081101561043857600080fd5b50356109eb565b34801561044b57600080fd5b50610343610b08565b34801561046057600080fd5b5061036a610b0e565b34801561047557600080fd5b506103d46004803603602081101561048c57600080fd5b50356001600160a01b0316610b1d565b3480156104a857600080fd5b50610343610bb4565b3480156104bd57600080fd5b50610343610c40565b3480156104d257600080fd5b506103d4600480360360408110156104e957600080fd5b50803590602001356001600160a01b0316610c64565b34801561050b57600080fd5b50610343610f82565b34801561052057600080fd5b50610343610fa2565b34801561053557600080fd5b50610343611011565b34801561054a57600080fd5b5061034361101c565b34801561055f57600080fd5b50610343611022565b34801561057457600080fd5b5061036a611028565b34801561058957600080fd5b506103d4600480360360208110156105a057600080fd5b5035611047565b3480156105b357600080fd5b50610343611282565b3480156105c857600080fd5b50610343611288565b3480156105dd57600080fd5b506103d4600480360360208110156105f457600080fd5b50356001600160a01b03166112e4565b34801561061057600080fd5b5061034361137b565b34801561062557600080fd5b50610343611391565b34801561063a57600080fd5b506103d46113a4565b34801561064f57600080fd5b50610343611424565b34801561066457600080fd5b50610343611448565b34801561067957600080fd5b50610343611481565b34801561068e57600080fd5b506103d4600480360360208110156106a557600080fd5b50356001600160a01b03166114cd565b3480156106c157600080fd5b506106e8600480360360208110156106d857600080fd5b50356001600160a01b0316611506565b60408051998a5260208a01989098526001600160a01b03909616888801526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b34801561074557600080fd5b5061034361155e565b34801561075a57600080fd5b50610343611565565b34801561076f57600080fd5b506103436004803603602081101561078657600080fd5b50356001600160a01b031661156b565b6103d461163c565b3480156107aa57600080fd5b5061034361180b565b3480156107bf57600080fd5b50610343611896565b3480156107d457600080fd5b506103d4600480360360208110156107eb57600080fd5b50356001600160a01b0316611b8e565b34801561080757600080fd5b50610343611c25565b34801561081c57600080fd5b50610343611ca6565b34801561083157600080fd5b506103d4611cab565b34801561084657600080fd5b50610343611d2b565b34801561085b57600080fd5b50610343611db5565b34801561087057600080fd5b50610343611dbb565b34801561088557600080fd5b50610343611dc1565b34801561089a57600080fd5b5061036a611e1d565b3480156108af57600080fd5b50610343611e41565b3480156108c457600080fd5b5061036a611e57565b3480156108d957600080fd5b50610343611e66565b7f0000000000000000000000000000000000000000000000000000000000b2670c81565b6009546001600160a01b031681565b60055481565b6002546001600160a01b0316331461097a576040805162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c792063616c6c656420627920474661726d4e46542e00000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090206109a58261099f8561156b565b90611f10565b6006820155436007909101555050565b60075481565b60006109d66109c8610f82565b6109d0611896565b90611e6b565b90505b90565b6001546001600160a01b031681565b336000908152600a6020526040902081610a4c576040805162461bcd60e51b815260206004820152601060248201527f556e7374616b696e672030204554482e00000000000000000000000000000000604482015290519081900360640190fd5b8181600401541015610a8f5760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b610a9a336000611f52565b604051339083156108fc029084906000818181858888f19350505050158015610ac7573d6000803e3d6000fd5b506004810154610ad79083611f10565b60048201819055600854610aff91670de0b6b3a764000091610af9919061202d565b90611ece565b60059091015550565b617d0081565b6002546001600160a01b031681565b6009546001600160a01b03163314610b3457600080fd5b6000546001600160a01b031615610b92576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e206164647265737320616c72656164792073657400000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60018054604080516370a0823160e01b815230600482015290516000936109d693606493610af9936001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d6020811015610c3857600080fd5b50519061202d565b7f000000000000000000000000000000000000000000000000003b363eba41aaaa81565b323314610cb8576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015610d2d576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b60008211610d82576040805162461bcd60e51b815260206004820152600d60248201527f5374616b696e672030206c702e00000000000000000000000000000000000000604482015290519081900360640190fd5b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015610dcd57600080fd5b505afa158015610de1573d6000803e3d6000fd5b505050506040513d6020811015610df757600080fd5b50519050610e0433612086565b600154604080517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610e7757600080fd5b505af1158015610e8b573d6000803e3d6000fd5b505050506040513d6020811015610ea157600080fd5b5050336000908152600a602052604090208054610ebe9085611e6b565b808255600654610edc91670de0b6b3a764000091610af9919061202d565b6001820155600881015460ff16158015610f065750610f016064610af984600161202d565b815410155b15610f215760088101805460ff191660011790554360078201555b60028101546001600160a01b0316158015610f4457506001600160a01b03831615155b8015610f5957506001600160a01b0383163314155b15610f7c576002810180546001600160a01b0319166001600160a01b0385161790555b50505050565b60006109d6670de0b6b3a7640000610af9610f9b612268565b479061202d565b6000610fac610f82565b610fb8575060006109d9565b6109d6610fc3610f82565b610af9606461100b610fd3612268565b61100b610fde6123e7565b61100b7f000000000000000000000000000000000000000000000000003b363eba41aaaa6223a50061202d565b9061202d565b60006109d63361156b565b60035481565b60045481565b336000908152600a60205260409020600201546001600160a01b031690565b336000908152600a60205260409020816110a8576040805162461bcd60e51b815260206004820152600f60248201527f556e7374616b696e672030206c702e0000000000000000000000000000000000604482015290519081900360640190fd5b80548211156110e85760405162461bcd60e51b81526004018080602001828103825260258152602001806130ad6025913960400191505060405180910390fd5b6110f133612086565b6001546040805163a9059cbb60e01b81523360048201526024810185905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561114557600080fd5b505af1158015611159573d6000803e3d6000fd5b505050506040513d602081101561116f57600080fd5b5050805461117d9083611f10565b80825560065461119b91670de0b6b3a764000091610af9919061202d565b60018083019190915554604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111ed57600080fd5b505afa158015611201573d6000803e3d6000fd5b505050506040513d602081101561121757600080fd5b5051600883015490915060ff16801561123f575061123b6064610af983600161202d565b8254105b806112575750600882015460ff168015611257575080155b1561127d576112653361156b565b600683015560088201805460ff191690554360078301555b505050565b61afc881565b60007f0000000000000000000000000000000000000000000000000000000000b2670c4311156112ba575060006109d9565b6109d67f0000000000000000000000000000000000000000000000000000000000b2670c43611f10565b6009546001600160a01b031633146112fb57600080fd5b6002546001600160a01b031615611359576040805162461bcd60e51b815260206004820152601760248201527f4e4654206164647265737320616c726561647920736574000000000000000000604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600a602052604090206003015490565b336000908152600a602052604090205490565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611419576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b61142233612086565b565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c81565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c43101561147a575060006109d9565b5060035490565b600061148b611896565b611497575060006109d9565b6109d66114a2611896565b610af9606461100b6114b2612268565b61100b6114bd6123e7565b60035461100b906223a50061202d565b6009546001600160a01b031633146114e457600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600a60205260009081526040902080546001820154600283015460038401546004850154600586015460068701546007880154600890980154969795966001600160a01b039095169593949293919290919060ff1689565b620186a081565b6106ef81565b6000611575613055565b506001600160a01b038083166000908152600a6020908152604091829020825161012081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff161580156101008301526116305761162861161d8260e0015143611f1090919063ffffffff16565b60c083015190611e6b565b915050611637565b60c0015190505b919050565b323314611690576040805162461bcd60e51b815260206004820152601660248201527f436f6e747261637473206e6f7420616c6c6f7765642e00000000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611705576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000b2670c4311156117645760405162461bcd60e51b81526004018080602001828103825260228152602001806130d26022913960400191505060405180910390fd5b600034116117b9576040805162461bcd60e51b815260206004820152600e60248201527f5374616b696e672030204554482e000000000000000000000000000000000000604482015290519081900360640190fd5b6117c33334611f52565b336000908152600a6020526040902060048101546117e19034611e6b565b6004820181905560085461180391670de0b6b3a764000091610af9919061202d565b600590910155565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6908261254d565b600154604080517f18160ddd00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156118f457600080fd5b505afa158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b505161192c575060006109d9565b600080600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561197d57600080fd5b505afa158015611991573d6000803e3d6000fd5b505050506040513d60608110156119a757600080fd5b50805160209182015160015460408051630dfe168160e01b815290519396509194506000936001600160a01b0390911692630dfe1681926004808201939291829003018186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d6020811015611a2457600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415611a6157506dffffffffffffffffffffffffffff8216611a74565b506dffffffffffffffffffffffffffff81165b6000611b05600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ac757600080fd5b505afa158015611adb573d6000803e3d6000fd5b505050506040513d6020811015611af157600080fd5b5051610af9600261100b86620186a061202d565b90506000611b22620186a0610af9611b1b612268565b859061202d565b600154604080516370a0823160e01b81523060048201529051929350611b8492670de0b6b3a764000092610af99286926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610c0e57600080fd5b9550505050505090565b6009546001600160a01b03163314611ba557600080fd5b6001546001600160a01b031615611c03576040805162461bcd60e51b815260206004820152601660248201527f4c50206164647265737320616c72656164792073657400000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c431080611c7457507f0000000000000000000000000000000000000000000000000000000000b2670c43115b15611c81575060006109d9565b507f000000000000000000000000000000000000000000000000003b363eba41aaaa90565b600181565b7f0000000000000000000000000000000000000000000000000000000000b1ea0c431015611d20576040805162461bcd60e51b815260206004820152601860248201527f506f6f6c206861736e27742073746172746564207965742e0000000000000000604482015290519081900360640190fd5b611422336000611f52565b336000908152600a602090815260408083208151610120810183528154815260018201549381019390935260028101546001600160a01b0316918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201526109d6906125dd565b60085481565b60065481565b60007f0000000000000000000000000000000000000000000000000000000000b1ea0c431115611df3575060006109d9565b6109d67f0000000000000000000000000000000000000000000000000000000000b1ea0c43611f10565b7f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d81565b336000908152600a602052604090206004015490565b6000546001600160a01b031681565b600681565b600082820183811015611ec5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611ec583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126d5565b6000611ec583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612777565b6001600160a01b038083166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152611fdf908461254d565b9050611fea836127d1565b8015611ffa57611ffa84826129e0565b61201f670de0b6b3a7640000610af9600854856004015461202d90919063ffffffff16565b826005018190555050505050565b60008261203c57506000611ec8565b8282028284828161204957fe5b0414611ec55760405162461bcd60e51b81526004018080602001828103825260218152602001806130f46021913960400191505060405180910390fd5b6001600160a01b038082166000908152600a60209081526040808320815161012081018352815481526001820154938101939093526002810154909416908201526003830154606082015260048301546080820152600583015460a0820152600683015460c0820152600783015460e0820152600883015460ff161515610100820152612112906125dd565b905061211c612b77565b801561223f5760028201546001600160a01b03166121c35761213e83826129e0565b6000546001600160a01b0316639dc29fac846121606064610af986600661202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156121a657600080fd5b505af11580156121ba573d6000803e3d6000fd5b5050505061223f565b60006121d96064610af9611b1b60066002611ece565b905060006121e78383611f10565b90506121f385826129e0565b600284015461220b906001600160a01b0316836129e0565b60028401546001600160a01b03166000908152600a6020526040902060038101546122369084611e6b565b60039091015550505b600654825461225b91670de0b6b3a764000091610af99161202d565b8260010181905550505050565b600080600073b4e16d0168e52d35cacd2c6185b44281ec28c9dc6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d60608110156122e457600080fd5b50805160209182015160408051630dfe168160e01b81529051929550909350600092839273b4e16d0168e52d35cacd2c6185b44281ec28c9dc92630dfe1681926004808301939192829003018186803b15801561234057600080fd5b505afa158015612354573d6000803e3d6000fd5b505050506040513d602081101561236a57600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156123ac5750506dffffffffffffffffffffffffffff8181169083166123c4565b50506dffffffffffffffffffffffffffff8083169082165b6123de81610af9620186a061100b8664e8d4a5100061202d565b94505050505090565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561243a57600080fd5b505afa15801561244e573d6000803e3d6000fd5b505050506040513d606081101561246457600080fd5b50805160209182015160015460408051630dfe168160e01b8152905193965091945060009384936001600160a01b0390921692630dfe16819260048083019392829003018186803b1580156124b857600080fd5b505afa1580156124cc573d6000803e3d6000fd5b505050506040513d60208110156124e257600080fd5b50516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156125245750506dffffffffffffffffffffffffffff80831690821661253c565b50506dffffffffffffffffffffffffffff8181169083165b6123de81610af984620186a061202d565b6008546000908161255e4785611f10565b90506007544311801561257057508015155b156125a957600061258360075443612e25565b90506125a561259e83610af984670de0b6b3a764000061202d565b8490611e6b565b9250505b6125d48560a0015161099f670de0b6b3a7640000610af9868a6080015161202d90919063ffffffff16565b95945050505050565b600654600154604080516370a0823160e01b815230600482015290516000939284926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561263157600080fd5b505afa158015612645573d6000803e3d6000fd5b505050506040513d602081101561265b57600080fd5b50516005549091504311801561267057508015155b156126a257600061268360055443612fe2565b905061269e61259e83610af984670de0b6b3a764000061202d565b9250505b6126cd846020015161099f670de0b6b3a7640000610af986896000015161202d90919063ffffffff16565b949350505050565b600081836127615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561272657818101518382015260200161270e565b50505050905090810190601f1680156127535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161276d57fe5b0495945050505050565b600081848411156127c95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561272657818101518382015260200161270e565b505050900390565b60006127dd4783611f10565b9050600754600014806127ee575080155b156127fd5750436007556129dd565b600061280b60075443612e25565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b15801561285f57600080fd5b505af1158015612873573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f199250166128a462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156128ea57600080fd5b505af11580156128fe573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d61294a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299057600080fd5b505af11580156129a4573d6000803e3d6000fd5b505050506129d36129ca83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60085490611e6b565b6008555050436007555b50565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612a2c57600080fd5b505afa158015612a40573d6000803e3d6000fd5b505050506040513d6020811015612a5657600080fd5b5051905080821115612aed57600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b505050506040513d6020811015612ae557600080fd5b5061127d9050565b600080546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018790529151919092169263a9059cbb92604480820193602093909283900390910190829087803b158015612b4657600080fd5b505af1158015612b5a573d6000803e3d6000fd5b505050506040513d6020811015612b7057600080fd5b5050505050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612bc257600080fd5b505afa158015612bd6573d6000803e3d6000fd5b505050506040513d6020811015612bec57600080fd5b50516005549091501580612bfe575080155b15612c0d575043600555611422565b6000612c1b60055443612fe2565b60008054604080516340c10f1960e01b81523060048201526024810185905290519394506001600160a01b03909116926340c10f199260448084019391929182900301818387803b158015612c6f57600080fd5b505af1158015612c83573d6000803e3d6000fd5b50506000546009546001600160a01b0391821693506340c10f19925016612cb462989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612cfa57600080fd5b505af1158015612d0e573d6000803e3d6000fd5b50506000546001600160a01b031691506340c10f1990507f000000000000000000000000d39a38bd2d2d552f3908ff698a5530aa397fb92d612d5a62989680610af9866207a12061202d565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612da057600080fd5b505af1158015612db4573d6000803e3d6000fd5b50505050612de3612dda83610af9670de0b6b3a76400008561202d90919063ffffffff16565b60065490611e6b565b60065543600555600454612df99061afc8611e6b565b4310612e2157612e196004610af96003805461202d90919063ffffffff16565b600355436004555b5050565b6000807f0000000000000000000000000000000000000000000000000000000000b1ea0c8410158015612e7857507f0000000000000000000000000000000000000000000000000000000000b1ea0c8310155b15612fb8577f0000000000000000000000000000000000000000000000000000000000b2670c8411158015612ecd57507f0000000000000000000000000000000000000000000000000000000000b2670c8311155b15612ee357612edc8385611f10565b9050612fb8565b7f0000000000000000000000000000000000000000000000000000000000b2670c8411158015612f3257507f0000000000000000000000000000000000000000000000000000000000b2670c83115b15612f6157612edc7f0000000000000000000000000000000000000000000000000000000000b2670c85611f10565b7f0000000000000000000000000000000000000000000000000000000000b2670c84118015612faf57507f0000000000000000000000000000000000000000000000000000000000b2670c83115b15612fb8575060005b6126cd817f000000000000000000000000000000000000000000000000003b363eba41aaaa61202d565b6000807f0000000000000000000000000000000000000000000000000000000000b1ea0c841015801561303557507f0000000000000000000000000000000000000000000000000000000000b1ea0c8310155b15613047576130448385611f10565b90505b6003546126cd90829061202d565b604051806101200160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152509056fe556e7374616b696e67206d6f7265207468616e2063757272656e746c79207374616b65642e506f6f6c2069732066696e69736865642c206e6f206d6f7265207374616b696e672e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200a4d01bf19c9be3ae010a82ca714584710abfd893d36fa31692f3ceea195c38f64736f6c63430007050033