ETH Price: $3,102.29 (-1.76%)

Contract

0xD28D60E238E1575D850c3b9FB44700B63F4F95Eb
 
Transaction Hash
Method
Block
From
To
Sweep210775832024-10-30 9:31:5920 days ago1730280719IN
0xD28D60E2...63F4F95Eb
0 ETH0.000259689.91022536
Emergency Withdr...154183422022-08-26 23:56:14816 days ago1661558174IN
0xD28D60E2...63F4F95Eb
0 ETH0.004857161.63598977
Emergency Withdr...139156362021-12-31 22:01:101054 days ago1640988070IN
0xD28D60E2...63F4F95Eb
0 ETH0.01248866.96626375
Emergency Withdr...138929912021-12-28 9:44:221057 days ago1640684662IN
0xD28D60E2...63F4F95Eb
0 ETH0.0092117545.24837304
Withdraw137895562021-12-12 9:42:151073 days ago1639302135IN
0xD28D60E2...63F4F95Eb
0 ETH0.0114524536.27293815
Withdraw137735062021-12-09 21:50:121076 days ago1639086612IN
0xD28D60E2...63F4F95Eb
0 ETH0.0225040471.2789444
Emergency Withdr...137606192021-12-07 20:15:171078 days ago1638908117IN
0xD28D60E2...63F4F95Eb
0 ETH0.0123266976.61328846
Emergency Withdr...137605982021-12-07 20:10:571078 days ago1638907857IN
0xD28D60E2...63F4F95Eb
0 ETH0.0086566379.05893813
Emergency Withdr...137605952021-12-07 20:10:001078 days ago1638907800IN
0xD28D60E2...63F4F95Eb
0 ETH0.0114520856.84490953
Emergency Withdr...137605762021-12-07 20:07:261078 days ago1638907646IN
0xD28D60E2...63F4F95Eb
0 ETH0.0079667590.90730622
Emergency Withdr...137605732021-12-07 20:06:291078 days ago1638907589IN
0xD28D60E2...63F4F95Eb
0 ETH0.0074030773.38642292
Emergency Withdr...137605692021-12-07 20:05:471078 days ago1638907547IN
0xD28D60E2...63F4F95Eb
0 ETH0.0085614677.24721453
Emergency Withdr...137605232021-12-07 19:58:511078 days ago1638907131IN
0xD28D60E2...63F4F95Eb
0 ETH0.0078162980.57368489
Withdraw137594842021-12-07 16:07:591078 days ago1638893279IN
0xD28D60E2...63F4F95Eb
0 ETH0.0223741473.42791532
Withdraw137016002021-11-28 9:28:281087 days ago1638091708IN
0xD28D60E2...63F4F95Eb
0 ETH0.0199853.6106954
Withdraw137016002021-11-28 9:28:281087 days ago1638091708IN
0xD28D60E2...63F4F95Eb
0 ETH0.0267614453.6106954
Withdraw137013182021-11-28 8:22:061087 days ago1638087726IN
0xD28D60E2...63F4F95Eb
0 ETH0.0197842865.57386033
Claim137012972021-11-28 8:18:291087 days ago1638087509IN
0xD28D60E2...63F4F95Eb
0 ETH0.0194845267.19798982
Withdraw136917102021-11-26 19:47:381089 days ago1637956058IN
0xD28D60E2...63F4F95Eb
0 ETH0.018334585.07299247
Withdraw136850102021-11-25 18:16:361090 days ago1637864196IN
0xD28D60E2...63F4F95Eb
0 ETH0.03519368115.4993313
Withdraw136301662021-11-17 1:58:581098 days ago1637114338IN
0xD28D60E2...63F4F95Eb
0 ETH0.03554939123.69911516
Withdraw136301482021-11-17 1:55:391098 days ago1637114139IN
0xD28D60E2...63F4F95Eb
0 ETH0.07551256169.89388518
Withdraw136301182021-11-17 1:47:521098 days ago1637113672IN
0xD28D60E2...63F4F95Eb
0 ETH0.04717727106.12366104
Withdraw136301122021-11-17 1:46:221098 days ago1637113582IN
0xD28D60E2...63F4F95Eb
0 ETH0.04349034106.64416514
Deposit136301042021-11-17 1:45:091098 days ago1637113509IN
0xD28D60E2...63F4F95Eb
0 ETH0.0253801396.21194445
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:
AnyStakeV2

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 150 runs

Other Settings:
default evmVersion, MIT license
File 1 of 19 : AnyStakeV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

import "./lib/@defiat-crypto/interfaces/IDeFiatPoints.sol";
import "./interfaces/IAnyStake.sol";
import "./interfaces/IAnyStakeMigrator.sol";
import "./interfaces/IAnyStakeVault.sol";
import "./utils/AnyStakeUtils.sol";
import "./AnyStake.sol";

contract AnyStakeV2 is IAnyStakeMigrator, IAnyStake, AnyStakeUtils {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // EVENTS
    event Initialized(address indexed user, address vault);
    event Claim(address indexed user, uint256 indexed pid, uint256 amount);
    event ClaimAll(address indexed user, uint256 amount);
    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event Migrate(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event PoolAdded(address indexed user, uint256 indexed pid, address indexed stakedToken, address lpToken, uint256 allocPoints);
    event MigratorUpdated(address indexed user, address migrator);
    event VaultUpdated(address indexed user, address vault);
    event PoolAllocPointsUpdated(address indexed user, uint256 indexed pid, uint256 allocPoints);
    event PoolVipAmountUpdated(address indexed user, uint256 indexed pid, uint256 vipAmount);
    event PoolStakingFeeUpdated(address indexed user, uint256 indexed pid, uint256 stakingFee);
    event PointStipendUpdated(address indexed user, uint256 stipend);

    // STRUCTS
    // UserInfo - User metrics, pending reward = (user.amount * pool.DFTPerShare) - user.rewardDebt
    struct UserInfo {
        uint256 amount; // How many tokens the user has provided.
        uint256 rewardDebt; // Token rewards paid out to user
        uint256 lastRewardBlock; // last pool interaction
    }

    // PoolInfo - Pool metrics
    struct PoolInfo {
        address stakedToken; // Address of staked token contract.
        address lpToken; // uniswap LP token corresponding to the trading pair needed for price calculation
        uint256 totalStaked; // total tokens staked
        uint256 allocPoint; // How many allocation points assigned to this pool. DFTs to distribute per block. (ETH = 2.3M blocks per year)
        uint256 rewardsPerShare; // Accumulated DFTs per share, times 1e18. See below.
        uint256 lastRewardBlock; // last pool update
        uint256 vipAmount; // amount of DFT tokens that must be staked to access the pool
        uint256 stakingFee; // the % withdrawal fee charged. base 1000, 50 = 5%
        uint256 rewardDebt; // rewards paid out to the pool
    }

    address public anystake; // AnyStake V1 contract
    address public migrator; // contract where we may migrate too
    address public vault; // where rewards are stored for distribution

    PoolInfo[] public poolInfo; // array of AnyStake pools
    mapping(uint256 => mapping(address => UserInfo)) public userInfo; // mapping of (pid => (userAddress => userInfo))
    mapping(address => uint256) public pids; // quick mapping for pool ids (staked_token => pid)

    uint256 public pointStipend; // amount of DFTP awarded per deposit
    uint256 public rewardsPerAllocPoint; // rewards per pool allocPoint, times 1e18 to maintain precision
    uint256 public totalAllocPoint; // Total allocation points. Must be the sum of all allocation points in all pools.

    modifier NoReentrant(uint256 pid, address user) {
        require(
            block.number > userInfo[pid][user].lastRewardBlock,
            "AnyStake: Must wait 1 block"
        );
        _;
    }

    modifier onlyAnyStake {
        require(msg.sender == anystake, "AnyStake: Only previous AnyStake allowed");
        _;
    }

    modifier onlyVault() {
        require(msg.sender == vault, "AnyStake: Only Vault allowed");
        _;
    }

    constructor(address _anystake, address _router, address _gov, address _points, address _token) 
        public 
        AnyStakeUtils(_router, _gov, _points, _token)
    {
        anystake = _anystake;
        pointStipend = 1e18;
    }

    // Pool - Get any incoming rewards, called during Vault.distributeRewards()
    function addReward(uint256 amount) external override onlyVault {
        if (amount == 0) {
            return;
        }

        rewardsPerAllocPoint = rewardsPerAllocPoint.add(amount.mul(1e18).div(totalAllocPoint));
    }

    // Pool - Updates the reward variables of the given pool
    function updatePool(uint256 pid) external {
        _updatePool(pid);
    }

    // Pool - Update internal
    function _updatePool(uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];

        if (pool.totalStaked == 0 || pool.lastRewardBlock >= block.number || pool.allocPoint == 0) {
            return;
        }

        // calculate rewards, returns if already done this block
        IAnyStakeVault(vault).calculateRewards();     

        // Calculate pool's share of pending rewards 
        uint256 poolRewards = pendingPool(_pid);
        
        // update pool variables
        if (poolRewards > 0) {
            pool.rewardsPerShare = pool.rewardsPerShare.add(poolRewards.mul(1e18).div(pool.totalStaked));
            pool.rewardDebt = pool.rewardDebt.add(poolRewards);
        }
        
        pool.lastRewardBlock = block.number;
    }

    // Pool - Update all pool reward variables
    // NOTE: Must call before any change to totalAllocPoint (addPool, updatePoolAllocPoints)
    function massUpdatePools() public {
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; pid++) {
            _updatePool(pid);
        }
    }

    // Pool - Claim rewards
    function claim(uint256 pid) external override NoReentrant(pid, msg.sender) {
        PoolInfo storage pool = poolInfo[pid];
        UserInfo storage user = userInfo[pid][msg.sender];

        _updatePool(pid);
        _claim(pid, msg.sender);

        // set user metrics, reward block
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
        user.lastRewardBlock = block.number;
    }

    // Pool - Claim internal, called during deposit() and withdraw()
    function _claim(uint256 _pid, address _user) internal {
        uint256 rewards = pending(_pid, _user);
        if (rewards == 0) {
            return;
        }

        // transfer DFT rewards from Vault
        IAnyStakeVault(vault).distributeRewards(_user, rewards);
        emit Claim(_user, _pid, rewards);
    }

    // Pool - Claim all rewards, only perform one transfer to save gas
    function claimAll() external {
        uint256 totalClaimable;
        uint256 length = poolInfo.length;
        for (uint256 pid = 0; pid < length; pid++) {
            PoolInfo storage pool = poolInfo[pid];
            UserInfo storage user = userInfo[pid][msg.sender];
            if (user.lastRewardBlock < block.number && user.amount > 0) {
                _updatePool(pid);
                uint256 rewards = pending(pid, msg.sender);
                if (rewards > 0) {
                    totalClaimable = totalClaimable.add(rewards);
                    user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
                    user.lastRewardBlock = block.number;
                    emit Claim(msg.sender, pid, rewards);
                }
            }
        }

        if (totalClaimable > 0) {
            IAnyStakeVault(vault).distributeRewards(msg.sender, totalClaimable);
            emit ClaimAll(msg.sender, totalClaimable);
        }
    }

    // Pool - Deposit Tokens
    function deposit(uint256 pid, uint256 amount) external override NoReentrant(pid, msg.sender) {
        _deposit(msg.sender, pid, amount);
    }

    // Pool - Deposit internal
    function _deposit(address _user, uint256 _pid, uint256 _amount) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        
        require(_amount > 0, "Deposit: Cannot deposit zero tokens");
        require(pool.allocPoint > 0, "Deposit: Pool is not active");
        require(pool.vipAmount <= userInfo[0][_user].amount, "Deposit: VIP Only");

        // Update and claim rewards
        _updatePool(_pid);
        _claim(_pid, _user);

        // Get tokens from user, balance check to support Fee-On-Transfer tokens
        uint256 amountBefore = IERC20(pool.stakedToken).balanceOf(address(this));
        IERC20(pool.stakedToken).safeTransferFrom(_user, address(this), _amount);
        uint256 amountAfter = IERC20(pool.stakedToken).balanceOf(address(this));
        uint256 amount = amountAfter.sub(amountBefore);

        // Finalize, update user metrics
        pool.totalStaked = pool.totalStaked.add(amount);
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
        user.lastRewardBlock = block.number;
        
        // reward user
        IDeFiatPoints(DeFiatPoints).addPoints(_user, IDeFiatPoints(DeFiatPoints).viewTxThreshold(), pointStipend);

        // Transfer the total amounts from user and update pool user.amount into the AnyStake contract
        emit Deposit(_user, _pid, amount);
    }

    // Pool - Withdraw staked tokens
    function withdraw(uint256 pid, uint256 amount) external override NoReentrant(pid, msg.sender) {
        _withdraw(msg.sender, pid, amount);
    }
    
    // Pool - Withdraw Internal
    function _withdraw(
        address _user,
        uint256 _pid,
        uint256 _amount
    ) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];

        require(_amount > 0, "Withdraw: amount must be greater than zero");
        require(user.amount >= _amount, "Withdraw: user amount insufficient");
        require(pool.vipAmount <= userInfo[0][_user].amount, "Withdraw: VIP Only");
        
        // claim rewards
        _updatePool(_pid);
        _claim(_pid, _user);

        // update pool / user metrics
        pool.totalStaked = pool.totalStaked.sub(_amount);
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
        user.lastRewardBlock = block.number;

        // find the staking fee amount
        uint256 stakingFeeAmount = _amount.mul(pool.stakingFee).div(1000);
        // get user's remaining shares after fee
        uint256 remainingUserAmount = _amount.sub(stakingFeeAmount);

        if(stakingFeeAmount > 0){
            // Send Fee to Vault and buy DFT, balance check to support Fee-On-Transfer tokens
            uint256 balanceBefore = IERC20(pool.stakedToken).balanceOf(vault);
            safeTokenTransfer(vault, pool.stakedToken, stakingFeeAmount);
            uint256 balanceAfter = IERC20(pool.stakedToken).balanceOf(vault);
            uint256 balance = balanceAfter.sub(balanceBefore);
            // perform the buyback
            IAnyStakeVault(vault).buyDeFiatWithTokens(pool.stakedToken, balance);
        }

        // withdraw user tokens
        safeTokenTransfer(_user, pool.stakedToken, remainingUserAmount);        
        emit Withdraw(_user, _pid, remainingUserAmount);
    }

    // Pool - migrate stake to a new contract, should only be called after 
    function migrate(uint256 pid) external NoReentrant(pid, msg.sender) {
        _migrate(msg.sender, pid);
    }

    // Pool - migrate internal
    function _migrate(address _user, uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 balance = user.amount;

        require(migrator != address(0), "Migrate: No migrator set");
        require(balance > 0, "Migrate: No tokens to migrate");
        require(pool.allocPoint == 0, "Migrate: Pool is still active");

        _claim(_pid, _user);

        pool.totalStaked = pool.totalStaked.sub(balance);
        user.amount = 0;
        user.rewardDebt = 0;
        user.lastRewardBlock = block.number;

        IERC20(pool.stakedToken).safeApprove(migrator, balance);
        IAnyStakeMigrator(migrator).migrateTo(_user, pool.stakedToken, balance);
        emit Migrate(_user, _pid, balance);
    }

    function migrateTo(address _user, address _token, uint256 _amount) 
        external
        override
        onlyAnyStake
    {
        uint256 pid = pids[_token];
        PoolInfo storage pool = poolInfo[pid];
        UserInfo storage user = userInfo[pid][_user];

        _claim(pid, _user);

        // transfer user stake from AnyStake, do the balance check
        uint256 balanceBefore = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transferFrom(anystake, address(this), _amount);
        uint256 balanceAfter = IERC20(_token).balanceOf(address(this));
        uint256 userDeposit = balanceAfter.sub(balanceBefore);

        // update user / pool metrics
        pool.totalStaked = pool.totalStaked.add(userDeposit);
        user.amount = user.amount.add(userDeposit);
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
        user.lastRewardBlock = block.number;

        IDeFiatPoints(DeFiatPoints).addPoints(_user, IDeFiatPoints(DeFiatPoints).viewTxThreshold(), pointStipend);
    }

    // Pool - withdraw all stake and forfeit rewards, skips pool update
    function emergencyWithdraw(uint256 pid) external NoReentrant(pid, msg.sender) {
        PoolInfo storage pool = poolInfo[pid];
        UserInfo storage user = userInfo[pid][msg.sender];
        require(user.amount > 0, "EmergencyWithdraw: user amount insufficient");

        // find the fee amount and remaining user share
        uint256 stakingFeeAmount = user.amount.mul(pool.stakingFee).div(1000);
        uint256 remainingUserAmount = user.amount.sub(stakingFeeAmount);

        // update pool / user metrics
        pool.totalStaked = pool.totalStaked.sub(user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
        user.lastRewardBlock = block.number;

        // transfer vault the fee for admins to perform buyback, send user share
        safeTokenTransfer(vault, pool.stakedToken, stakingFeeAmount);
        safeTokenTransfer(msg.sender, pool.stakedToken, remainingUserAmount);
        emit EmergencyWithdraw(msg.sender, pid, remainingUserAmount);
    }

    // View - gets stakedToken price from the Vault
    function getPrice(uint256 pid) external view returns (uint256) {
        address token = poolInfo[pid].stakedToken;
        address lpToken = poolInfo[pid].lpToken;

        return IAnyStakeVault(vault).getTokenPrice(token, lpToken);
    }

    // View - Pending DFT Rewards for user in pool
    function pending(uint256 _pid, address _user)
        public
        view
        returns (uint256)
    {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];

        return user.amount.mul(pool.rewardsPerShare).div(1e18).sub(user.rewardDebt);
    }

    // View - Pending DFT Rewards for a given pool
    function pendingPool(uint256 _pid)
        public
        view
        returns (uint256)
    {
        PoolInfo storage pool = poolInfo[_pid];
        return rewardsPerAllocPoint.mul(pool.allocPoint).div(1e18).sub(pool.rewardDebt);
    }

    // View - View Pool Length
    function poolLength() external view returns (uint256) {
        return poolInfo.length; // number of pools (pids)
    }

    // Governance - Add Multiple Token Pools
    function addPoolBatch(
        address[] calldata tokens,
        address[] calldata lpTokens,
        uint256[] calldata allocPoints,
        uint256[] calldata vipAmounts,
        uint256[] calldata stakingFees
    ) external onlyGovernor {
        massUpdatePools();

        for (uint i = 0; i < tokens.length; i++) {
            _addPool(tokens[i], lpTokens[i], allocPoints[i], vipAmounts[i], stakingFees[i]);
        }
    }

    // Governance - Add Single Token Pool
    function addPool(
        address token,
        address lpToken, 
        uint256 allocPoint,
        uint256 vipAmount,
        uint256 stakingFee
    ) external onlyGovernor {
        massUpdatePools();
        _addPool(token, lpToken, allocPoint, vipAmount, stakingFee);
    }

    // Governance - Add Token Pool Internal
    function _addPool(
        address stakedToken,
        address lpToken,
        uint256 allocPoint,
        uint256 vipAmount,
        uint256 stakingFee
    ) internal {
        require(pids[stakedToken] == 0, "AddPool: Token pool already added");

        // add token to pids
        pids[stakedToken] = poolInfo.length;
        // stakedToken now non-withrawable by admins
        _blacklistedAdminWithdraw[stakedToken] = true;
        // update total pool points
        totalAllocPoint = totalAllocPoint.add(allocPoint);
        // find reward debt for the pool
        uint256 rewardDebt = rewardsPerAllocPoint.mul(allocPoint).div(1e18);

        // Add new pool
        poolInfo.push(
            PoolInfo({
                stakedToken: stakedToken,
                lpToken: lpToken,
                allocPoint: allocPoint,
                lastRewardBlock: block.number,
                totalStaked: 0,
                rewardsPerShare: 0,
                vipAmount: vipAmount,
                stakingFee: stakingFee,
                rewardDebt: rewardDebt
            })
        );

        emit PoolAdded(msg.sender, pids[stakedToken], stakedToken, lpToken, allocPoint);
    }

    // Governance - Set Migrator
    function setMigrator(address _migrator) external onlyGovernor {
        require(_migrator != address(0), "SetMigrator: No migrator change");

        migrator = _migrator;
        emit MigratorUpdated(msg.sender, _migrator);
    }

    // Governance - Set Vault
    function setVault(address _vault) external onlyGovernor {
        require(_vault != address(0), "SetVault: No migrator change");

        vault = _vault;
        emit VaultUpdated(msg.sender, vault);
    }

    // Governance - Set Pool Allocation Points, updates all pools to maintain reward distribution
    function setPoolAllocPoints(uint256[] calldata _pids, uint256[] calldata _allocPoints) external onlyGovernor {
        massUpdatePools();

        for (uint256 i = 0; i < _pids.length; i++) {
            _setPoolAllocPoints(_pids[i], _allocPoints[i]);
        }
    }

    // Governance - Internal, set one pool alloc points
    function _setPoolAllocPoints(uint256 _pid, uint256 _allocPoint) internal {
        PoolInfo storage pool = poolInfo[_pid];
        require(pool.allocPoint != _allocPoint, "SetAllocPoints: No points change");

        // update alloc points
        totalAllocPoint = totalAllocPoint.sub(pool.allocPoint).add(_allocPoint);
        pool.allocPoint = _allocPoint;
        emit PoolAllocPointsUpdated(msg.sender, _pid, _allocPoint);
    }

    // Governance - Set Pool VIP Amount, DFT staking requirement to enter the pool
    function setPoolVipAmount(uint256[] calldata _pids, uint256[] calldata _vipAmounts) external onlyGovernor {
        for (uint256 i = 0; i < _pids.length; i++) {
            _setPoolVipAmount(_pids[i], _vipAmounts[i]);
        }
    }

    // Governance - Internal, Set Pool VIP Amount
    function _setPoolVipAmount(uint256 _pid, uint256 _vipAmount) internal {
        require(poolInfo[_pid].vipAmount != _vipAmount, "SetVipAmount: No amount change");

        poolInfo[_pid].vipAmount = _vipAmount;
        emit PoolVipAmountUpdated(msg.sender, _pid, _vipAmount);
    }

    // Governance - Set Pool Staking Fee, % of basis taken on withdrawal to buyback DFT
    function setPoolStakingFee(uint256[] calldata _pids, uint256[] calldata _stakingFees) external onlyGovernor {
        for (uint256 i = 0; i < _pids.length; i++) {
            _setPoolStakingFee(_pids[i], _stakingFees[i]);
        }
    }

    // Governance - Internal, Set Pool Fee
    function _setPoolStakingFee(uint256 _pid, uint256 _stakingFee) internal {
        require(_stakingFee != poolInfo[_pid].stakingFee, "SetStakingFee: No fee change");
        require(_stakingFee <= 1000, "SetFee: Fee cannot exceed 100%");

        poolInfo[_pid].stakingFee = _stakingFee;
        emit PoolStakingFeeUpdated(msg.sender, _pid, _stakingFee);
    }

    // Governance - Set Point Stipend for the contract
    function setPointStipend(uint256 _pointStipend) external onlyGovernor {
        require(_pointStipend != pointStipend, "SetStipend: No stipend change");

        pointStipend = _pointStipend;
        emit PointStipendUpdated(msg.sender, pointStipend);
    }
}

File 2 of 19 : AnyStake.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

import "./lib/@defiat-crypto/interfaces/IDeFiatPoints.sol";
import "./interfaces/IAnyStake.sol";
import "./interfaces/IAnyStakeMigrator.sol";
import "./interfaces/IAnyStakeVault.sol";
import "./utils/AnyStakeUtils.sol";

contract AnyStake is IAnyStake, AnyStakeUtils {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // EVENTS
    event Initialized(address indexed user, address vault);
    event Claim(address indexed user, uint256 indexed pid, uint256 amount);
    event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
    event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event Migrate(address indexed user, uint256 indexed pid, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
    event PoolAdded(address indexed user, uint256 indexed pid, address indexed stakedToken, address lpToken, uint256 allocPoints);
    event MigratorUpdated(address indexed user, address migrator);
    event VaultUpdated(address indexed user, address vault);
    event PoolAllocPointsUpdated(address indexed user, uint256 indexed pid, uint256 allocPoints);
    event PoolVipAmountUpdated(address indexed user, uint256 indexed pid, uint256 vipAmount);
    event PoolStakingFeeUpdated(address indexed user, uint256 indexed pid, uint256 stakingFee);
    event PointStipendUpdated(address indexed user, uint256 stipend);

    // STRUCTS
    // UserInfo - User metrics, pending reward = (user.amount * pool.DFTPerShare) - user.rewardDebt
    struct UserInfo {
        uint256 amount; // How many tokens the user has provided.
        uint256 rewardDebt; // Token rewards paid out to user
        uint256 lastRewardBlock; // last pool interaction
    }

    // PoolInfo - Pool metrics
    struct PoolInfo {
        address stakedToken; // Address of staked token contract.
        address lpToken; // uniswap LP token corresponding to the trading pair needed for price calculation
        uint256 totalStaked; // total tokens staked
        uint256 allocPoint; // How many allocation points assigned to this pool. DFTs to distribute per block. (ETH = 2.3M blocks per year)
        uint256 rewardsPerShare; // Accumulated DFTs per share, times 1e18. See below.
        uint256 lastRewardBlock; // last pool update
        uint256 vipAmount; // amount of DFT tokens that must be staked to access the pool
        uint256 stakingFee; // the % withdrawal fee charged. base 1000, 50 = 5%
    }

    address public migrator; // contract where we may migrate too
    address public vault; // where rewards are stored for distribution
    bool public initialized;

    PoolInfo[] public poolInfo; // array of AnyStake pools
    mapping(uint256 => mapping(address => UserInfo)) public userInfo; // mapping of (pid => (userAddress => userInfo))
    mapping(address => uint256) public pids; // quick mapping for pool ids (staked_token => pid)

    uint256 public lastRewardBlock; // last block the pool was updated
    uint256 public pendingRewards; // pending DFT rewards awaiting anyone to be distro'd to pools
    uint256 public pointStipend; // amount of DFTP awarded per deposit
    uint256 public totalAllocPoint; // Total allocation points. Must be the sum of all allocation points in all pools.
    uint256 public totalBlockDelta; // Total blocks since last update
    uint256 public totalEligiblePools; // Amount of pools eligible for rewards

    modifier NoReentrant(uint256 pid, address user) {
        require(
            block.number > userInfo[pid][user].lastRewardBlock,
            "AnyStake: Must wait 1 block"
        );
        _;
    }

    modifier onlyVault() {
        require(msg.sender == vault, "AnyStake: Only Vault allowed");
        _;
    }

    modifier activated() {
        require(initialized, "AnyStake: Not initialized yet");
        _;
    }

    constructor(address _router, address _gov, address _points, address _token) 
        public 
        AnyStakeUtils(_router, _gov, _points, _token)
    {
        pointStipend = 1e18;
    }
    
    // Initialize pools/rewards after the Vault has been setup
    function initialize(address _vault) public onlyGovernor {
        require(_vault != address(0), "Initalize: Must pass in Vault");
        require(!initialized, "Initialize: AnyStake already initialized");

        vault = _vault;
        initialized = true;
        emit Initialized(msg.sender, _vault);
    }

    // Pool - Get any incoming rewards, called during Vault.distributeRewards()
    function addReward(uint256 amount) external override onlyVault {
        if (amount == 0) {
            return;
        }

        pendingRewards = pendingRewards.add(amount);
    }

    // Pool - Updates the reward variables of the given pool
    function updatePool(uint256 pid) external {
        _updatePool(pid);
    }

    // Pool - Update internal
    function _updatePool(uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];
        if (pool.totalStaked == 0 || pool.lastRewardBlock >= block.number || pool.allocPoint == 0) {
            return;
        }

        // calculate total reward blocks since last update call
        if (lastRewardBlock < block.number) {
            totalBlockDelta = totalBlockDelta.add(block.number.sub(lastRewardBlock).mul(totalEligiblePools));
            lastRewardBlock = block.number;
        }

        // calculate rewards, returns if already done this block
        IAnyStakeVault(vault).calculateRewards();        

        // Calculate pool's share of pending rewards, using blocks since last reward and alloc points
        uint256 poolBlockDelta = block.number.sub(pool.lastRewardBlock);
        uint256 poolRewards = pendingRewards
            .mul(poolBlockDelta)
            .div(totalBlockDelta)
            .mul(pool.allocPoint)
            .div(totalAllocPoint);
        
        // update reward variables
        totalBlockDelta = poolBlockDelta > totalBlockDelta ? 0 : totalBlockDelta.sub(poolBlockDelta);
        pendingRewards = poolRewards > pendingRewards ? 0 : pendingRewards.sub(poolRewards);
        
        // update pool variables
        pool.rewardsPerShare = pool.rewardsPerShare.add(poolRewards.mul(1e18).div(pool.totalStaked));
        pool.lastRewardBlock = block.number;
    }

    // Pool - Claim rewards
    function claim(uint256 pid) external override NoReentrant(pid, msg.sender) {
        _updatePool(pid);
        _claim(pid, msg.sender);
    }

    // Pool - Claim internal, called during deposit() and withdraw()
    function _claim(uint256 _pid, address _user) internal {
        UserInfo storage user = userInfo[_pid][_user];

        uint256 rewards = pending(_pid, _user);
        if (rewards == 0) {
            return;
        }

        // update pool / user metrics
        user.rewardDebt = user.amount.mul(poolInfo[_pid].rewardsPerShare).div(1e18);
        user.lastRewardBlock = block.number;

        // transfer DFT rewards
        IAnyStakeVault(vault).distributeRewards(_user, rewards);
        emit Claim(_user, _pid, rewards);
    }

    // Pool - Deposit Tokens
    function deposit(uint256 pid, uint256 amount) external override NoReentrant(pid, msg.sender) {
        _deposit(msg.sender, pid, amount);
    }

    // Pool - Deposit internal
    function _deposit(address _user, uint256 _pid, uint256 _amount) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        
        require(_amount > 0, "Deposit: Cannot deposit zero tokens");
        require(pool.allocPoint > 0, "Deposit: Pool is not active");
        require(pool.vipAmount <= userInfo[0][_user].amount, "Deposit: VIP Only");

        // add pool to reward calculation if previously no tokens staked
        if (pool.totalStaked == 0) {
            totalEligiblePools = totalEligiblePools.add(1);
            pool.lastRewardBlock = block.number; // reset reward block

            // begin computing rewards from this block if the first
            if (lastRewardBlock == 0) {
                lastRewardBlock = block.number;
            }
        }

        // Update and claim rewards
        _updatePool(_pid);
        _claim(_pid, _user);

        // Get tokens from user, balance check to support Fee-On-Transfer tokens
        uint256 amount = IERC20(pool.stakedToken).balanceOf(address(this));
        IERC20(pool.stakedToken).safeTransferFrom(_user, address(this), _amount);
        amount = IERC20(pool.stakedToken).balanceOf(address(this)).sub(amount);

        // Finalize, update user metrics
        pool.totalStaked = pool.totalStaked.add(amount);
        user.amount = user.amount.add(amount);
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);
        
        // reward user
        IDeFiatPoints(DeFiatPoints).addPoints(_user, IDeFiatPoints(DeFiatPoints).viewTxThreshold(), pointStipend);

        // Transfer the total amounts from user and update pool user.amount into the AnyStake contract
        emit Deposit(_user, _pid, amount);
    }

    // Pool - Withdraw staked tokens
    function withdraw(uint256 pid, uint256 amount) external override NoReentrant(pid, msg.sender) {
        _withdraw(msg.sender, pid, amount);
    }
    
    // Pool - Withdraw Internal
    function _withdraw(
        address _user,
        uint256 _pid,
        uint256 _amount
    ) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];

        require(_amount > 0, "Withdraw: amount must be greater than zero");
        require(user.amount >= _amount, "Withdraw: user amount insufficient");
        require(pool.vipAmount <= userInfo[0][_user].amount, "Withdraw: VIP Only");
        
        // claim rewards
        _updatePool(_pid);
        _claim(_pid, _user);

        // update pool / user metrics
        pool.totalStaked = pool.totalStaked.sub(_amount);
        user.amount = user.amount.sub(_amount);
        user.rewardDebt = user.amount.mul(pool.rewardsPerShare).div(1e18);

        // reduce eligible pools only if done by user actions
        if (pool.totalStaked == 0 && pool.allocPoint > 0) {
            totalEligiblePools = totalEligiblePools.sub(1);
        }

        // PID = 0 : DFT-LP
        // PID = 1 : DFTP-LP
        // PID = 2 : weth (price = 1e18)
        // PID > 2 : all other tokens
        // No fee on DFT-ETH, DFTP-ETH pools
        uint256 stakingFeeAmount = _amount.mul(pool.stakingFee).div(1000);
        uint256 remainingUserAmount = _amount.sub(stakingFeeAmount);

        if(stakingFeeAmount > 0){
            // Send Fee to Vault and buy DFT, balance check to support Fee-On-Transfer tokens
            uint256 balance = IERC20(pool.stakedToken).balanceOf(vault);
            safeTokenTransfer(vault, pool.stakedToken, stakingFeeAmount);
            balance = IERC20(pool.stakedToken).balanceOf(vault);
            IAnyStakeVault(vault).buyDeFiatWithTokens(pool.stakedToken, balance);
        }

        // withdraw user tokens
        safeTokenTransfer(_user, pool.stakedToken, remainingUserAmount);        
        emit Withdraw(_user, _pid, remainingUserAmount);
    }

    // Pool - migrate stake to a new contract, should only be called after 
    function migrate(uint256 pid) external NoReentrant(pid, msg.sender) {
        _migrate(msg.sender, pid);
    }

    // Pool - migrate internal
    function _migrate(address _user, uint256 _pid) internal {
        PoolInfo storage pool = poolInfo[_pid];
        UserInfo storage user = userInfo[_pid][_user];
        uint256 balance = user.amount;

        require(migrator != address(0), "Migrate: No migrator set");
        require(balance > 0, "Migrate: No tokens to migrate");
        require(pool.allocPoint == 0, "Migrate: Pool is still active");

        _claim(_pid, _user);

        IERC20(pool.stakedToken).safeApprove(migrator, balance);
        IAnyStakeMigrator(migrator).migrateTo(_user, pool.stakedToken, balance);
        emit Migrate(_user, _pid, balance);
    }

    // Pool - withdraw all stake and forfeit rewards, skips pool update
    function emergencyWithdraw(uint256 pid) external NoReentrant(pid, msg.sender) {
        PoolInfo storage pool = poolInfo[pid];
        UserInfo storage user = userInfo[pid][msg.sender];

        require(user.amount > 0, "EmergencyWithdraw: user amount insufficient");

        uint256 stakingFeeAmount = user.amount.mul(pool.stakingFee).div(1000);
        uint256 remainingUserAmount = user.amount.sub(stakingFeeAmount);
        pool.totalStaked = pool.totalStaked.sub(user.amount);
        user.amount = 0;
        user.rewardDebt = 0;
        user.lastRewardBlock = block.number;

        if (pool.totalStaked == 0) {
            totalEligiblePools = totalEligiblePools.sub(1);
        }

        safeTokenTransfer(vault, pool.stakedToken, stakingFeeAmount);
        safeTokenTransfer(msg.sender, pool.stakedToken, remainingUserAmount);
        emit EmergencyWithdraw(msg.sender, pid, remainingUserAmount);
    }

    // View - gets stakedToken price from the Vault
    function getPrice(uint256 pid) external view returns (uint256) {
        address token = poolInfo[pid].stakedToken;
        address lpToken = poolInfo[pid].lpToken;

        return IAnyStakeVault(vault).getTokenPrice(token, lpToken);
    }

    // View - Pending DFT Rewards for user in pool
    function pending(uint256 _pid, address _user)
        public
        view
        returns (uint256)
    {
        PoolInfo memory pool = poolInfo[_pid];
        UserInfo memory user = userInfo[_pid][_user];

        // not sure if this will work with tokens non-1e18 decimals
        return user.amount.mul(pool.rewardsPerShare).div(1e18).sub(user.rewardDebt);
    }

    // View - View Pool Length
    function poolLength() external view returns (uint256) {
        return poolInfo.length; // number of pools (pids)
    }

    // Governance - Add Multiple Token Pools
    function addPoolBatch(
        address[] calldata tokens,
        address[] calldata lpTokens,
        uint256[] calldata allocPoints,
        uint256[] calldata vipAmounts,
        uint256[] calldata stakingFees
    ) external onlyGovernor {
        for (uint i = 0; i < tokens.length; i++) {
            _addPool(tokens[i], lpTokens[i], allocPoints[i], vipAmounts[i], stakingFees[i]);
        }
    }

    // Governance - Add Single Token Pool
    function addPool(
        address token,
        address lpToken, 
        uint256 allocPoint,
        uint256 vipAmount,
        uint256 stakingFee
    ) external onlyGovernor {
        _addPool(token, lpToken, allocPoint, vipAmount, stakingFee);
    }

    // Governance - Add Token Pool Internal
    function _addPool(
        address stakedToken,
        address lpToken,
        uint256 allocPoint,
        uint256 vipAmount,
        uint256 stakingFee
    ) internal {
        require(pids[stakedToken] == 0, "AddPool: Token pool already added");

        pids[stakedToken] = poolInfo.length;
        _blacklistedAdminWithdraw[stakedToken] = true; // stakedToken now non-withrawable by admins
        totalAllocPoint = totalAllocPoint.add(allocPoint);

        // Add new pool
        poolInfo.push(
            PoolInfo({
                stakedToken: stakedToken,
                lpToken: lpToken,
                allocPoint: allocPoint,
                lastRewardBlock: block.number,
                totalStaked: 0,
                rewardsPerShare: 0,
                vipAmount: vipAmount,
                stakingFee: stakingFee
            })
        );

        emit PoolAdded(msg.sender, pids[stakedToken], stakedToken, lpToken, allocPoint);
    }

    // Governance - Set Migrator
    function setMigrator(address _migrator) external onlyGovernor {
        require(_migrator != address(0), "SetMigrator: No migrator change");

        migrator = _migrator;
        emit MigratorUpdated(msg.sender, _migrator);
    }

    // Governance - Set Vault
    function setVault(address _vault) external onlyGovernor {
        require(_vault != address(0), "SetVault: No migrator change");

        vault = _vault;
        emit VaultUpdated(msg.sender, vault);
    }

    // Governance - Set Pool Allocation Points
    function setPoolAllocPoints(uint256 _pid, uint256 _allocPoint) external onlyGovernor {
        require(poolInfo[_pid].allocPoint != _allocPoint, "SetAllocPoints: No points change");

        if (_allocPoint == 0) {
            totalEligiblePools = totalEligiblePools.sub(1);
        }

        totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);
        poolInfo[_pid].allocPoint = _allocPoint;
        emit PoolAllocPointsUpdated(msg.sender, _pid, _allocPoint);
    }

    // Governance - Set Pool Charge Fee
    function setPoolVipAmount(uint256 _pid, uint256 _vipAmount) external onlyGovernor {
        require(poolInfo[_pid].vipAmount != _vipAmount, "SetVipAmount: No amount change");

        poolInfo[_pid].vipAmount = _vipAmount;
        emit PoolVipAmountUpdated(msg.sender, _pid, _vipAmount);
    }

    // Governance - Set Pool Charge Fee
    function setPoolChargeFee(uint256 _pid, uint256 _stakingFee) external onlyGovernor {
        require(poolInfo[_pid].stakingFee != _stakingFee, "SetStakingFee: No fee change");

        poolInfo[_pid].stakingFee = _stakingFee;
        emit PoolStakingFeeUpdated(msg.sender, _pid, _stakingFee);
    }

    // Governance - Set Pool Allocation Points
    function setPointStipend(uint256 _pointStipend) external onlyGovernor {
        require(_pointStipend != pointStipend, "SetStipend: No stipend change");

        pointStipend = _pointStipend;
        emit PointStipendUpdated(msg.sender, pointStipend);
    }
}

File 3 of 19 : IAnyStake.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

interface IAnyStake {
    function addReward(uint256 amount) external;
    function claim(uint256 pid) external;
    function deposit(uint256 pid, uint256 amount) external;
    function withdraw(uint256 pid, uint256 amount) external;
}

File 4 of 19 : IAnyStakeMigrator.sol
// SPDX-License-Identifier: MIT


pragma solidity 0.6.6;

interface IAnyStakeMigrator {
    function migrateTo(address user, address token, uint256 amount) external;
}

File 5 of 19 : IAnyStakeVault.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

interface IAnyStakeVault {
    function buyDeFiatWithTokens(address token, uint256 amount) external;
    function buyPointsWithTokens(address token, uint256 amount) external;

    function calculateRewards() external;
    function distributeRewards(address recipient, uint256 amount) external;
    function getTokenPrice(address token, address lpToken) external view returns (uint256);
}

File 6 of 19 : IDeFiatGov.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

interface IDeFiatGov {
    function mastermind() external view returns (address);
    function viewActorLevelOf(address _address) external view returns (uint256);
    function viewFeeDestination() external view returns (address);
    function viewTxThreshold() external view returns (uint256);
    function viewBurnRate() external view returns (uint256);
    function viewFeeRate() external view returns (uint256);
}

File 7 of 19 : IDeFiatPoints.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

interface IDeFiatPoints {
    function viewDiscountOf(address _address) external view returns (uint256);
    function viewEligibilityOf(address _address) external view returns (uint256 tranche);
    function discountPointsNeeded(uint256 _tranche) external view returns (uint256 pointsNeeded);
    function viewTxThreshold() external view returns (uint256);
    function viewRedirection(address _address) external view returns (bool);

    function overrideLoyaltyPoints(address _address, uint256 _points) external;
    function addPoints(address _address, uint256 _txSize, uint256 _points) external;
    function burn(uint256 _amount) external;
}

File 8 of 19 : DeFiatGovernedUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

import "./DeFiatUtils.sol";
import "../interfaces/IDeFiatGov.sol";

abstract contract DeFiatGovernedUtils is DeFiatUtils {
    event GovernanceUpdated(address indexed user, address governance);

    address public governance;

    modifier onlyMastermind {
        require(
            msg.sender == IDeFiatGov(governance).mastermind() || msg.sender == owner(),
            "Gov: Only Mastermind"
        );
        _;
    }

    modifier onlyGovernor {
        require(
            IDeFiatGov(governance).viewActorLevelOf(msg.sender) >= 2 || msg.sender == owner(),
            "Gov: Only Governors"
        );
        _;
    }

    modifier onlyPartner {
        require(
            IDeFiatGov(governance).viewActorLevelOf(msg.sender) >= 1 || msg.sender == owner(),
            "Gov: Only Partners"
        );
        _;
    }

    function _setGovernance(address _governance) internal {
        require(_governance != governance, "SetGovernance: No governance change");

        governance = _governance;
        emit GovernanceUpdated(msg.sender, governance);
    }

    function setGovernance(address _governance) external onlyGovernor {
        _setGovernance(_governance);
    }
}

File 9 of 19 : DeFiatUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

import "../../@openzeppelin/token/ERC20/IERC20.sol";
import "../../@openzeppelin/access/Ownable.sol";

abstract contract DeFiatUtils is Ownable {
    event TokenSweep(address indexed user, address indexed token, uint256 amount);

    // Sweep any tokens/ETH accidentally sent or airdropped to the contract
    function sweep(address token) public virtual onlyOwner {
        uint256 amount = IERC20(token).balanceOf(address(this));
        require(amount > 0, "Sweep: No token balance");

        IERC20(token).transfer(msg.sender, amount); // use of the ERC20 traditional transfer

        if (address(this).balance > 0) {
            payable(msg.sender).transfer(address(this).balance);
        }

        emit TokenSweep(msg.sender, token, amount);
    }

    // Self-Destruct contract to free space on-chain, sweep any ETH to owner
    function kill() external onlyOwner {
        selfdestruct(payable(msg.sender));
    }
}

File 10 of 19 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../utils/Context.sol";

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 11 of 19 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // 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;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 12 of 19 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

interface IERC20 {
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);

    // Standard
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

File 13 of 19 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 14 of 19 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 15 of 19 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 16 of 19 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 17 of 19 : IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 18 of 19 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 19 of 19 : AnyStakeUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.6;

import "../lib/@defiat-crypto/utils/DeFiatUtils.sol";
import "../lib/@defiat-crypto/utils/DeFiatGovernedUtils.sol";
import "../lib/@openzeppelin/token/ERC20/SafeERC20.sol";
import "../lib/@uniswap/interfaces/IUniswapV2Factory.sol";
import "../lib/@uniswap/interfaces/IUniswapV2Router02.sol";

abstract contract AnyStakeUtils is DeFiatGovernedUtils {
    using SafeERC20 for IERC20;

    event PointsUpdated(address indexed user, address points);
    event TokenUpdated(address indexed user, address token);
    event UniswapUpdated(address indexed user, address router, address weth, address factory);
  
    address public router;
    address public factory;
    address public weth;
    address public DeFiatToken;
    address public DeFiatPoints;
    address public DeFiatTokenLp;
    address public DeFiatPointsLp;

    mapping (address => bool) internal _blacklistedAdminWithdraw;

    constructor(address _router, address _gov, address _points, address _token) public {
        _setGovernance(_gov);

        router = _router;
        DeFiatPoints = _points;
        DeFiatToken = _token;
         
        weth = IUniswapV2Router02(router).WETH();
        factory = IUniswapV2Router02(router).factory();
        DeFiatTokenLp = IUniswapV2Factory(factory).getPair(_token, weth);
        DeFiatPointsLp = IUniswapV2Factory(factory).getPair(_points, weth);
    }

    function sweep(address _token) public override onlyOwner {
        require(!_blacklistedAdminWithdraw[_token], "Sweep: Cannot withdraw blacklisted token");

        DeFiatUtils.sweep(_token);
    }

    function isBlacklistedAdminWithdraw(address _token)
        external
        view
        returns (bool)
    {
        return _blacklistedAdminWithdraw[_token];
    }

    // Method to avoid underflow on token transfers
    function safeTokenTransfer(address user, address token, uint256 amount) internal {
        if (amount == 0) {
            return;
        }

        uint256 tokenBalance = IERC20(token).balanceOf(address(this));
        if (amount > tokenBalance) {
            IERC20(token).safeTransfer(user, tokenBalance);
        } else {
            IERC20(token).safeTransfer(user, amount);
        }
    }

    function setToken(address _token) external onlyGovernor {
        require(_token != DeFiatToken, "SetToken: No token change");
        require(_token != address(0), "SetToken: Must set token value");

        DeFiatToken = _token;
        DeFiatTokenLp = IUniswapV2Factory(factory).getPair(_token, weth);
        emit TokenUpdated(msg.sender, DeFiatToken);
    }

    function setPoints(address _points) external onlyGovernor {
        require(_points != DeFiatPoints, "SetPoints: No points change");
        require(_points != address(0), "SetPoints: Must set points value");

        DeFiatPoints = _points;
        DeFiatPointsLp = IUniswapV2Factory(factory).getPair(_points, weth);
        emit PointsUpdated(msg.sender, DeFiatPoints);
    }

    function setUniswap(address _router) external onlyGovernor {
        require(_router != router, "SetUniswap: No uniswap change");
        require(_router != address(0), "SetUniswap: Must set uniswap value");

        router = _router;
        weth = IUniswapV2Router02(router).WETH();
        factory = IUniswapV2Router02(router).factory();
        emit UniswapUpdated(msg.sender, router, weth, factory);
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 150
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_anystake","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_points","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"GovernanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"migrator","type":"address"}],"name":"MigratorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"stipend","type":"uint256"}],"name":"PointStipendUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"points","type":"address"}],"name":"PointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"stakedToken","type":"address"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoints","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoints","type":"uint256"}],"name":"PoolAllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingFee","type":"uint256"}],"name":"PoolStakingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vipAmount","type":"uint256"}],"name":"PoolVipAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenSweep","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address","name":"weth","type":"address"},{"indexed":false,"internalType":"address","name":"factory","type":"address"}],"name":"UniswapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"vault","type":"address"}],"name":"VaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DeFiatPoints","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DeFiatPointsLp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DeFiatToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DeFiatTokenLp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"vipAmount","type":"uint256"},{"internalType":"uint256","name":"stakingFee","type":"uint256"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address[]","name":"lpTokens","type":"address[]"},{"internalType":"uint256[]","name":"allocPoints","type":"uint256[]"},{"internalType":"uint256[]","name":"vipAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"stakingFees","type":"uint256[]"}],"name":"addPoolBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"anystake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"isBlacklistedAdminWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"migrateTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"pendingPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pointStipend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"address","name":"stakedToken","type":"address"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"rewardsPerShare","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"vipAmount","type":"uint256"},{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsPerAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_migrator","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pointStipend","type":"uint256"}],"name":"setPointStipend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_points","type":"address"}],"name":"setPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"}],"name":"setPoolAllocPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_stakingFees","type":"uint256[]"}],"name":"setPoolStakingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"uint256[]","name":"_vipAmounts","type":"uint256[]"}],"name":"setPoolVipAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setUniswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620051b2380380620051b2833981810160405260a08110156200003757600080fd5b508051602082015160408301516060840151608090940151929391929091908383838360006200006f6001600160e01b036200037f16565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000cd836001600160e01b036200038316565b600280546001600160a01b038087166001600160a01b031992831617928390556006805486831690841617905560058054858316931692909217909155604080516315ab88c960e31b81529051929091169163ad5c464891600480820192602092909190829003018186803b1580156200014657600080fd5b505afa1580156200015b573d6000803e3d6000fd5b505050506040513d60208110156200017257600080fd5b5051600480546001600160a01b0319166001600160a01b039283161781556002546040805163c45a015560e01b81529051919093169263c45a01559281810192602092909190829003018186803b158015620001cd57600080fd5b505afa158015620001e2573d6000803e3d6000fd5b505050506040513d6020811015620001f957600080fd5b5051600380546001600160a01b0319166001600160a01b039283161790819055600480546040805163e6a4390560e01b815286861693810193909352908416602483015251919092169163e6a43905916044808301926020929190829003018186803b1580156200026957600080fd5b505afa1580156200027e573d6000803e3d6000fd5b505050506040513d60208110156200029557600080fd5b5051600780546001600160a01b0319166001600160a01b03928316179055600354600480546040805163e6a4390560e01b815287861693810193909352908416602483015251919092169163e6a43905916044808301926020929190829003018186803b1580156200030657600080fd5b505afa1580156200031b573d6000803e3d6000fd5b505050506040513d60208110156200033257600080fd5b5051600880546001600160a01b039283166001600160a01b031991821617909155600a80549b9092169a16999099179098555050670de0b6b3a76400006010555062000430945050505050565b3390565b6001546001600160a01b0382811691161415620003d25760405162461bcd60e51b81526004018080602001828103825260238152602001806200518f6023913960400191505060405180910390fd5b600180546001600160a01b038084166001600160a01b03199092169190911791829055604080519290911682525133917f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d919081900360200190a250565b614d4f80620004406000396000f3fe608060405234801561001057600080fd5b50600436106102ab5760003560e01c80637cd07e4711610172578063d1058e59116100d9578063e4c75c2711610092578063e4c75c2714610a3f578063e757223014610a6b578063f2fde38b14610a88578063f575832114610aae578063f887ea4014610b6c578063fbfa77cf14610b74578063fdcc7b0814610b7c576102ab565b8063d1058e591461090b578063d1af0f9c14610913578063d3917cd5146109d1578063d6c24539146109d9578063df01df6f146109f6578063e2bbb15814610a1c576102ab565b806393f1a40b1161012b57806393f1a40b146108485780639f25cde714610892578063ab033ea9146108b8578063ad460d57146108de578063c45a0155146108fb578063cc498bc214610903576102ab565b80637cd07e471461070a5780638da5cb5b146107125780638efecdda1461071a5780638f2e93cc1461074057806390af639614610782578063917f973714610840576102ab565b806341c0e1b5116102165780635aa6e675116101cf5780635aa6e67514610501578063630b5ba1146105095780636817031b14610511578063715018a61461053757806374de4ec41461053f578063758572501461055c576102ab565b806341c0e1b514610477578063441a3e701461047f578063454b0608146104a2578063463d7ac3146104bf57806351eb05a6146104c75780635312ea8e146104e4576102ab565b806323cf31181161026857806323cf3118146103ca57806324ffad88146103f057806337710aca14610426578063379607f51461044a5780633bde19e1146104675780633fc8cef31461046f576102ab565b806301681a62146102b0578063081e3eda146102d8578063144fa6d7146102f25780631526fe271461031857806317caf6f11461038857806321603e8b14610390575b600080fd5b6102d6600480360360208110156102c657600080fd5b50356001600160a01b0316610b84565b005b6102e0610c40565b60408051918252519081900360200190f35b6102d66004803603602081101561030857600080fd5b50356001600160a01b0316610c46565b6103356004803603602081101561032e57600080fd5b5035610ed5565b604080516001600160a01b039a8b168152989099166020890152878901969096526060870194909452608086019290925260a085015260c084015260e08301526101008201529051908190036101200190f35b6102e0610f3a565b6103b6600480360360208110156103a657600080fd5b50356001600160a01b0316610f40565b604080519115158252519081900360200190f35b6102d6600480360360208110156103e057600080fd5b50356001600160a01b0316610f5e565b6102d66004803603606081101561040657600080fd5b506001600160a01b038135811691602081013590911690604001356110eb565b61042e611483565b604080516001600160a01b039092168252519081900360200190f35b6102d66004803603602081101561046057600080fd5b5035611492565b6102e0611574565b61042e61157a565b6102d6611589565b6102d66004803603604081101561049557600080fd5b50803590602001356115e4565b6102d6600480360360208110156104b857600080fd5b5035611657565b61042e6116c8565b6102d6600480360360208110156104dd57600080fd5b50356116d7565b6102d6600480360360208110156104fa57600080fd5b50356116e0565b61042e611896565b6102d66118a5565b6102d66004803603602081101561052757600080fd5b50356001600160a01b03166118c8565b6102d6611a5c565b6102d66004803603602081101561055557600080fd5b5035611afe565b6102d6600480360360a081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b919390929091602081019035600160201b8111156105dc57600080fd5b8201836020820111156105ee57600080fd5b803590602001918460208302840111600160201b8311171561060f57600080fd5b919390929091602081019035600160201b81111561062c57600080fd5b82018360208201111561063e57600080fd5b803590602001918460208302840111600160201b8311171561065f57600080fd5b919390929091602081019035600160201b81111561067c57600080fd5b82018360208201111561068e57600080fd5b803590602001918460208302840111600160201b831117156106af57600080fd5b919390929091602081019035600160201b8111156106cc57600080fd5b8201836020820111156106de57600080fd5b803590602001918460208302840111600160201b831117156106ff57600080fd5b509092509050611b9f565b61042e611d1b565b61042e611d2a565b6102d66004803603602081101561073057600080fd5b50356001600160a01b0316611d39565b6102d6600480360360a081101561075657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612038565b6102d66004803603604081101561079857600080fd5b810190602081018135600160201b8111156107b257600080fd5b8201836020820111156107c457600080fd5b803590602001918460208302840111600160201b831117156107e557600080fd5b919390929091602081019035600160201b81111561080257600080fd5b82018360208201111561081457600080fd5b803590602001918460208302840111600160201b8311171561083557600080fd5b50909250905061212f565b61042e61224b565b6108746004803603604081101561085e57600080fd5b50803590602001356001600160a01b031661225a565b60408051938452602084019290925282820152519081900360600190f35b6102d6600480360360208110156108a857600080fd5b50356001600160a01b0316612286565b6102d6600480360360208110156108ce57600080fd5b50356001600160a01b0316612515565b6102e0600480360360208110156108f457600080fd5b50356125f9565b61042e612659565b6102e0612668565b6102d661266e565b6102d66004803603604081101561092957600080fd5b810190602081018135600160201b81111561094357600080fd5b82018360208201111561095557600080fd5b803590602001918460208302840111600160201b8311171561097657600080fd5b919390929091602081019035600160201b81111561099357600080fd5b8201836020820111156109a557600080fd5b803590602001918460208302840111600160201b831117156109c657600080fd5b50909250905061281e565b61042e612942565b6102d6600480360360208110156109ef57600080fd5b5035612951565b6102e060048036036020811015610a0c57600080fd5b50356001600160a01b0316612ac0565b6102d660048036036040811015610a3257600080fd5b5080359060200135612ad2565b6102e060048036036040811015610a5557600080fd5b50803590602001356001600160a01b0316612b3f565b6102e060048036036020811015610a8157600080fd5b5035612bb5565b6102d660048036036020811015610a9e57600080fd5b50356001600160a01b0316612c8f565b6102d660048036036040811015610ac457600080fd5b810190602081018135600160201b811115610ade57600080fd5b820183602082011115610af057600080fd5b803590602001918460208302840111600160201b83111715610b1157600080fd5b919390929091602081019035600160201b811115610b2e57600080fd5b820183602082011115610b4057600080fd5b803590602001918460208302840111600160201b83111715610b6157600080fd5b509092509050612d87565b61042e612ea3565b61042e612eb2565b61042e612ec1565b610b8c612ed0565b6000546001600160a01b03908116911614610bdc576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff1615610c345760405162461bcd60e51b8152600401808060200182810382526028815260200180614c506028913960400191505060405180910390fd5b610c3d81612ed4565b50565b600d5490565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015610c9157600080fd5b505afa158015610ca5573d6000803e3d6000fd5b505050506040513d6020811015610cbb57600080fd5b5051101580610ce25750610ccd611d2a565b6001600160a01b0316336001600160a01b0316145b610d21576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6005546001600160a01b0382811691161415610d84576040805162461bcd60e51b815260206004820152601960248201527f536574546f6b656e3a204e6f20746f6b656e206368616e676500000000000000604482015290519081900360640190fd5b6001600160a01b038116610ddf576040805162461bcd60e51b815260206004820152601e60248201527f536574546f6b656e3a204d7573742073657420746f6b656e2076616c75650000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b03838116918217909255600354600480546040805163e6a4390560e01b81529283019490945284166024820152915192169163e6a4390591604480820192602092909190829003018186803b158015610e4c57600080fd5b505afa158015610e60573d6000803e3d6000fd5b505050506040513d6020811015610e7657600080fd5b5051600780546001600160a01b039283166001600160a01b031990911617905560055460408051919092168152905133917f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117919081900360200190a250565b600d8181548110610ee257fe5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b0397881699509690951696939592949193909289565b60125481565b6001600160a01b031660009081526009602052604090205460ff1690565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015610fa957600080fd5b505afa158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b5051101580610ffa5750610fe5611d2a565b6001600160a01b0316336001600160a01b0316145b611039576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6001600160a01b038116611094576040805162461bcd60e51b815260206004820152601f60248201527f5365744d69677261746f723a204e6f206d69677261746f72206368616e676500604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b03199091168117909155604080519182525133917f17356f011fa307735bd27bcbcd4ee385789d5155c6e44c093a1936e387f62ae5919081900360200190a250565b600a546001600160a01b031633146111345760405162461bcd60e51b8152600401808060200182810382526028815260200180614a9d6028913960400191505060405180910390fd5b6001600160a01b0382166000908152600f6020526040812054600d80549192918390811061115e57fe5b60009182526020808320858452600e825260408085206001600160a01b038b16865290925292206009909102909101915061119983876130e3565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d602081101561120d57600080fd5b5051600a54604080516323b872dd60e01b81526001600160a01b039283166004820152306024820152604481018990529051929350908816916323b872dd916064808201926020929091908290030181600087803b15801561126e57600080fd5b505af1158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b1580156112e457600080fd5b505afa1580156112f8573d6000803e3d6000fd5b505050506040513d602081101561130e57600080fd5b505190506000611324828463ffffffff6131ae16565b600286015490915061133c908263ffffffff6131f016565b60028601558354611353908263ffffffff6131f016565b808555600486015461138591670de0b6b3a764000091611379919063ffffffff61324a16565b9063ffffffff6132a316565b600185015543600285015560065460408051630f72908960e01b815290516001600160a01b03909216916323d14d60918c918491630f729089916004808301926020929190829003018186803b1580156113de57600080fd5b505afa1580156113f2573d6000803e3d6000fd5b505050506040513d602081101561140857600080fd5b5051601054604080516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015251606480830192600092919082900301818387803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b50505050505050505050505050565b6005546001600160a01b031681565b6000818152600e602090815260408083203380855292529091206002015482919043116114f4576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6000600d848154811061150357fe5b60009182526020808320878452600e82526040808520338652909252922060099091029091019150611534856132e5565b61153e85336130e3565b6004820154815461156291670de0b6b3a7640000916113799163ffffffff61324a16565b60018201554360029091015550505050565b60105481565b6004546001600160a01b031681565b611591612ed0565b6000546001600160a01b039081169116146115e1576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b33ff5b6000828152600e60209081526040808320338085529252909120600201548391904311611646576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b61165133858561340f565b50505050565b6000818152600e602090815260408083203380855292529091206002015482919043116116b9576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6116c33384613803565b505050565b6008546001600160a01b031681565b610c3d816132e5565b6000818152600e60209081526040808320338085529252909120600201548291904311611742576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6000600d848154811061175157fe5b60009182526020808320878452600e8252604080852033865290925292208054600990920290920192506117b65760405162461bcd60e51b815260040180806020018281038252602b815260200180614b7a602b913960400191505060405180910390fd5b60006117d96103e86113798560070154856000015461324a90919063ffffffff16565b82549091506000906117f1908363ffffffff6131ae16565b8354600286015491925061180b919063ffffffff6131ae16565b600280860191909155600080855560018501554390840155600c54845461183f916001600160a01b03908116911684613a5b565b83546118569033906001600160a01b031683613a5b565b604080518281529051889133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050505050565b6001546001600160a01b031681565b600d5460005b818110156118c4576118bc816132e5565b6001016118ab565b5050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561191357600080fd5b505afa158015611927573d6000803e3d6000fd5b505050506040513d602081101561193d57600080fd5b5051101580611964575061194f611d2a565b6001600160a01b0316336001600160a01b0316145b6119a3576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6001600160a01b0381166119fe576040805162461bcd60e51b815260206004820152601c60248201527f5365745661756c743a204e6f206d69677261746f72206368616e676500000000604482015290519081900360640190fd5b600c80546001600160a01b038084166001600160a01b03199092169190911791829055604080519290911682525133917f483bdedaaf23706a9800ac1af0d852b34927780d79f9d6ba60a80c7cad75ea39919081900360200190a250565b611a64612ed0565b6000546001600160a01b03908116911614611ab4576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c546001600160a01b03163314611b5d576040805162461bcd60e51b815260206004820152601c60248201527f416e795374616b653a204f6e6c79205661756c7420616c6c6f77656400000000604482015290519081900360640190fd5b80611b6757610c3d565b601254611b9990611b8a9061137984670de0b6b3a764000063ffffffff61324a16565b6011549063ffffffff6131f016565b60115550565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015611bea57600080fd5b505afa158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b5051101580611c3b5750611c26611d2a565b6001600160a01b0316336001600160a01b0316145b611c7a576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b611c826118a5565b60005b89811015611d0e57611d068b8b83818110611c9c57fe5b905060200201356001600160a01b03168a8a84818110611cb857fe5b905060200201356001600160a01b0316898985818110611cd457fe5b90506020020135888886818110611ce757fe5b90506020020135878787818110611cfa57fe5b90506020020135613b1e565b600101611c85565b5050505050505050505050565b600b546001600160a01b031681565b6000546001600160a01b031690565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015611d8457600080fd5b505afa158015611d98573d6000803e3d6000fd5b505050506040513d6020811015611dae57600080fd5b5051101580611dd55750611dc0611d2a565b6001600160a01b0316336001600160a01b0316145b611e14576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6002546001600160a01b0382811691161415611e77576040805162461bcd60e51b815260206004820152601d60248201527f536574556e69737761703a204e6f20756e6973776170206368616e6765000000604482015290519081900360640190fd5b6001600160a01b038116611ebc5760405162461bcd60e51b8152600401808060200182810382526022815260200180614ca26022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b038381169190911791829055604080516315ab88c960e31b81529051929091169163ad5c464891600480820192602092909190829003018186803b158015611f1857600080fd5b505afa158015611f2c573d6000803e3d6000fd5b505050506040513d6020811015611f4257600080fd5b5051600480546001600160a01b0319166001600160a01b039283161781556002546040805163c45a015560e01b81529051919093169263c45a01559281810192602092909190829003018186803b158015611f9c57600080fd5b505afa158015611fb0573d6000803e3d6000fd5b505050506040513d6020811015611fc657600080fd5b5051600380546001600160a01b039283166001600160a01b03199091161790819055600254600454604080519285168352908416602083015291909216828201525133917f0cded593bf24267de84b7b3800bf9eb31ddb3c449fff75a64b1232bb7738d6df919081900360600190a250565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d60208110156120ad57600080fd5b50511015806120d457506120bf611d2a565b6001600160a01b0316336001600160a01b0316145b612113576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b61211b6118a5565b6121288585858585613b1e565b5050505050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d60208110156121a457600080fd5b50511015806121cb57506121b6611d2a565b6001600160a01b0316336001600160a01b0316145b61220a576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b60005b838110156121285761224385858381811061222457fe5b9050602002013584848481811061223757fe5b90506020020135613d96565b60010161220d565b6006546001600160a01b031681565b600e60209081526000928352604080842090915290825290208054600182015460029092015490919083565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d60208110156122fb57600080fd5b5051101580612322575061230d611d2a565b6001600160a01b0316336001600160a01b0316145b612361576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156123c4576040805162461bcd60e51b815260206004820152601b60248201527f536574506f696e74733a204e6f20706f696e7473206368616e67650000000000604482015290519081900360640190fd5b6001600160a01b03811661241f576040805162461bcd60e51b815260206004820181905260248201527f536574506f696e74733a204d7573742073657420706f696e74732076616c7565604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03838116918217909255600354600480546040805163e6a4390560e01b81529283019490945284166024820152915192169163e6a4390591604480820192602092909190829003018186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d60208110156124b657600080fd5b5051600880546001600160a01b039283166001600160a01b031990911617905560065460408051919092168152905133917f51a2b49da00e06b51910260db68d6491809bb5755e305a6f469fb89e8b5e99d5919081900360200190a250565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561256057600080fd5b505afa158015612574573d6000803e3d6000fd5b505050506040513d602081101561258a57600080fd5b50511015806125b1575061259c611d2a565b6001600160a01b0316336001600160a01b0316145b6125f0576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b610c3d81613ec9565b600080600d838154811061260957fe5b906000526020600020906009020190506126528160080154612646670de0b6b3a7640000611379856003015460115461324a90919063ffffffff16565b9063ffffffff6131ae16565b9392505050565b6003546001600160a01b031681565b60115481565b600d54600090815b81811015612772576000600d828154811061268d57fe5b60009182526020808320858452600e825260408085203386529092529220600281015460099092029092019250431180156126c85750805415155b15612768576126d6836132e5565b60006126e28433612b3f565b90508015612766576126fa868263ffffffff6131f016565b9550612723670de0b6b3a76400006113798560040154856000015461324a90919063ffffffff16565b6001830155436002830155604080518281529051859133917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79181900360200190a35b505b5050600101612676565b5081156118c457600c546040805163a8031a1d60e01b81523360048201526024810185905290516001600160a01b039092169163a8031a1d9160448082019260009290919082900301818387803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b50506040805185815290513393507f87c8f5d0edc1925e2c5f0557944a55a97424c9ded0e2ac25a5515137603c9ad392509081900360200190a25050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b50511015806128ba57506128a5611d2a565b6001600160a01b0316336001600160a01b0316145b6128f9576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6129016118a5565b60005b838110156121285761293a85858381811061291b57fe5b9050602002013584848481811061292e57fe5b90506020020135613f74565b600101612904565b600a546001600160a01b031681565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561299c57600080fd5b505afa1580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b50511015806129ed57506129d8611d2a565b6001600160a01b0316336001600160a01b0316145b612a2c576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b601054811415612a83576040805162461bcd60e51b815260206004820152601d60248201527f53657453746970656e643a204e6f2073746970656e64206368616e6765000000604482015290519081900360640190fd5b601081905560408051828152905133917e1db560367632140dc5de7e4cac2629deebb3946f49949b29ad8fe0a23baf9d919081900360200190a250565b600f6020526000908152604090205481565b6000828152600e60209081526040808320338085529252909120600201548391904311612b34576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b61165133858561405b565b600080600d8481548110612b4f57fe5b60009182526020808320878452600e825260408085206001600160a01b03891686529092529220600181015460099290920290920160048101548354919450612baa929161264691670de0b6b3a7640000916113799161324a565b925050505b92915050565b600080600d8381548110612bc557fe5b60009182526020822060099091020154600d80546001600160a01b0390921693509085908110612bf157fe5b600091825260209182902060016009909202010154600c546040805163057d4cc360e51b81526001600160a01b038781166004830152938416602482018190529151919550919092169263afa9986092604480840193829003018186803b158015612c5b57600080fd5b505afa158015612c6f573d6000803e3d6000fd5b505050506040513d6020811015612c8557600080fd5b5051949350505050565b612c97612ed0565b6000546001600160a01b03908116911614612ce7576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b6001600160a01b038116612d2c5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ac56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015612dd257600080fd5b505afa158015612de6573d6000803e3d6000fd5b505050506040513d6020811015612dfc57600080fd5b5051101580612e235750612e0e611d2a565b6001600160a01b0316336001600160a01b0316145b612e62576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b60005b8381101561212857612e9b858583818110612e7c57fe5b90506020020135848484818110612e8f57fe5b90506020020135614479565b600101612e65565b6002546001600160a01b031681565b600c546001600160a01b031681565b6007546001600160a01b031681565b3390565b612edc612ed0565b6000546001600160a01b03908116911614612f2c576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612f7657600080fd5b505afa158015612f8a573d6000803e3d6000fd5b505050506040513d6020811015612fa057600080fd5b5051905080612ff0576040805162461bcd60e51b815260206004820152601760248201527653776565703a204e6f20746f6b656e2062616c616e636560481b604482015290519081900360640190fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b505050506040513d602081101561306957600080fd5b5050471561309f5760405133904780156108fc02916000818181858888f1935050505015801561309d573d6000803e3d6000fd5b505b6040805182815290516001600160a01b0384169133917f39a3bfd42aa3a6ab14fe516cd2417618c0b46203671179fa38a757f24f5d30c39181900360200190a35050565b60006130ef8383612b3f565b9050806130fc57506118c4565b600c546040805163a8031a1d60e01b81526001600160a01b038581166004830152602482018590529151919092169163a8031a1d91604480830192600092919082900301818387803b15801561315157600080fd5b505af1158015613165573d6000803e3d6000fd5b50506040805184815290518693506001600160a01b03861692507f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79181900360200190a3505050565b600061265283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614555565b600082820183811015612652576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261325957506000612baf565b8282028284828161326657fe5b04146126525760405162461bcd60e51b8152600401808060200182810382526021815260200180614bee6021913960400191505060405180910390fd5b600061265283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145ec565b6000600d82815481106132f457fe5b9060005260206000209060090201905080600201546000148061331b575043816005015410155b8061332857506003810154155b156133335750610c3d565b600c60009054906101000a90046001600160a01b03166001600160a01b0316633e50de306040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561338357600080fd5b505af1158015613397573d6000803e3d6000fd5b5050505060006133a6836125f9565b905080156134045760028201546133e4906133d39061137984670de0b6b3a764000063ffffffff61324a16565b60048401549063ffffffff6131f016565b600483015560088201546133fe908263ffffffff6131f016565b60088301555b504360059091015550565b6000600d838154811061341e57fe5b60009182526020808320868452600e825260408085206001600160a01b038a1686529092529220600990910290910191508261348b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b30602a913960400191505060405180910390fd5b80548311156134cb5760405162461bcd60e51b8152600401808060200182810382526022815260200180614b0e6022913960400191505060405180910390fd5b6001600160a01b03851660009081527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c602052604090205460068301541115613550576040805162461bcd60e51b815260206004820152601260248201527157697468647261773a20564950204f6e6c7960701b604482015290519081900360640190fd5b613559846132e5565b61356384866130e3565b6002820154613578908463ffffffff6131ae16565b6002830155805461358f908463ffffffff6131ae16565b80825560048301546135b591670de0b6b3a764000091611379919063ffffffff61324a16565b600182015543600282015560078201546000906135e1906103e89061137990879063ffffffff61324a16565b905060006135f5858363ffffffff6131ae16565b905081156137a3578354600c54604080516370a0823160e01b81526001600160a01b039283166004820152905160009392909216916370a0823191602480820192602092909190829003018186803b15801561365057600080fd5b505afa158015613664573d6000803e3d6000fd5b505050506040513d602081101561367a57600080fd5b5051600c54865491925061369b916001600160a01b03918216911685613a5b565b8454600c54604080516370a0823160e01b81526001600160a01b039283166004820152905160009392909216916370a0823191602480820192602092909190829003018186803b1580156136ee57600080fd5b505afa158015613702573d6000803e3d6000fd5b505050506040513d602081101561371857600080fd5b50519050600061372e828463ffffffff6131ae16565b600c548854604080516302306a4560e51b81526001600160a01b03928316600482015260248101859052905193945091169163460d48a09160448082019260009290919082900301818387803b15801561378757600080fd5b505af115801561379b573d6000803e3d6000fd5b505050505050505b83546137ba9088906001600160a01b031683613a5b565b60408051828152905187916001600160a01b038a16917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050505050565b6000600d828154811061381257fe5b60009182526020808320858452600e825260408085206001600160a01b03808a16875293529093208054600b5460099094029094019450929116613898576040805162461bcd60e51b8152602060048201526018602482015277135a59dc985d194e88139bc81b5a59dc985d1bdc881cd95d60421b604482015290519081900360640190fd5b600081116138ed576040805162461bcd60e51b815260206004820152601d60248201527f4d6967726174653a204e6f20746f6b656e7320746f206d696772617465000000604482015290519081900360640190fd5b600383015415613944576040805162461bcd60e51b815260206004820152601d60248201527f4d6967726174653a20506f6f6c206973207374696c6c20616374697665000000604482015290519081900360640190fd5b61394e84866130e3565b6002830154613963908263ffffffff6131ae16565b600280850191909155600080845560018401554390830155600b54835461399d916001600160a01b0391821691168363ffffffff61465116565b600b5483546040805163049ff5b160e31b81526001600160a01b038981166004830152928316602482015260448101859052905191909216916324ffad8891606480830192600092919082900301818387803b1580156139fc57600080fd5b505af1158015613a10573d6000803e3d6000fd5b50506040805184815290518793506001600160a01b03891692507fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c9181900360200190a35050505050565b80613a65576116c3565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015613aaf57600080fd5b505afa158015613ac3573d6000803e3d6000fd5b505050506040513d6020811015613ad957600080fd5b5051905080821115613b0457613aff6001600160a01b038416858363ffffffff61476416565b611651565b6116516001600160a01b038416858463ffffffff61476416565b6001600160a01b0385166000908152600f602052604090205415613b735760405162461bcd60e51b8152600401808060200182810382526021815260200180614c2f6021913960400191505060405180910390fd5b600d546001600160a01b0386166000908152600f60209081526040808320939093556009905220805460ff19166001179055601254613bb8908463ffffffff6131f016565b601255601154600090613bdf90670de0b6b3a764000090611379908763ffffffff61324a16565b9050600d604051806101200160405280886001600160a01b03168152602001876001600160a01b03168152602001600081526020018681526020016000815260200143815260200185815260200184815260200183815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801555050856001600160a01b0316600f6000886001600160a01b03166001600160a01b0316815260200190815260200160002054336001600160a01b03167f2333cd0b9fe1eaf71d94e2d81e2683de7dbab224455f35b7365e5cde579c728f888860405180836001600160a01b03166001600160a01b031681526020018281526020019250505060405180910390a4505050505050565b600d8281548110613da357fe5b906000526020600020906009020160070154811415613e09576040805162461bcd60e51b815260206004820152601c60248201527f5365745374616b696e674665653a204e6f20666565206368616e676500000000604482015290519081900360640190fd5b6103e8811115613e60576040805162461bcd60e51b815260206004820152601e60248201527f5365744665653a204665652063616e6e6f742065786365656420313030250000604482015290519081900360640190fd5b80600d8381548110613e6e57fe5b90600052602060002090600902016007018190555081336001600160a01b03167f43ce45b3b6eef4fb3429626990f0493737f08eb051eb0babbcfc998223b12f5f836040518082815260200191505060405180910390a35050565b6001546001600160a01b0382811691161415613f165760405162461bcd60e51b8152600401808060200182810382526023815260200180614aeb6023913960400191505060405180910390fd5b600180546001600160a01b038084166001600160a01b03199092169190911791829055604080519290911682525133917f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d919081900360200190a250565b6000600d8381548110613f8357fe5b906000526020600020906009020190508181600301541415613fec576040805162461bcd60e51b815260206004820181905260248201527f536574416c6c6f63506f696e74733a204e6f20706f696e7473206368616e6765604482015290519081900360640190fd5b6140158261400983600301546012546131ae90919063ffffffff16565b9063ffffffff6131f016565b60125560038101829055604080518381529051849133917f4293855ab768b9f55ef778cf5df30fc83be17d1ef8b007a0aadfa16bb011fc019181900360200190a3505050565b6000600d838154811061406a57fe5b60009182526020808320868452600e825260408085206001600160a01b038a168652909252922060099091029091019150826140d75760405162461bcd60e51b8152600401808060200182810382526023815260200180614bcb6023913960400191505060405180910390fd5b6000826003015411614130576040805162461bcd60e51b815260206004820152601b60248201527f4465706f7369743a20506f6f6c206973206e6f74206163746976650000000000604482015290519081900360640190fd5b6001600160a01b03851660009081527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6020526040902054600683015411156141b4576040805162461bcd60e51b81526020600482015260116024820152704465706f7369743a20564950204f6e6c7960781b604482015290519081900360640190fd5b6141bd846132e5565b6141c784866130e3565b8154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561421157600080fd5b505afa158015614225573d6000803e3d6000fd5b505050506040513d602081101561423b57600080fd5b5051835490915061425d906001600160a01b031687308763ffffffff6147b616565b8254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156142a757600080fd5b505afa1580156142bb573d6000803e3d6000fd5b505050506040513d60208110156142d157600080fd5b5051905060006142e7828463ffffffff6131ae16565b60028601549091506142ff908263ffffffff6131f016565b60028601558354614316908263ffffffff6131f016565b808555600486015461433c91670de0b6b3a764000091611379919063ffffffff61324a16565b600185015543600285015560065460408051630f72908960e01b815290516001600160a01b03909216916323d14d60918b918491630f729089916004808301926020929190829003018186803b15801561439557600080fd5b505afa1580156143a9573d6000803e3d6000fd5b505050506040513d60208110156143bf57600080fd5b5051601054604080516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015251606480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b50506040805184815290518a93506001600160a01b038c1692507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050505050565b80600d838154811061448757fe5b90600052602060002090600902016006015414156144ec576040805162461bcd60e51b815260206004820152601e60248201527f536574566970416d6f756e743a204e6f20616d6f756e74206368616e67650000604482015290519081900360640190fd5b80600d83815481106144fa57fe5b90600052602060002090600902016006018190555081336001600160a01b03167feba8be26da52859a63d0bdaec7557e3e327eb3129145d6e151da471fce154c65836040518082815260200191505060405180910390a35050565b600081848411156145e45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145a9578181015183820152602001614591565b50505050905090810190601f1680156145d65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361463b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156145a9578181015183820152602001614591565b50600083858161464757fe5b0495945050505050565b8015806146d7575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156146a957600080fd5b505afa1580156146bd573d6000803e3d6000fd5b505050506040513d60208110156146d357600080fd5b5051155b6147125760405162461bcd60e51b8152600401808060200182810382526036815260200180614cc46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526116c390849061480c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116c390849061480c565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116519085905b6060614861826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148bd9092919063ffffffff16565b8051909150156116c35780806020019051602081101561488057600080fd5b50516116c35760405162461bcd60e51b815260040180806020018281038252602a815260200180614c78602a913960400191505060405180910390fd5b60606148cc84846000856148d4565b949350505050565b6060824710156149155760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba56026913960400191505060405180910390fd5b61491e85614a30565b61496f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106149ae5780518252601f19909201916020918201910161498f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614a10576040519150601f19603f3d011682016040523d82523d6000602084013e614a15565b606091505b5091509150614a25828286614a36565b979650505050505050565b3b151590565b60608315614a45575081612652565b825115614a555782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156145a957818101518382015260200161459156fe416e795374616b653a204f6e6c792070726576696f757320416e795374616b6520616c6c6f7765644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536574476f7665726e616e63653a204e6f20676f7665726e616e6365206368616e676557697468647261773a207573657220616d6f756e7420696e73756666696369656e7457697468647261773a20616d6f756e74206d7573742062652067726561746572207468616e207a65726f416e795374616b653a204d7573742077616974203120626c6f636b0000000000456d657267656e637957697468647261773a207573657220616d6f756e7420696e73756666696369656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4465706f7369743a2043616e6e6f74206465706f736974207a65726f20746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572416464506f6f6c3a20546f6b656e20706f6f6c20616c726561647920616464656453776565703a2043616e6e6f7420776974686472617720626c61636b6c697374656420746f6b656e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536574556e69737761703a204d7573742073657420756e69737761702076616c75655361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365476f763a204f6e6c7920476f7665726e6f727300000000000000000000000000a26469706673582212201e9d893608f6b42e006f9ca20d6e82cd936c11c1104a6e0f6fb9611987f9c40e64736f6c63430006060033536574476f7665726e616e63653a204e6f20676f7665726e616e6365206368616e676500000000000000000000000095ef77772bdaef25b56ec5f210e02bdaac40d1440000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000efccb112270c3c197b86ff03d26340d82a087f6c000000000000000000000000de3e18ecb613498b9a1483af51394ec2259bcd0a000000000000000000000000b6ee603933e024d8d53dde3faa0bf98fe2a3d6f1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102ab5760003560e01c80637cd07e4711610172578063d1058e59116100d9578063e4c75c2711610092578063e4c75c2714610a3f578063e757223014610a6b578063f2fde38b14610a88578063f575832114610aae578063f887ea4014610b6c578063fbfa77cf14610b74578063fdcc7b0814610b7c576102ab565b8063d1058e591461090b578063d1af0f9c14610913578063d3917cd5146109d1578063d6c24539146109d9578063df01df6f146109f6578063e2bbb15814610a1c576102ab565b806393f1a40b1161012b57806393f1a40b146108485780639f25cde714610892578063ab033ea9146108b8578063ad460d57146108de578063c45a0155146108fb578063cc498bc214610903576102ab565b80637cd07e471461070a5780638da5cb5b146107125780638efecdda1461071a5780638f2e93cc1461074057806390af639614610782578063917f973714610840576102ab565b806341c0e1b5116102165780635aa6e675116101cf5780635aa6e67514610501578063630b5ba1146105095780636817031b14610511578063715018a61461053757806374de4ec41461053f578063758572501461055c576102ab565b806341c0e1b514610477578063441a3e701461047f578063454b0608146104a2578063463d7ac3146104bf57806351eb05a6146104c75780635312ea8e146104e4576102ab565b806323cf31181161026857806323cf3118146103ca57806324ffad88146103f057806337710aca14610426578063379607f51461044a5780633bde19e1146104675780633fc8cef31461046f576102ab565b806301681a62146102b0578063081e3eda146102d8578063144fa6d7146102f25780631526fe271461031857806317caf6f11461038857806321603e8b14610390575b600080fd5b6102d6600480360360208110156102c657600080fd5b50356001600160a01b0316610b84565b005b6102e0610c40565b60408051918252519081900360200190f35b6102d66004803603602081101561030857600080fd5b50356001600160a01b0316610c46565b6103356004803603602081101561032e57600080fd5b5035610ed5565b604080516001600160a01b039a8b168152989099166020890152878901969096526060870194909452608086019290925260a085015260c084015260e08301526101008201529051908190036101200190f35b6102e0610f3a565b6103b6600480360360208110156103a657600080fd5b50356001600160a01b0316610f40565b604080519115158252519081900360200190f35b6102d6600480360360208110156103e057600080fd5b50356001600160a01b0316610f5e565b6102d66004803603606081101561040657600080fd5b506001600160a01b038135811691602081013590911690604001356110eb565b61042e611483565b604080516001600160a01b039092168252519081900360200190f35b6102d66004803603602081101561046057600080fd5b5035611492565b6102e0611574565b61042e61157a565b6102d6611589565b6102d66004803603604081101561049557600080fd5b50803590602001356115e4565b6102d6600480360360208110156104b857600080fd5b5035611657565b61042e6116c8565b6102d6600480360360208110156104dd57600080fd5b50356116d7565b6102d6600480360360208110156104fa57600080fd5b50356116e0565b61042e611896565b6102d66118a5565b6102d66004803603602081101561052757600080fd5b50356001600160a01b03166118c8565b6102d6611a5c565b6102d66004803603602081101561055557600080fd5b5035611afe565b6102d6600480360360a081101561057257600080fd5b810190602081018135600160201b81111561058c57600080fd5b82018360208201111561059e57600080fd5b803590602001918460208302840111600160201b831117156105bf57600080fd5b919390929091602081019035600160201b8111156105dc57600080fd5b8201836020820111156105ee57600080fd5b803590602001918460208302840111600160201b8311171561060f57600080fd5b919390929091602081019035600160201b81111561062c57600080fd5b82018360208201111561063e57600080fd5b803590602001918460208302840111600160201b8311171561065f57600080fd5b919390929091602081019035600160201b81111561067c57600080fd5b82018360208201111561068e57600080fd5b803590602001918460208302840111600160201b831117156106af57600080fd5b919390929091602081019035600160201b8111156106cc57600080fd5b8201836020820111156106de57600080fd5b803590602001918460208302840111600160201b831117156106ff57600080fd5b509092509050611b9f565b61042e611d1b565b61042e611d2a565b6102d66004803603602081101561073057600080fd5b50356001600160a01b0316611d39565b6102d6600480360360a081101561075657600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060800135612038565b6102d66004803603604081101561079857600080fd5b810190602081018135600160201b8111156107b257600080fd5b8201836020820111156107c457600080fd5b803590602001918460208302840111600160201b831117156107e557600080fd5b919390929091602081019035600160201b81111561080257600080fd5b82018360208201111561081457600080fd5b803590602001918460208302840111600160201b8311171561083557600080fd5b50909250905061212f565b61042e61224b565b6108746004803603604081101561085e57600080fd5b50803590602001356001600160a01b031661225a565b60408051938452602084019290925282820152519081900360600190f35b6102d6600480360360208110156108a857600080fd5b50356001600160a01b0316612286565b6102d6600480360360208110156108ce57600080fd5b50356001600160a01b0316612515565b6102e0600480360360208110156108f457600080fd5b50356125f9565b61042e612659565b6102e0612668565b6102d661266e565b6102d66004803603604081101561092957600080fd5b810190602081018135600160201b81111561094357600080fd5b82018360208201111561095557600080fd5b803590602001918460208302840111600160201b8311171561097657600080fd5b919390929091602081019035600160201b81111561099357600080fd5b8201836020820111156109a557600080fd5b803590602001918460208302840111600160201b831117156109c657600080fd5b50909250905061281e565b61042e612942565b6102d6600480360360208110156109ef57600080fd5b5035612951565b6102e060048036036020811015610a0c57600080fd5b50356001600160a01b0316612ac0565b6102d660048036036040811015610a3257600080fd5b5080359060200135612ad2565b6102e060048036036040811015610a5557600080fd5b50803590602001356001600160a01b0316612b3f565b6102e060048036036020811015610a8157600080fd5b5035612bb5565b6102d660048036036020811015610a9e57600080fd5b50356001600160a01b0316612c8f565b6102d660048036036040811015610ac457600080fd5b810190602081018135600160201b811115610ade57600080fd5b820183602082011115610af057600080fd5b803590602001918460208302840111600160201b83111715610b1157600080fd5b919390929091602081019035600160201b811115610b2e57600080fd5b820183602082011115610b4057600080fd5b803590602001918460208302840111600160201b83111715610b6157600080fd5b509092509050612d87565b61042e612ea3565b61042e612eb2565b61042e612ec1565b610b8c612ed0565b6000546001600160a01b03908116911614610bdc576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff1615610c345760405162461bcd60e51b8152600401808060200182810382526028815260200180614c506028913960400191505060405180910390fd5b610c3d81612ed4565b50565b600d5490565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015610c9157600080fd5b505afa158015610ca5573d6000803e3d6000fd5b505050506040513d6020811015610cbb57600080fd5b5051101580610ce25750610ccd611d2a565b6001600160a01b0316336001600160a01b0316145b610d21576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6005546001600160a01b0382811691161415610d84576040805162461bcd60e51b815260206004820152601960248201527f536574546f6b656e3a204e6f20746f6b656e206368616e676500000000000000604482015290519081900360640190fd5b6001600160a01b038116610ddf576040805162461bcd60e51b815260206004820152601e60248201527f536574546f6b656e3a204d7573742073657420746f6b656e2076616c75650000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b03838116918217909255600354600480546040805163e6a4390560e01b81529283019490945284166024820152915192169163e6a4390591604480820192602092909190829003018186803b158015610e4c57600080fd5b505afa158015610e60573d6000803e3d6000fd5b505050506040513d6020811015610e7657600080fd5b5051600780546001600160a01b039283166001600160a01b031990911617905560055460408051919092168152905133917f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117919081900360200190a250565b600d8181548110610ee257fe5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b0397881699509690951696939592949193909289565b60125481565b6001600160a01b031660009081526009602052604090205460ff1690565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015610fa957600080fd5b505afa158015610fbd573d6000803e3d6000fd5b505050506040513d6020811015610fd357600080fd5b5051101580610ffa5750610fe5611d2a565b6001600160a01b0316336001600160a01b0316145b611039576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6001600160a01b038116611094576040805162461bcd60e51b815260206004820152601f60248201527f5365744d69677261746f723a204e6f206d69677261746f72206368616e676500604482015290519081900360640190fd5b600b80546001600160a01b0383166001600160a01b03199091168117909155604080519182525133917f17356f011fa307735bd27bcbcd4ee385789d5155c6e44c093a1936e387f62ae5919081900360200190a250565b600a546001600160a01b031633146111345760405162461bcd60e51b8152600401808060200182810382526028815260200180614a9d6028913960400191505060405180910390fd5b6001600160a01b0382166000908152600f6020526040812054600d80549192918390811061115e57fe5b60009182526020808320858452600e825260408085206001600160a01b038b16865290925292206009909102909101915061119983876130e3565b604080516370a0823160e01b815230600482015290516000916001600160a01b038816916370a0823191602480820192602092909190829003018186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d602081101561120d57600080fd5b5051600a54604080516323b872dd60e01b81526001600160a01b039283166004820152306024820152604481018990529051929350908816916323b872dd916064808201926020929091908290030181600087803b15801561126e57600080fd5b505af1158015611282573d6000803e3d6000fd5b505050506040513d602081101561129857600080fd5b5050604080516370a0823160e01b815230600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b1580156112e457600080fd5b505afa1580156112f8573d6000803e3d6000fd5b505050506040513d602081101561130e57600080fd5b505190506000611324828463ffffffff6131ae16565b600286015490915061133c908263ffffffff6131f016565b60028601558354611353908263ffffffff6131f016565b808555600486015461138591670de0b6b3a764000091611379919063ffffffff61324a16565b9063ffffffff6132a316565b600185015543600285015560065460408051630f72908960e01b815290516001600160a01b03909216916323d14d60918c918491630f729089916004808301926020929190829003018186803b1580156113de57600080fd5b505afa1580156113f2573d6000803e3d6000fd5b505050506040513d602081101561140857600080fd5b5051601054604080516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015251606480830192600092919082900301818387803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b50505050505050505050505050565b6005546001600160a01b031681565b6000818152600e602090815260408083203380855292529091206002015482919043116114f4576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6000600d848154811061150357fe5b60009182526020808320878452600e82526040808520338652909252922060099091029091019150611534856132e5565b61153e85336130e3565b6004820154815461156291670de0b6b3a7640000916113799163ffffffff61324a16565b60018201554360029091015550505050565b60105481565b6004546001600160a01b031681565b611591612ed0565b6000546001600160a01b039081169116146115e1576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b33ff5b6000828152600e60209081526040808320338085529252909120600201548391904311611646576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b61165133858561340f565b50505050565b6000818152600e602090815260408083203380855292529091206002015482919043116116b9576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6116c33384613803565b505050565b6008546001600160a01b031681565b610c3d816132e5565b6000818152600e60209081526040808320338085529252909120600201548291904311611742576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b6000600d848154811061175157fe5b60009182526020808320878452600e8252604080852033865290925292208054600990920290920192506117b65760405162461bcd60e51b815260040180806020018281038252602b815260200180614b7a602b913960400191505060405180910390fd5b60006117d96103e86113798560070154856000015461324a90919063ffffffff16565b82549091506000906117f1908363ffffffff6131ae16565b8354600286015491925061180b919063ffffffff6131ae16565b600280860191909155600080855560018501554390840155600c54845461183f916001600160a01b03908116911684613a5b565b83546118569033906001600160a01b031683613a5b565b604080518281529051889133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a350505050505050565b6001546001600160a01b031681565b600d5460005b818110156118c4576118bc816132e5565b6001016118ab565b5050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561191357600080fd5b505afa158015611927573d6000803e3d6000fd5b505050506040513d602081101561193d57600080fd5b5051101580611964575061194f611d2a565b6001600160a01b0316336001600160a01b0316145b6119a3576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6001600160a01b0381166119fe576040805162461bcd60e51b815260206004820152601c60248201527f5365745661756c743a204e6f206d69677261746f72206368616e676500000000604482015290519081900360640190fd5b600c80546001600160a01b038084166001600160a01b03199092169190911791829055604080519290911682525133917f483bdedaaf23706a9800ac1af0d852b34927780d79f9d6ba60a80c7cad75ea39919081900360200190a250565b611a64612ed0565b6000546001600160a01b03908116911614611ab4576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b600c546001600160a01b03163314611b5d576040805162461bcd60e51b815260206004820152601c60248201527f416e795374616b653a204f6e6c79205661756c7420616c6c6f77656400000000604482015290519081900360640190fd5b80611b6757610c3d565b601254611b9990611b8a9061137984670de0b6b3a764000063ffffffff61324a16565b6011549063ffffffff6131f016565b60115550565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015611bea57600080fd5b505afa158015611bfe573d6000803e3d6000fd5b505050506040513d6020811015611c1457600080fd5b5051101580611c3b5750611c26611d2a565b6001600160a01b0316336001600160a01b0316145b611c7a576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b611c826118a5565b60005b89811015611d0e57611d068b8b83818110611c9c57fe5b905060200201356001600160a01b03168a8a84818110611cb857fe5b905060200201356001600160a01b0316898985818110611cd457fe5b90506020020135888886818110611ce757fe5b90506020020135878787818110611cfa57fe5b90506020020135613b1e565b600101611c85565b5050505050505050505050565b600b546001600160a01b031681565b6000546001600160a01b031690565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015611d8457600080fd5b505afa158015611d98573d6000803e3d6000fd5b505050506040513d6020811015611dae57600080fd5b5051101580611dd55750611dc0611d2a565b6001600160a01b0316336001600160a01b0316145b611e14576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6002546001600160a01b0382811691161415611e77576040805162461bcd60e51b815260206004820152601d60248201527f536574556e69737761703a204e6f20756e6973776170206368616e6765000000604482015290519081900360640190fd5b6001600160a01b038116611ebc5760405162461bcd60e51b8152600401808060200182810382526022815260200180614ca26022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b038381169190911791829055604080516315ab88c960e31b81529051929091169163ad5c464891600480820192602092909190829003018186803b158015611f1857600080fd5b505afa158015611f2c573d6000803e3d6000fd5b505050506040513d6020811015611f4257600080fd5b5051600480546001600160a01b0319166001600160a01b039283161781556002546040805163c45a015560e01b81529051919093169263c45a01559281810192602092909190829003018186803b158015611f9c57600080fd5b505afa158015611fb0573d6000803e3d6000fd5b505050506040513d6020811015611fc657600080fd5b5051600380546001600160a01b039283166001600160a01b03199091161790819055600254600454604080519285168352908416602083015291909216828201525133917f0cded593bf24267de84b7b3800bf9eb31ddb3c449fff75a64b1232bb7738d6df919081900360600190a250565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561208357600080fd5b505afa158015612097573d6000803e3d6000fd5b505050506040513d60208110156120ad57600080fd5b50511015806120d457506120bf611d2a565b6001600160a01b0316336001600160a01b0316145b612113576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b61211b6118a5565b6121288585858585613b1e565b5050505050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561217a57600080fd5b505afa15801561218e573d6000803e3d6000fd5b505050506040513d60208110156121a457600080fd5b50511015806121cb57506121b6611d2a565b6001600160a01b0316336001600160a01b0316145b61220a576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b60005b838110156121285761224385858381811061222457fe5b9050602002013584848481811061223757fe5b90506020020135613d96565b60010161220d565b6006546001600160a01b031681565b600e60209081526000928352604080842090915290825290208054600182015460029092015490919083565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b1580156122d157600080fd5b505afa1580156122e5573d6000803e3d6000fd5b505050506040513d60208110156122fb57600080fd5b5051101580612322575061230d611d2a565b6001600160a01b0316336001600160a01b0316145b612361576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6006546001600160a01b03828116911614156123c4576040805162461bcd60e51b815260206004820152601b60248201527f536574506f696e74733a204e6f20706f696e7473206368616e67650000000000604482015290519081900360640190fd5b6001600160a01b03811661241f576040805162461bcd60e51b815260206004820181905260248201527f536574506f696e74733a204d7573742073657420706f696e74732076616c7565604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b03838116918217909255600354600480546040805163e6a4390560e01b81529283019490945284166024820152915192169163e6a4390591604480820192602092909190829003018186803b15801561248c57600080fd5b505afa1580156124a0573d6000803e3d6000fd5b505050506040513d60208110156124b657600080fd5b5051600880546001600160a01b039283166001600160a01b031990911617905560065460408051919092168152905133917f51a2b49da00e06b51910260db68d6491809bb5755e305a6f469fb89e8b5e99d5919081900360200190a250565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561256057600080fd5b505afa158015612574573d6000803e3d6000fd5b505050506040513d602081101561258a57600080fd5b50511015806125b1575061259c611d2a565b6001600160a01b0316336001600160a01b0316145b6125f0576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b610c3d81613ec9565b600080600d838154811061260957fe5b906000526020600020906009020190506126528160080154612646670de0b6b3a7640000611379856003015460115461324a90919063ffffffff16565b9063ffffffff6131ae16565b9392505050565b6003546001600160a01b031681565b60115481565b600d54600090815b81811015612772576000600d828154811061268d57fe5b60009182526020808320858452600e825260408085203386529092529220600281015460099092029092019250431180156126c85750805415155b15612768576126d6836132e5565b60006126e28433612b3f565b90508015612766576126fa868263ffffffff6131f016565b9550612723670de0b6b3a76400006113798560040154856000015461324a90919063ffffffff16565b6001830155436002830155604080518281529051859133917f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79181900360200190a35b505b5050600101612676565b5081156118c457600c546040805163a8031a1d60e01b81523360048201526024810185905290516001600160a01b039092169163a8031a1d9160448082019260009290919082900301818387803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b50506040805185815290513393507f87c8f5d0edc1925e2c5f0557944a55a97424c9ded0e2ac25a5515137603c9ad392509081900360200190a25050565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561286957600080fd5b505afa15801561287d573d6000803e3d6000fd5b505050506040513d602081101561289357600080fd5b50511015806128ba57506128a5611d2a565b6001600160a01b0316336001600160a01b0316145b6128f9576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b6129016118a5565b60005b838110156121285761293a85858381811061291b57fe5b9050602002013584848481811061292e57fe5b90506020020135613f74565b600101612904565b600a546001600160a01b031681565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b15801561299c57600080fd5b505afa1580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b50511015806129ed57506129d8611d2a565b6001600160a01b0316336001600160a01b0316145b612a2c576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b601054811415612a83576040805162461bcd60e51b815260206004820152601d60248201527f53657453746970656e643a204e6f2073746970656e64206368616e6765000000604482015290519081900360640190fd5b601081905560408051828152905133917e1db560367632140dc5de7e4cac2629deebb3946f49949b29ad8fe0a23baf9d919081900360200190a250565b600f6020526000908152604090205481565b6000828152600e60209081526040808320338085529252909120600201548391904311612b34576040805162461bcd60e51b815260206004820152601b6024820152600080516020614b5a833981519152604482015290519081900360640190fd5b61165133858561405b565b600080600d8481548110612b4f57fe5b60009182526020808320878452600e825260408085206001600160a01b03891686529092529220600181015460099290920290920160048101548354919450612baa929161264691670de0b6b3a7640000916113799161324a565b925050505b92915050565b600080600d8381548110612bc557fe5b60009182526020822060099091020154600d80546001600160a01b0390921693509085908110612bf157fe5b600091825260209182902060016009909202010154600c546040805163057d4cc360e51b81526001600160a01b038781166004830152938416602482018190529151919550919092169263afa9986092604480840193829003018186803b158015612c5b57600080fd5b505afa158015612c6f573d6000803e3d6000fd5b505050506040513d6020811015612c8557600080fd5b5051949350505050565b612c97612ed0565b6000546001600160a01b03908116911614612ce7576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b6001600160a01b038116612d2c5760405162461bcd60e51b8152600401808060200182810382526026815260200180614ac56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460408051630f9e0f3360e31b815233600482015290516002926001600160a01b031691637cf07998916024808301926020929190829003018186803b158015612dd257600080fd5b505afa158015612de6573d6000803e3d6000fd5b505050506040513d6020811015612dfc57600080fd5b5051101580612e235750612e0e611d2a565b6001600160a01b0316336001600160a01b0316145b612e62576040805162461bcd60e51b81526020600482015260136024820152600080516020614cfa833981519152604482015290519081900360640190fd5b60005b8381101561212857612e9b858583818110612e7c57fe5b90506020020135848484818110612e8f57fe5b90506020020135614479565b600101612e65565b6002546001600160a01b031681565b600c546001600160a01b031681565b6007546001600160a01b031681565b3390565b612edc612ed0565b6000546001600160a01b03908116911614612f2c576040805162461bcd60e51b81526020600482018190526024820152600080516020614c0f833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612f7657600080fd5b505afa158015612f8a573d6000803e3d6000fd5b505050506040513d6020811015612fa057600080fd5b5051905080612ff0576040805162461bcd60e51b815260206004820152601760248201527653776565703a204e6f20746f6b656e2062616c616e636560481b604482015290519081900360640190fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561303f57600080fd5b505af1158015613053573d6000803e3d6000fd5b505050506040513d602081101561306957600080fd5b5050471561309f5760405133904780156108fc02916000818181858888f1935050505015801561309d573d6000803e3d6000fd5b505b6040805182815290516001600160a01b0384169133917f39a3bfd42aa3a6ab14fe516cd2417618c0b46203671179fa38a757f24f5d30c39181900360200190a35050565b60006130ef8383612b3f565b9050806130fc57506118c4565b600c546040805163a8031a1d60e01b81526001600160a01b038581166004830152602482018590529151919092169163a8031a1d91604480830192600092919082900301818387803b15801561315157600080fd5b505af1158015613165573d6000803e3d6000fd5b50506040805184815290518693506001600160a01b03861692507f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf79181900360200190a3505050565b600061265283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614555565b600082820183811015612652576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261325957506000612baf565b8282028284828161326657fe5b04146126525760405162461bcd60e51b8152600401808060200182810382526021815260200180614bee6021913960400191505060405180910390fd5b600061265283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506145ec565b6000600d82815481106132f457fe5b9060005260206000209060090201905080600201546000148061331b575043816005015410155b8061332857506003810154155b156133335750610c3d565b600c60009054906101000a90046001600160a01b03166001600160a01b0316633e50de306040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561338357600080fd5b505af1158015613397573d6000803e3d6000fd5b5050505060006133a6836125f9565b905080156134045760028201546133e4906133d39061137984670de0b6b3a764000063ffffffff61324a16565b60048401549063ffffffff6131f016565b600483015560088201546133fe908263ffffffff6131f016565b60088301555b504360059091015550565b6000600d838154811061341e57fe5b60009182526020808320868452600e825260408085206001600160a01b038a1686529092529220600990910290910191508261348b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b30602a913960400191505060405180910390fd5b80548311156134cb5760405162461bcd60e51b8152600401808060200182810382526022815260200180614b0e6022913960400191505060405180910390fd5b6001600160a01b03851660009081527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c602052604090205460068301541115613550576040805162461bcd60e51b815260206004820152601260248201527157697468647261773a20564950204f6e6c7960701b604482015290519081900360640190fd5b613559846132e5565b61356384866130e3565b6002820154613578908463ffffffff6131ae16565b6002830155805461358f908463ffffffff6131ae16565b80825560048301546135b591670de0b6b3a764000091611379919063ffffffff61324a16565b600182015543600282015560078201546000906135e1906103e89061137990879063ffffffff61324a16565b905060006135f5858363ffffffff6131ae16565b905081156137a3578354600c54604080516370a0823160e01b81526001600160a01b039283166004820152905160009392909216916370a0823191602480820192602092909190829003018186803b15801561365057600080fd5b505afa158015613664573d6000803e3d6000fd5b505050506040513d602081101561367a57600080fd5b5051600c54865491925061369b916001600160a01b03918216911685613a5b565b8454600c54604080516370a0823160e01b81526001600160a01b039283166004820152905160009392909216916370a0823191602480820192602092909190829003018186803b1580156136ee57600080fd5b505afa158015613702573d6000803e3d6000fd5b505050506040513d602081101561371857600080fd5b50519050600061372e828463ffffffff6131ae16565b600c548854604080516302306a4560e51b81526001600160a01b03928316600482015260248101859052905193945091169163460d48a09160448082019260009290919082900301818387803b15801561378757600080fd5b505af115801561379b573d6000803e3d6000fd5b505050505050505b83546137ba9088906001600160a01b031683613a5b565b60408051828152905187916001600160a01b038a16917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350505050505050565b6000600d828154811061381257fe5b60009182526020808320858452600e825260408085206001600160a01b03808a16875293529093208054600b5460099094029094019450929116613898576040805162461bcd60e51b8152602060048201526018602482015277135a59dc985d194e88139bc81b5a59dc985d1bdc881cd95d60421b604482015290519081900360640190fd5b600081116138ed576040805162461bcd60e51b815260206004820152601d60248201527f4d6967726174653a204e6f20746f6b656e7320746f206d696772617465000000604482015290519081900360640190fd5b600383015415613944576040805162461bcd60e51b815260206004820152601d60248201527f4d6967726174653a20506f6f6c206973207374696c6c20616374697665000000604482015290519081900360640190fd5b61394e84866130e3565b6002830154613963908263ffffffff6131ae16565b600280850191909155600080845560018401554390830155600b54835461399d916001600160a01b0391821691168363ffffffff61465116565b600b5483546040805163049ff5b160e31b81526001600160a01b038981166004830152928316602482015260448101859052905191909216916324ffad8891606480830192600092919082900301818387803b1580156139fc57600080fd5b505af1158015613a10573d6000803e3d6000fd5b50506040805184815290518793506001600160a01b03891692507fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c9181900360200190a35050505050565b80613a65576116c3565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b158015613aaf57600080fd5b505afa158015613ac3573d6000803e3d6000fd5b505050506040513d6020811015613ad957600080fd5b5051905080821115613b0457613aff6001600160a01b038416858363ffffffff61476416565b611651565b6116516001600160a01b038416858463ffffffff61476416565b6001600160a01b0385166000908152600f602052604090205415613b735760405162461bcd60e51b8152600401808060200182810382526021815260200180614c2f6021913960400191505060405180910390fd5b600d546001600160a01b0386166000908152600f60209081526040808320939093556009905220805460ff19166001179055601254613bb8908463ffffffff6131f016565b601255601154600090613bdf90670de0b6b3a764000090611379908763ffffffff61324a16565b9050600d604051806101200160405280886001600160a01b03168152602001876001600160a01b03168152602001600081526020018681526020016000815260200143815260200185815260200184815260200183815250908060018154018082558091505060019003906000526020600020906009020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801555050856001600160a01b0316600f6000886001600160a01b03166001600160a01b0316815260200190815260200160002054336001600160a01b03167f2333cd0b9fe1eaf71d94e2d81e2683de7dbab224455f35b7365e5cde579c728f888860405180836001600160a01b03166001600160a01b031681526020018281526020019250505060405180910390a4505050505050565b600d8281548110613da357fe5b906000526020600020906009020160070154811415613e09576040805162461bcd60e51b815260206004820152601c60248201527f5365745374616b696e674665653a204e6f20666565206368616e676500000000604482015290519081900360640190fd5b6103e8811115613e60576040805162461bcd60e51b815260206004820152601e60248201527f5365744665653a204665652063616e6e6f742065786365656420313030250000604482015290519081900360640190fd5b80600d8381548110613e6e57fe5b90600052602060002090600902016007018190555081336001600160a01b03167f43ce45b3b6eef4fb3429626990f0493737f08eb051eb0babbcfc998223b12f5f836040518082815260200191505060405180910390a35050565b6001546001600160a01b0382811691161415613f165760405162461bcd60e51b8152600401808060200182810382526023815260200180614aeb6023913960400191505060405180910390fd5b600180546001600160a01b038084166001600160a01b03199092169190911791829055604080519290911682525133917f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d919081900360200190a250565b6000600d8381548110613f8357fe5b906000526020600020906009020190508181600301541415613fec576040805162461bcd60e51b815260206004820181905260248201527f536574416c6c6f63506f696e74733a204e6f20706f696e7473206368616e6765604482015290519081900360640190fd5b6140158261400983600301546012546131ae90919063ffffffff16565b9063ffffffff6131f016565b60125560038101829055604080518381529051849133917f4293855ab768b9f55ef778cf5df30fc83be17d1ef8b007a0aadfa16bb011fc019181900360200190a3505050565b6000600d838154811061406a57fe5b60009182526020808320868452600e825260408085206001600160a01b038a168652909252922060099091029091019150826140d75760405162461bcd60e51b8152600401808060200182810382526023815260200180614bcb6023913960400191505060405180910390fd5b6000826003015411614130576040805162461bcd60e51b815260206004820152601b60248201527f4465706f7369743a20506f6f6c206973206e6f74206163746976650000000000604482015290519081900360640190fd5b6001600160a01b03851660009081527fe710864318d4a32f37d6ce54cb3fadbef648dd12d8dbdf53973564d56b7f881c6020526040902054600683015411156141b4576040805162461bcd60e51b81526020600482015260116024820152704465706f7369743a20564950204f6e6c7960781b604482015290519081900360640190fd5b6141bd846132e5565b6141c784866130e3565b8154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561421157600080fd5b505afa158015614225573d6000803e3d6000fd5b505050506040513d602081101561423b57600080fd5b5051835490915061425d906001600160a01b031687308763ffffffff6147b616565b8254604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156142a757600080fd5b505afa1580156142bb573d6000803e3d6000fd5b505050506040513d60208110156142d157600080fd5b5051905060006142e7828463ffffffff6131ae16565b60028601549091506142ff908263ffffffff6131f016565b60028601558354614316908263ffffffff6131f016565b808555600486015461433c91670de0b6b3a764000091611379919063ffffffff61324a16565b600185015543600285015560065460408051630f72908960e01b815290516001600160a01b03909216916323d14d60918b918491630f729089916004808301926020929190829003018186803b15801561439557600080fd5b505afa1580156143a9573d6000803e3d6000fd5b505050506040513d60208110156143bf57600080fd5b5051601054604080516001600160e01b031960e087901b1681526001600160a01b0390941660048501526024840192909252604483015251606480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b50506040805184815290518a93506001600160a01b038c1692507f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050505050505050565b80600d838154811061448757fe5b90600052602060002090600902016006015414156144ec576040805162461bcd60e51b815260206004820152601e60248201527f536574566970416d6f756e743a204e6f20616d6f756e74206368616e67650000604482015290519081900360640190fd5b80600d83815481106144fa57fe5b90600052602060002090600902016006018190555081336001600160a01b03167feba8be26da52859a63d0bdaec7557e3e327eb3129145d6e151da471fce154c65836040518082815260200191505060405180910390a35050565b600081848411156145e45760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145a9578181015183820152602001614591565b50505050905090810190601f1680156145d65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000818361463b5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156145a9578181015183820152602001614591565b50600083858161464757fe5b0495945050505050565b8015806146d7575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156146a957600080fd5b505afa1580156146bd573d6000803e3d6000fd5b505050506040513d60208110156146d357600080fd5b5051155b6147125760405162461bcd60e51b8152600401808060200182810382526036815260200180614cc46036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526116c390849061480c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526116c390849061480c565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526116519085905b6060614861826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166148bd9092919063ffffffff16565b8051909150156116c35780806020019051602081101561488057600080fd5b50516116c35760405162461bcd60e51b815260040180806020018281038252602a815260200180614c78602a913960400191505060405180910390fd5b60606148cc84846000856148d4565b949350505050565b6060824710156149155760405162461bcd60e51b8152600401808060200182810382526026815260200180614ba56026913960400191505060405180910390fd5b61491e85614a30565b61496f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106149ae5780518252601f19909201916020918201910161498f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614a10576040519150601f19603f3d011682016040523d82523d6000602084013e614a15565b606091505b5091509150614a25828286614a36565b979650505050505050565b3b151590565b60608315614a45575081612652565b825115614a555782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156145a957818101518382015260200161459156fe416e795374616b653a204f6e6c792070726576696f757320416e795374616b6520616c6c6f7765644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536574476f7665726e616e63653a204e6f20676f7665726e616e6365206368616e676557697468647261773a207573657220616d6f756e7420696e73756666696369656e7457697468647261773a20616d6f756e74206d7573742062652067726561746572207468616e207a65726f416e795374616b653a204d7573742077616974203120626c6f636b0000000000456d657267656e637957697468647261773a207573657220616d6f756e7420696e73756666696369656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4465706f7369743a2043616e6e6f74206465706f736974207a65726f20746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572416464506f6f6c3a20546f6b656e20706f6f6c20616c726561647920616464656453776565703a2043616e6e6f7420776974686472617720626c61636b6c697374656420746f6b656e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564536574556e69737761703a204d7573742073657420756e69737761702076616c75655361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365476f763a204f6e6c7920476f7665726e6f727300000000000000000000000000a26469706673582212201e9d893608f6b42e006f9ca20d6e82cd936c11c1104a6e0f6fb9611987f9c40e64736f6c63430006060033

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

00000000000000000000000095ef77772bdaef25b56ec5f210e02bdaac40d1440000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000efccb112270c3c197b86ff03d26340d82a087f6c000000000000000000000000de3e18ecb613498b9a1483af51394ec2259bcd0a000000000000000000000000b6ee603933e024d8d53dde3faa0bf98fe2a3d6f1

-----Decoded View---------------
Arg [0] : _anystake (address): 0x95EF77772BdAEF25B56ec5f210e02BdaAc40D144
Arg [1] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _gov (address): 0xefcCb112270c3C197b86ff03D26340d82a087F6c
Arg [3] : _points (address): 0xDe3E18eCB613498b9a1483Af51394Ec2259BcD0a
Arg [4] : _token (address): 0xB6eE603933E024d8d53dDE3faa0bf98fE2a3d6f1

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000095ef77772bdaef25b56ec5f210e02bdaac40d144
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000efccb112270c3c197b86ff03d26340d82a087f6c
Arg [3] : 000000000000000000000000de3e18ecb613498b9a1483af51394ec2259bcd0a
Arg [4] : 000000000000000000000000b6ee603933e024d8d53dde3faa0bf98fe2a3d6f1


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.