POL Price: $0.587293 (-2.45%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Handle Rewards570854482024-05-17 22:06:09213 days ago1715983569IN
Metavault: Old Reward Router
0 POL0.0044056830.00000082
Unstake Mvx490938912023-10-24 12:11:11419 days ago1698149471IN
Metavault: Old Reward Router
0 POL0.0421828295.82977607
Stake Es Mvx476050932023-09-16 8:35:33457 days ago1694853333IN
Metavault: Old Reward Router
0 POL0.03852695102.02625491
Unstake Es Mvx476050672023-09-16 8:34:37457 days ago1694853277IN
Metavault: Old Reward Router
0 POL0.04883231102.02625491
Stake Es Mvx476050512023-09-16 8:34:03457 days ago1694853243IN
Metavault: Old Reward Router
0 POL0.04152897102.02625491
Stake Mvx476049772023-09-16 8:31:27457 days ago1694853087IN
Metavault: Old Reward Router
0 POL0.04631277102.02625491
Handle Rewards476047402023-09-16 8:23:03457 days ago1694852583IN
Metavault: Old Reward Router
0 POL0.0351375596.29997819
Unstake Es Mvx476046832023-09-16 8:21:01457 days ago1694852461IN
Metavault: Old Reward Router
0 POL0.0447528196.29997819
Stake Es Mvx446351822023-07-03 13:36:29532 days ago1688391389IN
Metavault: Old Reward Router
0 POL0.07074552158.22315751
Handle Rewards446351202023-07-03 13:33:47532 days ago1688391227IN
Metavault: Old Reward Router
0 POL0.07250734158.22315751
Unstake Mvx424503422023-05-08 10:45:38588 days ago1683542738IN
Metavault: Old Reward Router
0 POL0.09453839172.86482816
Handle Rewards423174872023-05-05 1:49:47592 days ago1683251387IN
Metavault: Old Reward Router
0 POL0.16286117224.70894604
Mint And Stake M...422933402023-05-04 11:18:11592 days ago1683199091IN
Metavault: Old Reward Router
10 POL0.35008222265
Handle Rewards421314182023-04-30 9:35:43596 days ago1682847343IN
Metavault: Old Reward Router
0 POL0.2100001296.96432301
Stake Es Mvx418902982023-04-24 4:53:15602 days ago1682311995IN
Metavault: Old Reward Router
0 POL0.19696631440.51733569
Handle Rewards418902902023-04-24 4:52:43602 days ago1682311963IN
Metavault: Old Reward Router
0 POL0.19610069440.51733569
Handle Rewards415873132023-04-16 6:00:48610 days ago1681624848IN
Metavault: Old Reward Router
0 POL0.12012234169.86682725
Stake Mvx415180212023-04-14 10:11:23612 days ago1681467083IN
Metavault: Old Reward Router
0 POL0.07792717166.61358869
Handle Rewards414198692023-04-11 20:55:19615 days ago1681246519IN
Metavault: Old Reward Router
0 POL0.14823187188.28594555
Handle Rewards413687922023-04-10 13:15:38616 days ago1681132538IN
Metavault: Old Reward Router
0 POL0.11128929156.05182893
Handle Rewards412579162023-04-07 16:53:48619 days ago1680886428IN
Metavault: Old Reward Router
0 POL0.26958913152.38179002
Handle Rewards411711982023-04-05 11:53:38621 days ago1680695618IN
Metavault: Old Reward Router
0 POL0.08783244123.16020713
Handle Rewards410156622023-04-01 11:12:28625 days ago1680347548IN
Metavault: Old Reward Router
0 POL0.10028286141.81152127
Handle Rewards410156432023-04-01 11:11:48625 days ago1680347508IN
Metavault: Old Reward Router
0 POL0.10472164144.49047633
Handle Rewards409836202023-03-31 15:46:08626 days ago1680277568IN
Metavault: Old Reward Router
0 POL0.15420912134.05677243
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
539085342024-02-24 17:03:18296 days ago1708794198
Metavault: Old Reward Router
27,721.23212399 POL
539085342024-02-24 17:03:18296 days ago1708794198
Metavault: Old Reward Router
27,721.23212399 POL
476047402023-09-16 8:23:03457 days ago1694852583
Metavault: Old Reward Router
2.43218229 POL
476047402023-09-16 8:23:03457 days ago1694852583
Metavault: Old Reward Router
2.43218229 POL
446351202023-07-03 13:33:47532 days ago1688391227
Metavault: Old Reward Router
2.77753152 POL
446351202023-07-03 13:33:47532 days ago1688391227
Metavault: Old Reward Router
2.77753152 POL
443414552023-06-26 1:08:47540 days ago1687741727
Metavault: Old Reward Router
15,137.9922321 POL
443414552023-06-26 1:08:47540 days ago1687741727
Metavault: Old Reward Router
15,137.9922321 POL
423174872023-05-05 1:49:47592 days ago1683251387
Metavault: Old Reward Router
1.27600268 POL
423174872023-05-05 1:49:47592 days ago1683251387
Metavault: Old Reward Router
1.27600268 POL
422933402023-05-04 11:18:11592 days ago1683199091
Metavault: Old Reward Router
10 POL
421314182023-04-30 9:35:43596 days ago1682847343
Metavault: Old Reward Router
1.20506355 POL
421314182023-04-30 9:35:43596 days ago1682847343
Metavault: Old Reward Router
1.20506355 POL
418902902023-04-24 4:52:43602 days ago1682311963
Metavault: Old Reward Router
1.36507311 POL
418902902023-04-24 4:52:43602 days ago1682311963
Metavault: Old Reward Router
1.36507311 POL
415873132023-04-16 6:00:48610 days ago1681624848
Metavault: Old Reward Router
0.91753327 POL
415873132023-04-16 6:00:48610 days ago1681624848
Metavault: Old Reward Router
0.91753327 POL
414198692023-04-11 20:55:19615 days ago1681246519
Metavault: Old Reward Router
1.3802258 POL
414198692023-04-11 20:55:19615 days ago1681246519
Metavault: Old Reward Router
1.3802258 POL
413687922023-04-10 13:15:38616 days ago1681132538
Metavault: Old Reward Router
1.02097534 POL
413687922023-04-10 13:15:38616 days ago1681132538
Metavault: Old Reward Router
1.02097534 POL
411711982023-04-05 11:53:38621 days ago1680695618
Metavault: Old Reward Router
1.56090142 POL
411711982023-04-05 11:53:38621 days ago1680695618
Metavault: Old Reward Router
1.56090142 POL
410156622023-04-01 11:12:28625 days ago1680347548
Metavault: Old Reward Router
18.64417386 POL
410156622023-04-01 11:12:28625 days ago1680347548
Metavault: Old Reward Router
18.64417386 POL
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion
File 1 of 17 : RewardRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "../libraries/math/SafeMath.sol";
import "../libraries/token/IERC20.sol";
import "../libraries/token/SafeERC20.sol";
import "../libraries/token/TransferHelper.sol";
import "../libraries/utils/ReentrancyGuard.sol";
import "../libraries/utils/Address.sol";

import "./interfaces/IRewardTracker.sol";
import "./interfaces/IVester.sol";
import "../tokens/interfaces/IMintable.sol";
import "../tokens/interfaces/IWETH.sol";
import "../core/interfaces/IMvlpManager.sol";
import "../core/interfaces/IVault.sol";
import "../access/Governable.sol";
import "../peripherals/interfaces/ISwapRouter.sol";

contract RewardRouter is ReentrancyGuard, Governable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;
    using Address for address payable;

    bool public isInitialized;

    address public weth;


    ISwapRouter public immutable swapRouter;

    address public vault;
    address public usdc;
    address public mvx;
    address public esMvx;
    address public bnMvx;

    address public mvlp; // MVX Liquidity Provider token

    address public stakedMvxTracker;
    address public bonusMvxTracker;
    address public feeMvxTracker;

    address public stakedMvlpTracker;
    address public feeMvlpTracker;

    address public mvlpManager;

    address public mvxVester;
    address public mvlpVester;

    mapping(address => address) public pendingReceivers;

    event StakeMvx(address account, address token, uint256 amount);
    event UnstakeMvx(address account, address token, uint256 amount);

    event StakeMvlp(address account, uint256 amount);
    event UnstakeMvlp(address account, uint256 amount);

    receive() external payable {
        require(msg.sender == weth, "Router: invalid sender");
    }

    uint24 public constant MVX_USDC_POOL_FEE = 10000;

    constructor(address _swapRouter,
        address _weth,
        address _mvx,
        address _esMvx,
        address _bnMvx,
        address _mvlp,       
        address _usdc,
        address _vault    
    ) public{
        swapRouter = ISwapRouter(_swapRouter);
        weth = _weth;
        mvx = _mvx;
        esMvx = _esMvx;
        bnMvx = _bnMvx;
        mvlp = _mvlp;        
        usdc = _usdc;
        vault = _vault;
    }

    function initialize(
        address _stakedMvxTracker,
        address _bonusMvxTracker,
        address _feeMvxTracker,
        address _feeMvlpTracker,
        address _stakedMvlpTracker,
        address _mvlpManager,
        address _mvxVester,
        address _mvlpVester
    ) external onlyGov {
        require(!isInitialized, "RewardRouter: already initialized");
        isInitialized = true;

        stakedMvxTracker = _stakedMvxTracker;
        bonusMvxTracker = _bonusMvxTracker;
        feeMvxTracker = _feeMvxTracker;

        feeMvlpTracker = _feeMvlpTracker;
        stakedMvlpTracker = _stakedMvlpTracker;

        mvlpManager = _mvlpManager;

        mvxVester = _mvxVester;
        mvlpVester = _mvlpVester;

    }

    // to help users who accidentally send their tokens to this contract
    function withdrawToken(
        address _token,
        address _account,
        uint256 _amount
    ) external onlyGov {
        IERC20(_token).safeTransfer(_account, _amount);
    }

    function batchStakeMvxForAccount(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyGov {
        address _mvx = mvx;
        for (uint256 i = 0; i < _accounts.length; i++) {
            _stakeMvx(msg.sender, _accounts[i], _mvx, _amounts[i]);
        }
    }

    function stakeMvxForAccount(address _account, uint256 _amount) external nonReentrant onlyGov {
        _stakeMvx(msg.sender, _account, mvx, _amount);
    }

    function stakeMvx(uint256 _amount) external nonReentrant {
        _stakeMvx(msg.sender, msg.sender, mvx, _amount);
    }

    function stakeEsMvx(uint256 _amount) external nonReentrant {
        _stakeMvx(msg.sender, msg.sender, esMvx, _amount);
    }

    function unstakeMvx(uint256 _amount) external nonReentrant {
        _unstakeMvx(msg.sender, mvx, _amount, true);
    }

    function unstakeEsMvx(uint256 _amount) external nonReentrant {
        _unstakeMvx(msg.sender, esMvx, _amount, true);
    }

    function mintAndStakeMvlp(
        address _token,
        uint256 _amount,
        uint256 _minUsdm,
        uint256 _minMvlp
    ) external nonReentrant returns (uint256) {
        require(_amount > 0, "RewardRouter: invalid _amount");

        address account = msg.sender;
        uint256 mvlpAmount = IMvlpManager(mvlpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdm, _minMvlp);
        IRewardTracker(feeMvlpTracker).stakeForAccount(account, account, mvlp, mvlpAmount);
        IRewardTracker(stakedMvlpTracker).stakeForAccount(account, account, feeMvlpTracker, mvlpAmount);

        emit StakeMvlp(account, mvlpAmount);

        return mvlpAmount;
    }

    function mintAndStakeMvlpETH(uint256 _minUsdm, uint256 _minMvlp) external payable nonReentrant returns (uint256) {
        require(msg.value > 0, "RewardRouter: invalid msg.value");

        IWETH(weth).deposit{value: msg.value}();
        return _mintAndStakeMvlpETH(msg.value,_minUsdm, _minMvlp);
    }

    function _mintAndStakeMvlpETH(uint256 _amount,uint256 _minUsdm, uint256 _minMvlp) private returns (uint256) {
        require(_amount > 0, "RewardRouter: invalid _amount");

        IERC20(weth).approve(mvlpManager, _amount);

        address account = msg.sender;
        uint256 mvlpAmount = IMvlpManager(mvlpManager).addLiquidityForAccount(address(this), account, weth, _amount, _minUsdm, _minMvlp);

        IRewardTracker(feeMvlpTracker).stakeForAccount(account, account, mvlp, mvlpAmount);
        IRewardTracker(stakedMvlpTracker).stakeForAccount(account, account, feeMvlpTracker, mvlpAmount);

        emit StakeMvlp(account, mvlpAmount);

        return mvlpAmount;
    }

    function unstakeAndRedeemMvlp(
        address _tokenOut,
        uint256 _mvlpAmount,
        uint256 _minOut,
        address _receiver
    ) external nonReentrant returns (uint256) {
        require(_mvlpAmount > 0, "RewardRouter: invalid _mvlpAmount");

        address account = msg.sender;
        IRewardTracker(stakedMvlpTracker).unstakeForAccount(account, feeMvlpTracker, _mvlpAmount, account);
        IRewardTracker(feeMvlpTracker).unstakeForAccount(account, mvlp, _mvlpAmount, account);
        uint256 amountOut = IMvlpManager(mvlpManager).removeLiquidityForAccount(account, _tokenOut, _mvlpAmount, _minOut, _receiver);

        emit UnstakeMvlp(account, _mvlpAmount);

        return amountOut;
    }

    function unstakeAndRedeemMvlpETH(
        uint256 _mvlpAmount,
        uint256 _minOut,
        address payable _receiver
    ) external nonReentrant returns (uint256) {
        require(_mvlpAmount > 0, "RewardRouter: invalid _mvlpAmount");

        address account = msg.sender;
        IRewardTracker(stakedMvlpTracker).unstakeForAccount(account, feeMvlpTracker, _mvlpAmount, account);
        IRewardTracker(feeMvlpTracker).unstakeForAccount(account, mvlp, _mvlpAmount, account);
        uint256 amountOut = IMvlpManager(mvlpManager).removeLiquidityForAccount(account, weth, _mvlpAmount, _minOut, address(this));

        IWETH(weth).withdraw(amountOut);

        _receiver.sendValue(amountOut);

        emit UnstakeMvlp(account, _mvlpAmount);

        return amountOut;
    }

    function claim() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(feeMvxTracker).claimForAccount(account, account);
        IRewardTracker(feeMvlpTracker).claimForAccount(account, account);

        IRewardTracker(stakedMvxTracker).claimForAccount(account, account);
        IRewardTracker(stakedMvlpTracker).claimForAccount(account, account);
    }

    function claimEsMvx() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(stakedMvxTracker).claimForAccount(account, account);
        IRewardTracker(stakedMvlpTracker).claimForAccount(account, account);
    }

    function claimFees() external nonReentrant {
        address account = msg.sender;

        IRewardTracker(feeMvxTracker).claimForAccount(account, account);
        IRewardTracker(feeMvlpTracker).claimForAccount(account, account);
    }

    function compound() external nonReentrant {
        _compound(msg.sender);
    }

    function compoundForAccount(address _account) external nonReentrant onlyGov {
        _compound(_account);
    }

    function handleRewards(
        bool _shouldClaimMvx,
        bool _shouldStakeMvx,
        bool _shouldClaimEsMvx,
        bool _shouldStakeEsMvx,
        bool _shouldStakeMultiplierPoints,
        bool _shouldClaimWeth,
        bool _shouldConvertWethToEth,
        bool _shouldAddIntoMVLP,
        bool _shouldConvertMvxAndStake
    ) external nonReentrant returns (uint256 amountOut) {
        address account = msg.sender;

        uint256 mvxAmount = 0;
        if (_shouldClaimMvx) {
            uint256 mvxAmount0 = IVester(mvxVester).claimForAccount(account, account);
            uint256 mvxAmount1 = IVester(mvlpVester).claimForAccount(account, account);
            mvxAmount = mvxAmount0.add(mvxAmount1);
        }

        if (_shouldStakeMvx && mvxAmount > 0) {
            _stakeMvx(account, account, mvx, mvxAmount);
        }

        uint256 esMvxAmount = 0;
        if (_shouldClaimEsMvx) {
            uint256 esMvxAmount0 = IRewardTracker(stakedMvxTracker).claimForAccount(account, account);
            uint256 esMvxAmount1 = IRewardTracker(stakedMvlpTracker).claimForAccount(account, account);
            esMvxAmount = esMvxAmount0.add(esMvxAmount1);
        }

        if (_shouldStakeEsMvx && esMvxAmount > 0) {
            _stakeMvx(account, account, esMvx, esMvxAmount);
        }

        if (_shouldStakeMultiplierPoints) {
            uint256 bnMvxAmount = IRewardTracker(bonusMvxTracker).claimForAccount(account, account);
            if (bnMvxAmount > 0) {
                IRewardTracker(feeMvxTracker).stakeForAccount(account, account, bnMvx, bnMvxAmount);
            }
        }

        if (_shouldClaimWeth) {
            if (_shouldConvertWethToEth || _shouldAddIntoMVLP || _shouldConvertMvxAndStake) {
                uint256 weth0 = IRewardTracker(feeMvxTracker).claimForAccount(account, address(this));
                uint256 weth1 = IRewardTracker(feeMvlpTracker).claimForAccount(account, address(this));

                uint256 wethAmount = weth0.add(weth1);
                

                if(_shouldAddIntoMVLP){
                    amountOut = _mintAndStakeMvlpETH(wethAmount,0,0);
                }else if(_shouldConvertMvxAndStake){
                    //convert weth->usdc->mvx and stake

                    IERC20(weth).safeTransfer(vault, wethAmount);

                    //convert weth->usdc via vault
                    uint256 usdcAmountOut = IVault(vault).swap(weth, usdc, address(this));

                    //convert usdc->mvx via uniswap
                     uint256 mvxAmountOut = _swapExactInputSingle(usdcAmountOut);

                    if (mvxAmountOut > 0) {
                        TransferHelper.safeApprove(mvx, stakedMvxTracker, mvxAmountOut);
                        _stakeMvx(address(this), account, mvx, mvxAmountOut);
                        amountOut = mvxAmountOut;
                    }

                }else{
                    IWETH(weth).withdraw(wethAmount);
                    payable(account).sendValue(wethAmount);
                }
            } else {
                IRewardTracker(feeMvxTracker).claimForAccount(account, account);
                IRewardTracker(feeMvlpTracker).claimForAccount(account, account);
            }
        }
    }

    function _swapExactInputSingle(uint256 amountIn) private returns (uint256 amountOut) {
        TransferHelper.safeApprove(usdc, address(swapRouter), amountIn);

        ISwapRouter.ExactInputSingleParams memory params =
            ISwapRouter.ExactInputSingleParams({
                tokenIn: usdc,
                tokenOut: mvx,
                fee: MVX_USDC_POOL_FEE,
                recipient: address(this),
                deadline: block.timestamp,
                amountIn: amountIn,
                amountOutMinimum: 0,
                sqrtPriceLimitX96: 0
            });

        amountOut = swapRouter.exactInputSingle(params);
    }

    function batchCompoundForAccounts(address[] memory _accounts) external nonReentrant onlyGov {
        for (uint256 i = 0; i < _accounts.length; i++) {
            _compound(_accounts[i]);
        }
    }

    function signalTransfer(address _receiver) external nonReentrant {
        require(IERC20(mvxVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(mvlpVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");

        _validateReceiver(_receiver);
        pendingReceivers[msg.sender] = _receiver;
    }

    function acceptTransfer(address _sender) external nonReentrant {
        require(IERC20(mvxVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(mvlpVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");

        address receiver = msg.sender;
        require(pendingReceivers[_sender] == receiver, "RewardRouter: transfer not signalled");
        delete pendingReceivers[_sender];

        _validateReceiver(receiver);
        _compound(_sender);

        uint256 stakedMvx = IRewardTracker(stakedMvxTracker).depositBalances(_sender, mvx);
        if (stakedMvx > 0) {
            _unstakeMvx(_sender, mvx, stakedMvx, false);
            _stakeMvx(_sender, receiver, mvx, stakedMvx);
        }

        uint256 stakedEsMvx = IRewardTracker(stakedMvxTracker).depositBalances(_sender, esMvx);
        if (stakedEsMvx > 0) {
            _unstakeMvx(_sender, esMvx, stakedEsMvx, false);
            _stakeMvx(_sender, receiver, esMvx, stakedEsMvx);
        }

        uint256 stakedBnMvx = IRewardTracker(feeMvxTracker).depositBalances(_sender, bnMvx);
        if (stakedBnMvx > 0) {
            IRewardTracker(feeMvxTracker).unstakeForAccount(_sender, bnMvx, stakedBnMvx, _sender);
            IRewardTracker(feeMvxTracker).stakeForAccount(_sender, receiver, bnMvx, stakedBnMvx);
        }

        uint256 esMvxBalance = IERC20(esMvx).balanceOf(_sender);
        if (esMvxBalance > 0) {
            IERC20(esMvx).transferFrom(_sender, receiver, esMvxBalance);
        }

        uint256 mvlpAmount = IRewardTracker(feeMvlpTracker).depositBalances(_sender, mvlp);
        if (mvlpAmount > 0) {
            IRewardTracker(stakedMvlpTracker).unstakeForAccount(_sender, feeMvlpTracker, mvlpAmount, _sender);
            IRewardTracker(feeMvlpTracker).unstakeForAccount(_sender, mvlp, mvlpAmount, _sender);

            IRewardTracker(feeMvlpTracker).stakeForAccount(_sender, receiver, mvlp, mvlpAmount);
            IRewardTracker(stakedMvlpTracker).stakeForAccount(receiver, receiver, feeMvlpTracker, mvlpAmount);
        }

        IVester(mvxVester).transferStakeValues(_sender, receiver);
        IVester(mvlpVester).transferStakeValues(_sender, receiver);
    }

    function _validateReceiver(address _receiver) private view {
        require(IRewardTracker(stakedMvxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedMvxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(stakedMvxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedMvxTracker.cumulativeRewards > 0");

        require(IRewardTracker(bonusMvxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: bonusMvxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(bonusMvxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: bonusMvxTracker.cumulativeRewards > 0");

        require(IRewardTracker(feeMvxTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeMvxTracker.averageStakedAmounts > 0");
        require(IRewardTracker(feeMvxTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeMvxTracker.cumulativeRewards > 0");

        require(IVester(mvxVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: mvxVester.transferredAverageStakedAmounts > 0");
        require(IVester(mvxVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: mvxVester.transferredCumulativeRewards > 0");

        require(IRewardTracker(stakedMvlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: stakedMvlpTracker.averageStakedAmounts > 0");
        require(IRewardTracker(stakedMvlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: stakedMvlpTracker.cumulativeRewards > 0");

        require(IRewardTracker(feeMvlpTracker).averageStakedAmounts(_receiver) == 0, "RewardRouter: feeMvlpTracker.averageStakedAmounts > 0");
        require(IRewardTracker(feeMvlpTracker).cumulativeRewards(_receiver) == 0, "RewardRouter: feeMvlpTracker.cumulativeRewards > 0");

        require(IVester(mvlpVester).transferredAverageStakedAmounts(_receiver) == 0, "RewardRouter: mvxVester.transferredAverageStakedAmounts > 0");
        require(IVester(mvlpVester).transferredCumulativeRewards(_receiver) == 0, "RewardRouter: mvxVester.transferredCumulativeRewards > 0");

        require(IERC20(mvxVester).balanceOf(_receiver) == 0, "RewardRouter: mvxVester.balance > 0");
        require(IERC20(mvlpVester).balanceOf(_receiver) == 0, "RewardRouter: mvlpVester.balance > 0");
    }

    function _compound(address _account) private {
        _compoundMvx(_account);
        _compoundMvlp(_account);
    }

    function _compoundMvx(address _account) private {
        uint256 esMvxAmount = IRewardTracker(stakedMvxTracker).claimForAccount(_account, _account);
        if (esMvxAmount > 0) {
            _stakeMvx(_account, _account, esMvx, esMvxAmount);
        }

        uint256 bnMvxAmount = IRewardTracker(bonusMvxTracker).claimForAccount(_account, _account);
        if (bnMvxAmount > 0) {
            IRewardTracker(feeMvxTracker).stakeForAccount(_account, _account, bnMvx, bnMvxAmount);
        }
    }

    function _compoundMvlp(address _account) private {
        uint256 esMvxAmount = IRewardTracker(stakedMvlpTracker).claimForAccount(_account, _account);
        if (esMvxAmount > 0) {
            _stakeMvx(_account, _account, esMvx, esMvxAmount);
        }
    }

    function _stakeMvx(
        address _fundingAccount,
        address _account,
        address _token,
        uint256 _amount
    ) private {
        require(_amount > 0, "RewardRouter: invalid _amount");

        IRewardTracker(stakedMvxTracker).stakeForAccount(_fundingAccount, _account, _token, _amount);
        IRewardTracker(bonusMvxTracker).stakeForAccount(_account, _account, stakedMvxTracker, _amount);
        IRewardTracker(feeMvxTracker).stakeForAccount(_account, _account, bonusMvxTracker, _amount);

        emit StakeMvx(_account, _token, _amount);
    }

    function _unstakeMvx(
        address _account,
        address _token,
        uint256 _amount,
        bool _shouldReduceBnMvx
    ) private {
        require(_amount > 0, "RewardRouter: invalid _amount");

        uint256 balance = IRewardTracker(stakedMvxTracker).stakedAmounts(_account);

        IRewardTracker(feeMvxTracker).unstakeForAccount(_account, bonusMvxTracker, _amount, _account);
        IRewardTracker(bonusMvxTracker).unstakeForAccount(_account, stakedMvxTracker, _amount, _account);
        IRewardTracker(stakedMvxTracker).unstakeForAccount(_account, _token, _amount, _account);

        if (_shouldReduceBnMvx) {
            uint256 bnMvxAmount = IRewardTracker(bonusMvxTracker).claimForAccount(_account, _account);
            if (bnMvxAmount > 0) {
                IRewardTracker(feeMvxTracker).stakeForAccount(_account, _account, bnMvx, bnMvxAmount);
            }

            uint256 stakedBnMvx = IRewardTracker(feeMvxTracker).depositBalances(_account, bnMvx);
            if (stakedBnMvx > 0) {
                uint256 reductionAmount = stakedBnMvx.mul(_amount).div(balance);
                IRewardTracker(feeMvxTracker).unstakeForAccount(_account, bnMvx, reductionAmount, _account);
                IMintable(bnMvx).burn(_account, reductionAmount);
            }
        }

        emit UnstakeMvx(_account, _token, _amount);
    }
}

File 2 of 17 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

File 3 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 17 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

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 5 of 17 : TransferHelper.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0;

import "./IERC20.sol";

library TransferHelper {
    /// @notice Transfers tokens from the targeted address to the given destination
    /// @notice Errors with 'STF' if transfer fails
    /// @param token The contract address of the token to be transferred
    /// @param from The originating address from which the tokens will be transferred
    /// @param to The destination address of the transfer
    /// @param value The amount to be transferred
    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) =
            token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "STF");
    }

    /// @notice Transfers tokens from msg.sender to a recipient
    /// @dev Errors with ST if transfer fails
    /// @param token The contract address of the token which will be transferred
    /// @param to The recipient of the transfer
    /// @param value The value of the transfer
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "ST");
    }

    /// @notice Approves the stipulated contract to spend the given allowance in the given token
    /// @dev Errors with 'SA' if transfer fails
    /// @param token The contract address of the token to be approved
    /// @param to The target of the approval
    /// @param value The amount of the given token the target will be allowed to spend
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "SA");
    }

    /// @notice Transfers ETH to the recipient address
    /// @dev Fails with `STE`
    /// @param to The destination of the transfer
    /// @param value The value to be transferred
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "STE");
    }
}

File 6 of 17 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 7 of 17 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.12;

/**
 * @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 8 of 17 : IRewardTracker.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IRewardTracker {
    function depositBalances(address _account, address _depositToken) external view returns (uint256);
    function stakedAmounts(address _account) external view returns (uint256);
    function updateRewards() external;
    function stake(address _depositToken, uint256 _amount) external;
    function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external;
    function unstake(address _depositToken, uint256 _amount) external;
    function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external;
    function tokensPerInterval() external view returns (uint256);
    function claim(address _receiver) external returns (uint256);
    function claimForAccount(address _account, address _receiver) external returns (uint256);
    function claimable(address _account) external view returns (uint256);
    function averageStakedAmounts(address _account) external view returns (uint256);
    function cumulativeRewards(address _account) external view returns (uint256);
}

File 9 of 17 : IVester.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IVester {
    function rewardTracker() external view returns (address);

    function claimForAccount(address _account, address _receiver) external returns (uint256);

    function claimable(address _account) external view returns (uint256);
    function cumulativeClaimAmounts(address _account) external view returns (uint256);
    function claimedAmounts(address _account) external view returns (uint256);
    function pairAmounts(address _account) external view returns (uint256);
    function getVestedAmount(address _account) external view returns (uint256);
    function transferredAverageStakedAmounts(address _account) external view returns (uint256);
    function transferredCumulativeRewards(address _account) external view returns (uint256);
    function cumulativeRewardDeductions(address _account) external view returns (uint256);
    function bonusRewards(address _account) external view returns (uint256);

    function transferStakeValues(address _sender, address _receiver) external;
    function setTransferredAverageStakedAmounts(address _account, uint256 _amount) external;
    function setTransferredCumulativeRewards(address _account, uint256 _amount) external;
    function setCumulativeRewardDeductions(address _account, uint256 _amount) external;
    function setBonusRewards(address _account, uint256 _amount) external;

    function getMaxVestableAmount(address _account) external view returns (uint256);
    function getCombinedAverageStakedAmount(address _account) external view returns (uint256);
}

File 10 of 17 : IMintable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IMintable {
    function isMinter(address _account) external returns (bool);
    function setMinter(address _minter, bool _isActive) external;
    function mint(address _account, uint256 _amount) external;
    function burn(address _account, uint256 _amount) external;
}

File 11 of 17 : IWETH.sol
//SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 12 of 17 : IMvlpManager.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IMvlpManager {
    function cooldownDuration() external returns (uint256);

    function lastAddedAt(address _account) external returns (uint256);

    function addLiquidity(
        address _token,
        uint256 _amount,
        uint256 _minUsdm,
        uint256 _minMvlp
    ) external returns (uint256);

    function addLiquidityForAccount(
        address _fundingAccount,
        address _account,
        address _token,
        uint256 _amount,
        uint256 _minUsdm,
        uint256 _minMvlp
    ) external returns (uint256);

    function removeLiquidity(
        address _tokenOut,
        uint256 _mvlpAmount,
        uint256 _minOut,
        address _receiver
    ) external returns (uint256);

    function removeLiquidityForAccount(
        address _account,
        address _tokenOut,
        uint256 _mvlpAmount,
        uint256 _minOut,
        address _receiver
    ) external returns (uint256);
}

File 13 of 17 : IVault.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "./IVaultUtils.sol";

interface IVault {
    function isInitialized() external view returns (bool);

    function isSwapEnabled() external view returns (bool);

    function isLeverageEnabled() external view returns (bool);

    function setVaultUtils(IVaultUtils _vaultUtils) external;

    function setError(uint256 _errorCode, string calldata _error) external;

    function router() external view returns (address);

    function usdm() external view returns (address);

    function gov() external view returns (address);

    function whitelistedTokenCount() external view returns (uint256);

    function maxLeverage() external view returns (uint256);

    function minProfitTime() external view returns (uint256);

    function hasDynamicFees() external view returns (bool);

    function fundingInterval() external view returns (uint256);

    function totalTokenWeights() external view returns (uint256);

    function getTargetUsdmAmount(address _token) external view returns (uint256);

    function inManagerMode() external view returns (bool);

    function inPrivateLiquidationMode() external view returns (bool);

    function maxGasPrice() external view returns (uint256);

    function approvedRouters(address _account, address _router) external view returns (bool);

    function isLiquidator(address _account) external view returns (bool);

    function isManager(address _account) external view returns (bool);

    function minProfitBasisPoints(address _token) external view returns (uint256);

    function tokenBalances(address _token) external view returns (uint256);

    function lastFundingTimes(address _token) external view returns (uint256);

    function setMaxLeverage(uint256 _maxLeverage) external;

    function setInManagerMode(bool _inManagerMode) external;

    function setManager(address _manager, bool _isManager) external;

    function setIsSwapEnabled(bool _isSwapEnabled) external;

    function setIsLeverageEnabled(bool _isLeverageEnabled) external;

    function setMaxGasPrice(uint256 _maxGasPrice) external;

    function setUsdmAmount(address _token, uint256 _amount) external;

    function setBufferAmount(address _token, uint256 _amount) external;

    function setMaxGlobalShortSize(address _token, uint256 _amount) external;

    function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;

    function setLiquidator(address _liquidator, bool _isActive) external;

    function setFundingRate(
        uint256 _fundingInterval,
        uint256 _fundingRateFactor,
        uint256 _stableFundingRateFactor
    ) external;

    function setFees(
        uint256 _taxBasisPoints,
        uint256 _stableTaxBasisPoints,
        uint256 _mintBurnFeeBasisPoints,
        uint256 _swapFeeBasisPoints,
        uint256 _stableSwapFeeBasisPoints,
        uint256 _marginFeeBasisPoints,
        uint256 _liquidationFeeUsd,
        uint256 _minProfitTime,
        bool _hasDynamicFees
    ) external;

    function setTokenConfig(
        address _token,
        uint256 _tokenDecimals,
        uint256 _redemptionBps,
        uint256 _minProfitBps,
        uint256 _maxUsdmAmount,
        bool _isStable,
        bool _isShortable
    ) external;

    function setPriceFeed(address _priceFeed) external;

    function withdrawFees(address _token, address _receiver) external returns (uint256);

    function directPoolDeposit(address _token) external;

    function buyUSDM(address _token, address _receiver) external returns (uint256);

    function sellUSDM(address _token, address _receiver) external returns (uint256);

    function swap(
        address _tokenIn,
        address _tokenOut,
        address _receiver
    ) external returns (uint256);

    function increasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _sizeDelta,
        bool _isLong
    ) external;

    function decreasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _collateralDelta,
        uint256 _sizeDelta,
        bool _isLong,
        address _receiver
    ) external returns (uint256);

    function liquidatePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        address _feeReceiver
    ) external;

    function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);

    function priceFeed() external view returns (address);

    function fundingRateFactor() external view returns (uint256);

    function stableFundingRateFactor() external view returns (uint256);

    function cumulativeFundingRates(address _token) external view returns (uint256);

    function getNextFundingRate(address _token) external view returns (uint256);

    function getFeeBasisPoints(
        address _token,
        uint256 _usdmDelta,
        uint256 _feeBasisPoints,
        uint256 _taxBasisPoints,
        bool _increment
    ) external view returns (uint256);

    function liquidationFeeUsd() external view returns (uint256);

    function taxBasisPoints() external view returns (uint256);

    function stableTaxBasisPoints() external view returns (uint256);

    function mintBurnFeeBasisPoints() external view returns (uint256);

    function swapFeeBasisPoints() external view returns (uint256);

    function stableSwapFeeBasisPoints() external view returns (uint256);

    function marginFeeBasisPoints() external view returns (uint256);

    function allWhitelistedTokensLength() external view returns (uint256);

    function allWhitelistedTokens(uint256) external view returns (address);

    function whitelistedTokens(address _token) external view returns (bool);

    function stableTokens(address _token) external view returns (bool);

    function shortableTokens(address _token) external view returns (bool);

    function feeReserves(address _token) external view returns (uint256);

    function globalShortSizes(address _token) external view returns (uint256);

    function globalShortAveragePrices(address _token) external view returns (uint256);

    function maxGlobalShortSizes(address _token) external view returns (uint256);

    function tokenDecimals(address _token) external view returns (uint256);

    function tokenWeights(address _token) external view returns (uint256);

    function guaranteedUsd(address _token) external view returns (uint256);

    function poolAmounts(address _token) external view returns (uint256);

    function bufferAmounts(address _token) external view returns (uint256);

    function reservedAmounts(address _token) external view returns (uint256);

    function usdmAmounts(address _token) external view returns (uint256);

    function maxUsdmAmounts(address _token) external view returns (uint256);

    function getRedemptionAmount(address _token, uint256 _usdmAmount) external view returns (uint256);

    function getMaxPrice(address _token) external view returns (uint256);

    function getMinPrice(address _token) external view returns (uint256);

    function getDelta(
        address _indexToken,
        uint256 _size,
        uint256 _averagePrice,
        bool _isLong,
        uint256 _lastIncreasedTime
    ) external view returns (bool, uint256);

    function getPosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong
    )
        external
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            bool,
            uint256
        );
}

File 14 of 17 : Governable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

contract Governable {
    address public gov;

    constructor() public {
        gov = msg.sender;
    }

    modifier onlyGov() {
        require(msg.sender == gov, "Governable: forbidden");
        _;
    }

    function setGov(address _gov) external onlyGov {
        gov = _gov;
    }
}

File 15 of 17 : ISwapRouter.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./IUniswapV3SwapCallback.sol";

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);

    struct ExactOutputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);

    struct ExactOutputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountOut;
        uint256 amountInMaximum;
    }

    /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
    /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
    /// @return amountIn The amount of the input token
    function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}

File 16 of 17 : IVaultUtils.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IVaultUtils {
    function updateCumulativeFundingRate(
        address _collateralToken,
        address _indexToken
    ) external returns (bool);

    function validateIncreasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _sizeDelta,
        bool _isLong
    ) external view;

    function validateDecreasePosition(
        address _account,
        address _collateralToken,
        address _indexToken,
        uint256 _collateralDelta,
        uint256 _sizeDelta,
        bool _isLong,
        address _receiver
    ) external view;

    function validateLiquidation(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        bool _raise
    ) external view returns (uint256, uint256);

    function getEntryFundingRate(
        address _collateralToken,
        address _indexToken,
        bool _isLong
    ) external view returns (uint256);

    function getPositionFee(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        uint256 _sizeDelta
    ) external view returns (uint256);

    function getFundingFee(
        address _account,
        address _collateralToken,
        address _indexToken,
        bool _isLong,
        uint256 _size,
        uint256 _entryFundingRate
    ) external view returns (uint256);

    function getBuyUsdmFeeBasisPoints(address _token, uint256 _usdmAmount)
        external
        view
        returns (uint256);

    function getSellUsdmFeeBasisPoints(address _token, uint256 _usdmAmount)
        external
        view
        returns (uint256);

    function getSwapFeeBasisPoints(
        address _tokenIn,
        address _tokenOut,
        uint256 _usdmAmount
    ) external view returns (uint256);

    function getFeeBasisPoints(
        address _token,
        uint256 _usdmDelta,
        uint256 _feeBasisPoints,
        uint256 _taxBasisPoints,
        bool _increment
    ) external view returns (uint256);
}

File 17 of 17 : IUniswapV3SwapCallback.sol
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;

/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
    /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
    /// @dev In the implementation you must pay the pool tokens owed for the swap.
    /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
    /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
    /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
    /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
    /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
    /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
    function uniswapV3SwapCallback(
        int256 amount0Delta,
        int256 amount1Delta,
        bytes calldata data
    ) external;
}

Settings
{
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_mvx","type":"address"},{"internalType":"address","name":"_esMvx","type":"address"},{"internalType":"address","name":"_bnMvx","type":"address"},{"internalType":"address","name":"_mvlp","type":"address"},{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeMvlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeMvx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeMvlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeMvx","type":"event"},{"inputs":[],"name":"MVX_USDC_POOL_FEE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"acceptTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"batchCompoundForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchStakeMvxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bnMvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusMvxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsMvx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"compoundForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"esMvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMvlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeMvxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimMvx","type":"bool"},{"internalType":"bool","name":"_shouldStakeMvx","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsMvx","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsMvx","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimWeth","type":"bool"},{"internalType":"bool","name":"_shouldConvertWethToEth","type":"bool"},{"internalType":"bool","name":"_shouldAddIntoMVLP","type":"bool"},{"internalType":"bool","name":"_shouldConvertMvxAndStake","type":"bool"}],"name":"handleRewards","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakedMvxTracker","type":"address"},{"internalType":"address","name":"_bonusMvxTracker","type":"address"},{"internalType":"address","name":"_feeMvxTracker","type":"address"},{"internalType":"address","name":"_feeMvlpTracker","type":"address"},{"internalType":"address","name":"_stakedMvlpTracker","type":"address"},{"internalType":"address","name":"_mvlpManager","type":"address"},{"internalType":"address","name":"_mvxVester","type":"address"},{"internalType":"address","name":"_mvlpVester","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdm","type":"uint256"},{"internalType":"uint256","name":"_minMvlp","type":"uint256"}],"name":"mintAndStakeMvlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdm","type":"uint256"},{"internalType":"uint256","name":"_minMvlp","type":"uint256"}],"name":"mintAndStakeMvlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mvlp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mvlpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mvlpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mvx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mvxVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReceivers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"signalTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsMvx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeMvx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeMvxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedMvlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedMvxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_mvlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemMvlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mvlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemMvlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsMvx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeMvx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162005663380380620056638339810160408190526200003491620000f3565b600160008190558054336001600160a01b03199182161790915560609890981b6001600160601b0319166080526002805489166001600160a01b03988916179055600580548916968816969096179095556006805488169487169490941790935560078054871692861692909217909155600880548616918516919091179055600480548516918416919091179055600380549093169116179055620001a2565b80516001600160a01b0381168114620000ed57600080fd5b92915050565b600080600080600080600080610100898b03121562000110578384fd5b6200011c8a8a620000d5565b97506200012d8a60208b01620000d5565b96506200013e8a60408b01620000d5565b95506200014f8a60608b01620000d5565b9450620001608a60808b01620000d5565b9350620001718a60a08b01620000d5565b9250620001828a60c08b01620000d5565b9150620001938a60e08b01620000d5565b90509295985092959890939650565b60805160601c615499620001ca600039806123a15280612f4c5280612fd852506154996000f3fe6080604052600436106102555760003560e01c8063655603a411610139578063d294f093116100b6578063ebe1b08c1161007a578063ebe1b08c14610673578063ef9aacfd14610688578063f69786df146106a8578063f69e2046146106bd578063f963ba68146106d2578063fbfa77cf146106f25761028f565b8063d294f093146105f4578063dc1e316414610609578063e1b9db8914610629578063e616254914610649578063eb81fabf1461065e5761028f565b80638a29e2de116100fd5780638a29e2de1461056a57806390ee4ce71461058a578063c31c9c071461059f578063cfad57a2146105b4578063cfe623e5146105d45761028f565b8063655603a4146104d557806377a83086146104f55780637ca2577914610515578063877d5ffc14610535578063878a068a146105555761028f565b80633b873237116101d2578063447f0bc911610196578063447f0bc91461044e57806346156a5e146104635780634c19b6ce146104765780634e71d92d1461048b5780634fbb6103146104a057806362e20739146104b55761028f565b80633b873237146103cf5780633e413bee146103ef5780633f4b8f3d146104045780633fc8cef31461042457806342a19ca2146104395761028f565b80631af276a6116102195780631af276a61461032b5780631fdcbc481461034b57806326425f56146103785780632a9f40831461038d578063392e53cd146103ad5761028f565b8063018e84911461029457806301e33667146102bf5780630af5db5a146102df57806312d43a511461030157806318a42040146103165761028f565b3661028f576002546001600160a01b0316331461028d5760405162461bcd60e51b815260040161028490614ba6565b60405180910390fd5b005b600080fd5b3480156102a057600080fd5b506102a9610707565b6040516102b691906153d9565b60405180910390f35b3480156102cb57600080fd5b5061028d6102da3660046145ec565b61070d565b3480156102eb57600080fd5b506102f4610750565b6040516102b69190614952565b34801561030d57600080fd5b506102f461075f565b34801561032257600080fd5b506102f461076e565b34801561033757600080fd5b5061028d6103463660046146da565b61077d565b34801561035757600080fd5b5061036b610366366004614657565b610808565b6040516102b691906153e9565b34801561038457600080fd5b506102f46109fe565b34801561039957600080fd5b5061028d6103a8366004614528565b610a0d565b3480156103b957600080fd5b506103c2610a70565b6040516102b69190614a9e565b3480156103db57600080fd5b5061036b6103ea3660046148ee565b610a80565b3480156103fb57600080fd5b506102f4610cee565b34801561041057600080fd5b5061036b61041f3660046147e2565b610cfd565b34801561043057600080fd5b506102f46114d1565b34801561044557600080fd5b506102f46114e0565b34801561045a57600080fd5b506102f46114ef565b61036b6104713660046148cd565b6114fe565b34801561048257600080fd5b506102f46115c5565b34801561049757600080fd5b5061028d6115d4565b3480156104ac57600080fd5b506102f461180f565b3480156104c157600080fd5b5061028d6104d036600461489d565b61181e565b3480156104e157600080fd5b5061028d6104f0366004614528565b611860565b34801561050157600080fd5b5061028d61051036600461489d565b61214f565b34801561052157600080fd5b5061028d61053036600461462c565b612191565b34801561054157600080fd5b5061028d61055036600461489d565b6121fd565b34801561056157600080fd5b5061028d61223f565b34801561057657600080fd5b5061028d610585366004614544565b612299565b34801561059657600080fd5b506102f4612390565b3480156105ab57600080fd5b506102f461239f565b3480156105c057600080fd5b5061028d6105cf366004614528565b6123c3565b3480156105e057600080fd5b5061028d6105ef36600461489d565b61240f565b34801561060057600080fd5b5061028d612451565b34801561061557600080fd5b5061028d61062436600461470d565b612530565b34801561063557600080fd5b506102f4610644366004614528565b6125df565b34801561065557600080fd5b506102f46125fa565b34801561066a57600080fd5b506102f4612609565b34801561067f57600080fd5b506102f4612618565b34801561069457600080fd5b5061028d6106a3366004614528565b612627565b3480156106b457600080fd5b506102f46127c6565b3480156106c957600080fd5b5061028d6127d5565b3480156106de57600080fd5b5061036b6106ed3660046146a0565b61280d565b3480156106fe57600080fd5b506102f46129f2565b61271081565b6001546001600160a01b031633146107375760405162461bcd60e51b815260040161028490614f4c565b61074b6001600160a01b0384168383612a01565b505050565b600b546001600160a01b031681565b6001546001600160a01b031681565b6009546001600160a01b031681565b600260005414156107a05760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146107cf5760405162461bcd60e51b815260040161028490614f4c565b60005b81518110156107ff576107f78282815181106107ea57fe5b6020026020010151612a57565b6001016107d2565b50506001600055565b60006002600054141561082d5760405162461bcd60e51b8152600401610284906152d8565b60026000558361084f5760405162461bcd60e51b815260040161028490615297565b600c54600d5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d9261088a92869216908a908390600401614a2a565b600060405180830381600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506108f592869216908a908390600401614a2a565b600060405180830381600087803b15801561090f57600080fd5b505af1158015610923573d6000803e3d6000fd5b5050600e546040516371d597ad60e01b8152600093506001600160a01b0390911691506371d597ad906109629085908b908b908b908b90600401614a55565b602060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b491906148b5565b90507ff684faf593dafe878a9fdccfb0b06ed0463d9a5350c68300efcd3da6113820eb82876040516109e7929190614a85565b60405180910390a160016000559695505050505050565b6010546001600160a01b031681565b60026000541415610a305760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b03163314610a5f5760405162461bcd60e51b815260040161028490614f4c565b610a6881612a57565b506001600055565b600154600160a01b900460ff1681565b600060026000541415610aa55760405162461bcd60e51b8152600401610284906152d8565b600260005583610ac75760405162461bcd60e51b815260040161028490615297565b600c54600d5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d92610b0292869216908a908390600401614a2a565b600060405180830381600087803b158015610b1c57600080fd5b505af1158015610b30573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350610b6d92869216908a908390600401614a2a565b600060405180830381600087803b158015610b8757600080fd5b505af1158015610b9b573d6000803e3d6000fd5b5050600e546002546040516371d597ad60e01b8152600094506001600160a01b0392831693506371d597ad92610bde9287929116908b908b903090600401614a55565b602060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3091906148b5565b600254604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90610c619084906004016153e9565b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b50610ca7925050506001600160a01b03851682612a6c565b7ff684faf593dafe878a9fdccfb0b06ed0463d9a5350c68300efcd3da6113820eb8287604051610cd8929190614a85565b60405180910390a1600160005595945050505050565b6004546001600160a01b031681565b600060026000541415610d225760405162461bcd60e51b8152600401610284906152d8565b6002600090815533908b15610e5157600f546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610d64908690819060040161499f565b602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906148b5565b6010546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610dee908790819060040161499f565b602060405180830381600087803b158015610e0857600080fd5b505af1158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4091906148b5565b9050610e4c8282612b08565b925050505b8a8015610e5e5750600081115b15610e7d57600554610e7d90839081906001600160a01b031684612b36565b60008a15610fa5576009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610eb8908790819060040161499f565b602060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a91906148b5565b600c546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610f42908890819060040161499f565b602060405180830381600087803b158015610f5c57600080fd5b505af1158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9491906148b5565b9050610fa08282612b08565b925050505b898015610fb25750600081115b15610fd157600654610fd190849081906001600160a01b031684612b36565b88156110d257600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061100a908790819060040161499f565b602060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c91906148b5565b905080156110d057600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c9261109d9289928392169087906004016149dc565b600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b505050505b505b87156114bc5786806110e15750855b806110e95750845b156113b157600b546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90611121908790309060040161499f565b602060405180830381600087803b15801561113b57600080fd5b505af115801561114f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117391906148b5565b600d546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a906111ab908890309060040161499f565b602060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd91906148b5565b9050600061120b8383612b08565b905088156112265761121f81600080612cd7565b96506113a9565b871561133357600354600254611249916001600160a01b03918216911683612a01565b60035460025460048054604051634998b10960e11b81526000946001600160a01b039081169463933162129461128a949183169391909216913091016149b9565b602060405180830381600087803b1580156112a457600080fd5b505af11580156112b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dc91906148b5565b905060006112e982612f37565b9050801561132c5760055460095461130e916001600160a01b0390811691168361305d565b6005546113289030908a906001600160a01b031684612b36565b8098505b50506113a9565b600254604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906113639084906004016153e9565b600060405180830381600087803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b506113a9925050506001600160a01b03871682612a6c565b5050506114bc565b600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906113e3908690819060040161499f565b602060405180830381600087803b1580156113fd57600080fd5b505af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143591906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611468908690819060040161499f565b602060405180830381600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba91906148b5565b505b50506001600055509998505050505050505050565b6002546001600160a01b031681565b6007546001600160a01b031681565b600c546001600160a01b031681565b6000600260005414156115235760405162461bcd60e51b8152600401610284906152d8565b6002600055346115455760405162461bcd60e51b815260040161028490614ca7565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b50505050506115b9348484612cd7565b60016000559392505050565b6006546001600160a01b031681565b600260005414156115f75760405162461bcd60e51b8152600401610284906152d8565b6002600055600b546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a9061162e908490819060040161499f565b602060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168091906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906116b3908490819060040161499f565b602060405180830381600087803b1580156116cd57600080fd5b505af11580156116e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170591906148b5565b506009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611738908490819060040161499f565b602060405180830381600087803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906148b5565b50600c546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906117bd908490819060040161499f565b602060405180830381600087803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906148b5565b600d546001600160a01b031681565b600260005414156118415760405162461bcd60e51b8152600401610284906152d8565b6002600055600654610a6890339081906001600160a01b031684612b36565b600260005414156118835760405162461bcd60e51b8152600401610284906152d8565b6002600055600f546040516370a0823160e01b81526001600160a01b03909116906370a08231906118b8908490600401614952565b60206040518083038186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190891906148b5565b156119255760405162461bcd60e51b815260040161028490614bd6565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190611955908490600401614952565b60206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a591906148b5565b156119c25760405162461bcd60e51b815260040161028490614bd6565b6001600160a01b0381811660009081526011602052604090205433911681146119fd5760405162461bcd60e51b815260040161028490614f08565b6001600160a01b038216600090815260116020526040902080546001600160a01b0319169055611a2c81613153565b611a3582612a57565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611a6d928892169060040161499f565b60206040518083038186803b158015611a8557600080fd5b505afa158015611a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abd91906148b5565b90508015611af957600554611adf9084906001600160a01b0316836000613b23565b600554611af990849084906001600160a01b031684612b36565b600954600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611b31928992169060040161499f565b60206040518083038186803b158015611b4957600080fd5b505afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906148b5565b90508015611bbd57600654611ba39085906001600160a01b0316836000613b23565b600654611bbd90859085906001600160a01b031684612b36565b600b54600754604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611bf5928a92169060040161499f565b60206040518083038186803b158015611c0d57600080fd5b505afa158015611c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4591906148b5565b90508015611d2757600b5460075460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611c88928a929091169086908390600401614a2a565b600060405180830381600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b5050600b54600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611cf4928a928a9291169087906004016149dc565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b505050505b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611d58908990600401614952565b60206040518083038186803b158015611d7057600080fd5b505afa158015611d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da891906148b5565b90508015611e38576006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611de490899089908690600401614a06565b602060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3691906147c6565b505b600d54600854604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611e70928c92169060040161499f565b60206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec091906148b5565b9050801561207957600c54600d5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611f03928c929091169086908390600401614a2a565b600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611f6e928c92169086908390600401614a2a565b600060405180830381600087803b158015611f8857600080fd5b505af1158015611f9c573d6000803e3d6000fd5b5050600d54600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611fda928c928c9291169087906004016149dc565b600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612046928b92839291169087906004016149dc565b600060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b505050505b600f54604051630f713c2360e41b81526001600160a01b039091169063f713c230906120ab908a908a9060040161499f565b600060405180830381600087803b1580156120c557600080fd5b505af11580156120d9573d6000803e3d6000fd5b5050601054604051630f713c2360e41b81526001600160a01b03909116925063f713c230915061210f908a908a9060040161499f565b600060405180830381600087803b15801561212957600080fd5b505af115801561213d573d6000803e3d6000fd5b50506001600055505050505050505050565b600260005414156121725760405162461bcd60e51b8152600401610284906152d8565b6002600055600554610a6890339081906001600160a01b031684612b36565b600260005414156121b45760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146121e35760405162461bcd60e51b815260040161028490614f4c565b6005546107ff90339084906001600160a01b031684612b36565b600260005414156122205760405162461bcd60e51b8152600401610284906152d8565b6002600055600654610a689033906001600160a01b0316836001613b23565b600260005414156122625760405162461bcd60e51b8152600401610284906152d8565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90611738908490819060040161499f565b6001546001600160a01b031633146122c35760405162461bcd60e51b815260040161028490614f4c565b600154600160a01b900460ff16156122ed5760405162461bcd60e51b815260040161028490614d8c565b60018054600160a01b60ff60a01b19909116179055600980546001600160a01b03199081166001600160a01b039a8b1617909155600a80548216988a1698909817909755600b8054881696891696909617909555600d8054871694881694909417909355600c8054861692871692909217909155600e80548516918616919091179055600f80548416918516919091179055601080549092169216919091179055565b600f546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546001600160a01b031633146123ed5760405162461bcd60e51b815260040161028490614f4c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156124325760405162461bcd60e51b8152600401610284906152d8565b6002600055600554610a689033906001600160a01b0316836001613b23565b600260005414156124745760405162461bcd60e51b8152600401610284906152d8565b6002600055600b546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906124ab908490819060040161499f565b602060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd91906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906117bd908490819060040161499f565b600260005414156125535760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146125825760405162461bcd60e51b815260040161028490614f4c565b6005546001600160a01b031660005b83518110156125d4576125cc338583815181106125aa57fe5b6020026020010151848685815181106125bf57fe5b6020026020010151612b36565b600101612591565b505060016000555050565b6011602052600090815260409020546001600160a01b031681565b600e546001600160a01b031681565b6005546001600160a01b031681565b6008546001600160a01b031681565b6002600054141561264a5760405162461bcd60e51b8152600401610284906152d8565b6002600055600f546040516370a0823160e01b81526001600160a01b03909116906370a082319061267f903390600401614952565b60206040518083038186803b15801561269757600080fd5b505afa1580156126ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cf91906148b5565b156126ec5760405162461bcd60e51b815260040161028490614bd6565b6010546040516370a0823160e01b81526001600160a01b03909116906370a082319061271c903390600401614952565b60206040518083038186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c91906148b5565b156127895760405162461bcd60e51b815260040161028490614bd6565b61279281613153565b33600090815260116020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b600a546001600160a01b031681565b600260005414156127f85760405162461bcd60e51b8152600401610284906152d8565b600260005561280633612a57565b6001600055565b6000600260005414156128325760405162461bcd60e51b8152600401610284906152d8565b6002600055836128545760405162461bcd60e51b815260040161028490614ed1565b600e546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061289390859081908c908c908c908c90600401614966565b602060405180830381600087803b1580156128ad57600080fd5b505af11580156128c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e591906148b5565b600d54600854604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c9261292392879283929091169087906004016149dc565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061298f928792839291169087906004016149dc565b600060405180830381600087803b1580156129a957600080fd5b505af11580156129bd573d6000803e3d6000fd5b505050507ffce3ee85e2e412ef09992db90b048aff7ae30eb1013ba5b9ab3d8604d2336d4982826040516109e7929190614a85565b6003546001600160a01b031681565b61074b8363a9059cbb60e01b8484604051602401612a20929190614a85565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613fc5565b612a6081614054565b612a69816141f8565b50565b80471015612a8c5760405162461bcd60e51b815260040161028490614dcd565b6000826001600160a01b031682604051612aa59061494f565b60006040518083038185875af1925050503d8060008114612ae2576040519150601f19603f3d011682016040523d82523d6000602084013e612ae7565b606091505b505090508061074b5760405162461bcd60e51b815260040161028490614cde565b600082820183811015612b2d5760405162461bcd60e51b815260040161028490614c1c565b90505b92915050565b60008111612b565760405162461bcd60e51b815260040161028490614ed1565b600954604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c90612b8c9087908790879087906004016149dc565b600060405180830381600087803b158015612ba657600080fd5b505af1158015612bba573d6000803e3d6000fd5b5050600a54600954604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612bf8928892839291169087906004016149dc565b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b5050600b54600a54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612c64928892839291169087906004016149dc565b600060405180830381600087803b158015612c7e57600080fd5b505af1158015612c92573d6000803e3d6000fd5b505050507fa69efa6d0ae966c7903f49691b8d8e4ae5cb51adb92e07d0ee4438dc7fddb583838383604051612cc993929190614a06565b60405180910390a150505050565b6000808411612cf85760405162461bcd60e51b815260040161028490614ed1565b600254600e5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612d2e929116908890600401614a85565b602060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8091906147c6565b50600e546002546040516317eb2a1560e01b815233926000926001600160a01b03918216926317eb2a1592612dc59230928892909116908c908c908c90600401614966565b602060405180830381600087803b158015612ddf57600080fd5b505af1158015612df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1791906148b5565b600d54600854604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c92612e5592879283929091169087906004016149dc565b600060405180830381600087803b158015612e6f57600080fd5b505af1158015612e83573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612ec1928792839291169087906004016149dc565b600060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050507ffce3ee85e2e412ef09992db90b048aff7ae30eb1013ba5b9ab3d8604d2336d498282604051612f24929190614a85565b60405180910390a19150505b9392505050565b600454600090612f71906001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000008461305d565b612f7961446d565b506040805161010081018252600480546001600160a01b039081168352600554811660208401526127108385015230606084015242608084015260a08301869052600060c0840181905260e0840152925163414bf38960e01b815291927f0000000000000000000000000000000000000000000000000000000000000000169163414bf3899161300b91859101615364565b602060405180830381600087803b15801561302557600080fd5b505af1158015613039573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3091906148b5565b60006060846001600160a01b031663095ea7b360e01b8585604051602401613086929190614a85565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130c49190614933565b6000604051808303816000865af19150503d8060008114613101576040519150601f19603f3d011682016040523d82523d6000602084013e613106565b606091505b509150915081801561313057508051158061313057508080602001905181019061313091906147c6565b61314c5760405162461bcd60e51b815260040161028490614b8a565b5050505050565b60095460405163a318021760e01b81526001600160a01b039091169063a318021790613183908490600401614952565b60206040518083038186803b15801561319b57600080fd5b505afa1580156131af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d391906148b5565b156131f05760405162461bcd60e51b81526004016102849061506c565b600954604051633792def360e01b81526001600160a01b0390911690633792def390613220908490600401614952565b60206040518083038186803b15801561323857600080fd5b505afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327091906148b5565b1561328d5760405162461bcd60e51b8152600401610284906150fa565b600a5460405163a318021760e01b81526001600160a01b039091169063a3180217906132bd908490600401614952565b60206040518083038186803b1580156132d557600080fd5b505afa1580156132e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330d91906148b5565b1561332a5760405162461bcd60e51b815260040161028490614b34565b600a54604051633792def360e01b81526001600160a01b0390911690633792def39061335a908490600401614952565b60206040518083038186803b15801561337257600080fd5b505afa158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa91906148b5565b156133c75760405162461bcd60e51b815260040161028490614f7b565b600b5460405163a318021760e01b81526001600160a01b039091169063a3180217906133f7908490600401614952565b60206040518083038186803b15801561340f57600080fd5b505afa158015613423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344791906148b5565b156134645760405162461bcd60e51b815260040161028490614c53565b600b54604051633792def360e01b81526001600160a01b0390911690633792def390613494908490600401614952565b60206040518083038186803b1580156134ac57600080fd5b505afa1580156134c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e491906148b5565b156135015760405162461bcd60e51b815260040161028490614d3b565b600f54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c90613531908490600401614952565b60206040518083038186803b15801561354957600080fd5b505afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906148b5565b1561359e5760405162461bcd60e51b815260040161028490614fce565b600f54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a906135ce908490600401614952565b60206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e91906148b5565b1561363b5760405162461bcd60e51b81526004016102849061514e565b600c5460405163a318021760e01b81526001600160a01b039091169063a31802179061366b908490600401614952565b60206040518083038186803b15801561368357600080fd5b505afa158015613697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bb91906148b5565b156136d85760405162461bcd60e51b815260040161028490614adc565b600c54604051633792def360e01b81526001600160a01b0390911690633792def390613708908490600401614952565b60206040518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375891906148b5565b156137755760405162461bcd60e51b81526004016102849061530f565b600d5460405163a318021760e01b81526001600160a01b039091169063a3180217906137a5908490600401614952565b60206040518083038186803b1580156137bd57600080fd5b505afa1580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f591906148b5565b156138125760405162461bcd60e51b8152600401610284906151f0565b600d54604051633792def360e01b81526001600160a01b0390911690633792def390613842908490600401614952565b60206040518083038186803b15801561385a57600080fd5b505afa15801561386e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389291906148b5565b156138af5760405162461bcd60e51b815260040161028490615245565b601054604051631ccdc0d760e21b81526001600160a01b0390911690637337035c906138df908490600401614952565b60206040518083038186803b1580156138f757600080fd5b505afa15801561390b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392f91906148b5565b1561394c5760405162461bcd60e51b815260040161028490614fce565b601054604051635b8de71560e11b81526001600160a01b039091169063b71bce2a9061397c908490600401614952565b60206040518083038186803b15801561399457600080fd5b505afa1580156139a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cc91906148b5565b156139e95760405162461bcd60e51b81526004016102849061514e565b600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190613a19908490600401614952565b60206040518083038186803b158015613a3157600080fd5b505afa158015613a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6991906148b5565b15613a865760405162461bcd60e51b815260040161028490614e4a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190613ab6908490600401614952565b60206040518083038186803b158015613ace57600080fd5b505afa158015613ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0691906148b5565b15612a695760405162461bcd60e51b815260040161028490614e8d565b60008211613b435760405162461bcd60e51b815260040161028490614ed1565b6009546040516310c1c10360e01b81526000916001600160a01b0316906310c1c10390613b74908890600401614952565b60206040518083038186803b158015613b8c57600080fd5b505afa158015613ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc491906148b5565b600b54600a5460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613c01928a9291169088908390600401614a2a565b600060405180830381600087803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b5050600a5460095460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350613c6c928a92169088908390600401614a2a565b600060405180830381600087803b158015613c8657600080fd5b505af1158015613c9a573d6000803e3d6000fd5b505060095460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613cd4908890889088908390600401614a2a565b600060405180830381600087803b158015613cee57600080fd5b505af1158015613d02573d6000803e3d6000fd5b505050508115613f8357600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613d3f908990819060040161499f565b602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9191906148b5565b90508015613e0557600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613dd2928b928392169087906004016149dc565b600060405180830381600087803b158015613dec57600080fd5b505af1158015613e00573d6000803e3d6000fd5b505050505b600b54600754604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613e3d928c92169060040161499f565b60206040518083038186803b158015613e5557600080fd5b505afa158015613e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8d91906148b5565b90508015613f80576000613eab84613ea584896142a3565b906142dd565b600b5460075460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613ee8928d9291169086908390600401614a2a565b600060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b5050600754604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150613f4c908b908590600401614a85565b600060405180830381600087803b158015613f6657600080fd5b505af1158015613f7a573d6000803e3d6000fd5b50505050505b50505b7f4ec9c81e92795d300fa492175fce6418403e87faed90b688be8867b5067e10e8858585604051613fb693929190614a06565b60405180910390a15050505050565b606061401a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661431f9092919063ffffffff16565b80519091501561074b578080602001905181019061403891906147c6565b61074b5760405162461bcd60e51b8152600401610284906151a6565b6009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90614087908590819060040161499f565b602060405180830381600087803b1580156140a157600080fd5b505af11580156140b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d991906148b5565b905080156140fb576006546140fb90839081906001600160a01b031684612b36565b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061412e908690819060040161499f565b602060405180830381600087803b15801561414857600080fd5b505af115801561415c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418091906148b5565b9050801561074b57600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c926141c19288928392169087906004016149dc565b600060405180830381600087803b1580156141db57600080fd5b505af11580156141ef573d6000803e3d6000fd5b50505050505050565b600c546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061422b908590819060040161499f565b602060405180830381600087803b15801561424557600080fd5b505af1158015614259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427d91906148b5565b9050801561429f5760065461429f90839081906001600160a01b031684612b36565b5050565b6000826142b257506000612b30565b828202828482816142bf57fe5b0414612b2d5760405162461bcd60e51b81526004016102849061502b565b6000612b2d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614336565b606061432e848460008561436d565b949350505050565b600081836143575760405162461bcd60e51b81526004016102849190614aa9565b50600083858161436357fe5b0495945050505050565b60608247101561438f5760405162461bcd60e51b815260040161028490614e04565b6143988561442e565b6143b45760405162461bcd60e51b8152600401610284906150c3565b60006060866001600160a01b031685876040516143d19190614933565b60006040518083038185875af1925050503d806000811461440e576040519150601f19603f3d011682016040523d82523d6000602084013e614413565b606091505b5091509150614423828286614434565b979650505050505050565b3b151590565b60608315614443575081612f30565b8251156144535782518084602001fd5b8160405162461bcd60e51b81526004016102849190614aa9565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b600082601f8301126144c1578081fd5b81356144d46144cf82615419565b6153f2565b8181529150602080830190848101818402860182018710156144f557600080fd5b60005b8481101561451d57813561450b81615469565b845292820192908201906001016144f8565b505050505092915050565b600060208284031215614539578081fd5b8135612b2d81615469565b600080600080600080600080610100898b031215614560578384fd5b883561456b81615469565b9750602089013561457b81615469565b9650604089013561458b81615469565b9550606089013561459b81615469565b945060808901356145ab81615469565b935060a08901356145bb81615469565b925060c08901356145cb81615469565b915060e08901356145db81615469565b809150509295985092959890939650565b600080600060608486031215614600578283fd5b833561460b81615469565b9250602084013561461b81615469565b929592945050506040919091013590565b6000806040838503121561463e578182fd5b823561464981615469565b946020939093013593505050565b6000806000806080858703121561466c578384fd5b843561467781615469565b93506020850135925060408501359150606085013561469581615469565b939692955090935050565b600080600080608085870312156146b5578384fd5b84356146c081615469565b966020860135965060408601359560600135945092505050565b6000602082840312156146eb578081fd5b813567ffffffffffffffff811115614701578182fd5b61432e848285016144b1565b6000806040838503121561471f578182fd5b823567ffffffffffffffff80821115614736578384fd5b614742868387016144b1565b9350602091508185013581811115614758578384fd5b85019050601f8101861361476a578283fd5b80356147786144cf82615419565b81815283810190838501858402850186018a1015614794578687fd5b8694505b838510156147b6578035835260019490940193918501918501614798565b5080955050505050509250929050565b6000602082840312156147d7578081fd5b8151612b2d8161547e565b60008060008060008060008060006101208a8c031215614800578081fd5b893561480b8161547e565b985060208a013561481b8161547e565b975060408a013561482b8161547e565b965060608a013561483b8161547e565b955060808a013561484b8161547e565b945060a08a013561485b8161547e565b935060c08a013561486b8161547e565b925060e08a013561487b8161547e565b91506101008a013561488c8161547e565b809150509295985092959850929598565b6000602082840312156148ae578081fd5b5035919050565b6000602082840312156148c6578081fd5b5051919050565b600080604083850312156148df578182fd5b50508035926020909101359150565b600080600060608486031215614902578081fd5b8335925060208401359150604084013561491b81615469565b809150509250925092565b6001600160a01b03169052565b60008251614945818460208701615439565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082528251806020840152614ac8816040850160208701615439565b601f01601f19169190910160400192915050565b60208082526038908201527f526577617264526f757465723a207374616b65644d766c70547261636b65722e6040820152770617665726167655374616b6564416d6f756e7473203e20360441b606082015260800190565b60208082526036908201527f526577617264526f757465723a20626f6e75734d7678547261636b65722e6176604082015275065726167655374616b6564416d6f756e7473203e20360541b606082015260800190565b602080825260029082015261534160f01b604082015260600190565b6020808252601690820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604082015260600190565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526034908201527f526577617264526f757465723a206665654d7678547261636b65722e6176657260408201527306167655374616b6564416d6f756e7473203e20360641b606082015260800190565b6020808252601f908201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526031908201527f526577617264526f757465723a206665654d7678547261636b65722e63756d7560408201527006c617469766552657761726473203e203607c1b606082015260800190565b60208082526021908201527f526577617264526f757465723a20616c726561647920696e697469616c697a656040820152601960fa1b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526023908201527f526577617264526f757465723a206d76785665737465722e62616c616e63652060408201526203e20360ec1b606082015260800190565b60208082526024908201527f526577617264526f757465723a206d766c705665737465722e62616c616e63656040820152630203e20360e41b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526024908201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616040820152631b1b195960e21b606082015260800190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526033908201527f526577617264526f757465723a20626f6e75734d7678547261636b65722e637560408201527206d756c617469766552657761726473203e203606c1b606082015260800190565b6020808252603b908201527f526577617264526f757465723a206d76785665737465722e7472616e7366657260408201527f726564417665726167655374616b6564416d6f756e7473203e20300000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526037908201527f526577617264526f757465723a207374616b65644d7678547261636b65722e6160408201527607665726167655374616b6564416d6f756e7473203e203604c1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526034908201527f526577617264526f757465723a207374616b65644d7678547261636b65722e636040820152730756d756c617469766552657761726473203e20360641b606082015260800190565b60208082526038908201527f526577617264526f757465723a206d76785665737465722e7472616e73666572604082015277072656443756d756c617469766552657761726473203e20360441b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526035908201527f526577617264526f757465723a206665654d766c70547261636b65722e6176656040820152740726167655374616b6564416d6f756e7473203e203605c1b606082015260800190565b60208082526032908201527f526577617264526f757465723a206665654d766c70547261636b65722e63756d6040820152710756c617469766552657761726473203e20360741b606082015260800190565b60208082526021908201527f526577617264526f757465723a20696e76616c6964205f6d766c70416d6f756e6040820152601d60fa1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526035908201527f526577617264526f757465723a207374616b65644d766c70547261636b65722e604082015274063756d756c617469766552657761726473203e203605c1b606082015260800190565b60006101008201905060018060a01b0380845116835280602085015116602084015262ffffff6040850151166040840152806060850151166060840152506080830151608083015260a083015160a083015260c083015160c083015260e08301516153d260e0840182614926565b5092915050565b62ffffff91909116815260200190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561541157600080fd5b604052919050565b600067ffffffffffffffff82111561542f578081fd5b5060209081020190565b60005b8381101561545457818101518382015260200161543c565b83811115615463576000848401525b50505050565b6001600160a01b0381168114612a6957600080fd5b8015158114612a6957600080fdfea164736f6c634300060c000a000000000000000000000000e592427a0aece92de3edee1f18e0157c058615640000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000002760e46d9bb43dafcbecaad1f64b93207f9f0ed7000000000000000000000000d1b2f8dff8437be57430ee98767d512f252ead61000000000000000000000000b6bdd10a12286401c8dfac93fe933c7abbd6d0af0000000000000000000000009f4f8bc00f48663b7c204c96b932c29ccc43a2e80000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000032848e2d3aecfa7364595609fb050a301050a6b4

Deployed Bytecode

0x6080604052600436106102555760003560e01c8063655603a411610139578063d294f093116100b6578063ebe1b08c1161007a578063ebe1b08c14610673578063ef9aacfd14610688578063f69786df146106a8578063f69e2046146106bd578063f963ba68146106d2578063fbfa77cf146106f25761028f565b8063d294f093146105f4578063dc1e316414610609578063e1b9db8914610629578063e616254914610649578063eb81fabf1461065e5761028f565b80638a29e2de116100fd5780638a29e2de1461056a57806390ee4ce71461058a578063c31c9c071461059f578063cfad57a2146105b4578063cfe623e5146105d45761028f565b8063655603a4146104d557806377a83086146104f55780637ca2577914610515578063877d5ffc14610535578063878a068a146105555761028f565b80633b873237116101d2578063447f0bc911610196578063447f0bc91461044e57806346156a5e146104635780634c19b6ce146104765780634e71d92d1461048b5780634fbb6103146104a057806362e20739146104b55761028f565b80633b873237146103cf5780633e413bee146103ef5780633f4b8f3d146104045780633fc8cef31461042457806342a19ca2146104395761028f565b80631af276a6116102195780631af276a61461032b5780631fdcbc481461034b57806326425f56146103785780632a9f40831461038d578063392e53cd146103ad5761028f565b8063018e84911461029457806301e33667146102bf5780630af5db5a146102df57806312d43a511461030157806318a42040146103165761028f565b3661028f576002546001600160a01b0316331461028d5760405162461bcd60e51b815260040161028490614ba6565b60405180910390fd5b005b600080fd5b3480156102a057600080fd5b506102a9610707565b6040516102b691906153d9565b60405180910390f35b3480156102cb57600080fd5b5061028d6102da3660046145ec565b61070d565b3480156102eb57600080fd5b506102f4610750565b6040516102b69190614952565b34801561030d57600080fd5b506102f461075f565b34801561032257600080fd5b506102f461076e565b34801561033757600080fd5b5061028d6103463660046146da565b61077d565b34801561035757600080fd5b5061036b610366366004614657565b610808565b6040516102b691906153e9565b34801561038457600080fd5b506102f46109fe565b34801561039957600080fd5b5061028d6103a8366004614528565b610a0d565b3480156103b957600080fd5b506103c2610a70565b6040516102b69190614a9e565b3480156103db57600080fd5b5061036b6103ea3660046148ee565b610a80565b3480156103fb57600080fd5b506102f4610cee565b34801561041057600080fd5b5061036b61041f3660046147e2565b610cfd565b34801561043057600080fd5b506102f46114d1565b34801561044557600080fd5b506102f46114e0565b34801561045a57600080fd5b506102f46114ef565b61036b6104713660046148cd565b6114fe565b34801561048257600080fd5b506102f46115c5565b34801561049757600080fd5b5061028d6115d4565b3480156104ac57600080fd5b506102f461180f565b3480156104c157600080fd5b5061028d6104d036600461489d565b61181e565b3480156104e157600080fd5b5061028d6104f0366004614528565b611860565b34801561050157600080fd5b5061028d61051036600461489d565b61214f565b34801561052157600080fd5b5061028d61053036600461462c565b612191565b34801561054157600080fd5b5061028d61055036600461489d565b6121fd565b34801561056157600080fd5b5061028d61223f565b34801561057657600080fd5b5061028d610585366004614544565b612299565b34801561059657600080fd5b506102f4612390565b3480156105ab57600080fd5b506102f461239f565b3480156105c057600080fd5b5061028d6105cf366004614528565b6123c3565b3480156105e057600080fd5b5061028d6105ef36600461489d565b61240f565b34801561060057600080fd5b5061028d612451565b34801561061557600080fd5b5061028d61062436600461470d565b612530565b34801561063557600080fd5b506102f4610644366004614528565b6125df565b34801561065557600080fd5b506102f46125fa565b34801561066a57600080fd5b506102f4612609565b34801561067f57600080fd5b506102f4612618565b34801561069457600080fd5b5061028d6106a3366004614528565b612627565b3480156106b457600080fd5b506102f46127c6565b3480156106c957600080fd5b5061028d6127d5565b3480156106de57600080fd5b5061036b6106ed3660046146a0565b61280d565b3480156106fe57600080fd5b506102f46129f2565b61271081565b6001546001600160a01b031633146107375760405162461bcd60e51b815260040161028490614f4c565b61074b6001600160a01b0384168383612a01565b505050565b600b546001600160a01b031681565b6001546001600160a01b031681565b6009546001600160a01b031681565b600260005414156107a05760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146107cf5760405162461bcd60e51b815260040161028490614f4c565b60005b81518110156107ff576107f78282815181106107ea57fe5b6020026020010151612a57565b6001016107d2565b50506001600055565b60006002600054141561082d5760405162461bcd60e51b8152600401610284906152d8565b60026000558361084f5760405162461bcd60e51b815260040161028490615297565b600c54600d5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d9261088a92869216908a908390600401614a2a565b600060405180830381600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d93506108f592869216908a908390600401614a2a565b600060405180830381600087803b15801561090f57600080fd5b505af1158015610923573d6000803e3d6000fd5b5050600e546040516371d597ad60e01b8152600093506001600160a01b0390911691506371d597ad906109629085908b908b908b908b90600401614a55565b602060405180830381600087803b15801561097c57600080fd5b505af1158015610990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b491906148b5565b90507ff684faf593dafe878a9fdccfb0b06ed0463d9a5350c68300efcd3da6113820eb82876040516109e7929190614a85565b60405180910390a160016000559695505050505050565b6010546001600160a01b031681565b60026000541415610a305760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b03163314610a5f5760405162461bcd60e51b815260040161028490614f4c565b610a6881612a57565b506001600055565b600154600160a01b900460ff1681565b600060026000541415610aa55760405162461bcd60e51b8152600401610284906152d8565b600260005583610ac75760405162461bcd60e51b815260040161028490615297565b600c54600d5460405163098bf59d60e01b815233926001600160a01b039081169263098bf59d92610b0292869216908a908390600401614a2a565b600060405180830381600087803b158015610b1c57600080fd5b505af1158015610b30573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350610b6d92869216908a908390600401614a2a565b600060405180830381600087803b158015610b8757600080fd5b505af1158015610b9b573d6000803e3d6000fd5b5050600e546002546040516371d597ad60e01b8152600094506001600160a01b0392831693506371d597ad92610bde9287929116908b908b903090600401614a55565b602060405180830381600087803b158015610bf857600080fd5b505af1158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3091906148b5565b600254604051632e1a7d4d60e01b81529192506001600160a01b031690632e1a7d4d90610c619084906004016153e9565b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b50610ca7925050506001600160a01b03851682612a6c565b7ff684faf593dafe878a9fdccfb0b06ed0463d9a5350c68300efcd3da6113820eb8287604051610cd8929190614a85565b60405180910390a1600160005595945050505050565b6004546001600160a01b031681565b600060026000541415610d225760405162461bcd60e51b8152600401610284906152d8565b6002600090815533908b15610e5157600f546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610d64908690819060040161499f565b602060405180830381600087803b158015610d7e57600080fd5b505af1158015610d92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db691906148b5565b6010546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610dee908790819060040161499f565b602060405180830381600087803b158015610e0857600080fd5b505af1158015610e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4091906148b5565b9050610e4c8282612b08565b925050505b8a8015610e5e5750600081115b15610e7d57600554610e7d90839081906001600160a01b031684612b36565b60008a15610fa5576009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90610eb8908790819060040161499f565b602060405180830381600087803b158015610ed257600080fd5b505af1158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a91906148b5565b600c546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a90610f42908890819060040161499f565b602060405180830381600087803b158015610f5c57600080fd5b505af1158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9491906148b5565b9050610fa08282612b08565b925050505b898015610fb25750600081115b15610fd157600654610fd190849081906001600160a01b031684612b36565b88156110d257600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061100a908790819060040161499f565b602060405180830381600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c91906148b5565b905080156110d057600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c9261109d9289928392169087906004016149dc565b600060405180830381600087803b1580156110b757600080fd5b505af11580156110cb573d6000803e3d6000fd5b505050505b505b87156114bc5786806110e15750855b806110e95750845b156113b157600b546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90611121908790309060040161499f565b602060405180830381600087803b15801561113b57600080fd5b505af115801561114f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117391906148b5565b600d546040516309f4173d60e11b81529192506000916001600160a01b03909116906313e82e7a906111ab908890309060040161499f565b602060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd91906148b5565b9050600061120b8383612b08565b905088156112265761121f81600080612cd7565b96506113a9565b871561133357600354600254611249916001600160a01b03918216911683612a01565b60035460025460048054604051634998b10960e11b81526000946001600160a01b039081169463933162129461128a949183169391909216913091016149b9565b602060405180830381600087803b1580156112a457600080fd5b505af11580156112b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dc91906148b5565b905060006112e982612f37565b9050801561132c5760055460095461130e916001600160a01b0390811691168361305d565b6005546113289030908a906001600160a01b031684612b36565b8098505b50506113a9565b600254604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906113639084906004016153e9565b600060405180830381600087803b15801561137d57600080fd5b505af1158015611391573d6000803e3d6000fd5b506113a9925050506001600160a01b03871682612a6c565b5050506114bc565b600b546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906113e3908690819060040161499f565b602060405180830381600087803b1580156113fd57600080fd5b505af1158015611411573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143591906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611468908690819060040161499f565b602060405180830381600087803b15801561148257600080fd5b505af1158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba91906148b5565b505b50506001600055509998505050505050505050565b6002546001600160a01b031681565b6007546001600160a01b031681565b600c546001600160a01b031681565b6000600260005414156115235760405162461bcd60e51b8152600401610284906152d8565b6002600055346115455760405162461bcd60e51b815260040161028490614ca7565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561159557600080fd5b505af11580156115a9573d6000803e3d6000fd5b50505050506115b9348484612cd7565b60016000559392505050565b6006546001600160a01b031681565b600260005414156115f75760405162461bcd60e51b8152600401610284906152d8565b6002600055600b546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a9061162e908490819060040161499f565b602060405180830381600087803b15801561164857600080fd5b505af115801561165c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168091906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906116b3908490819060040161499f565b602060405180830381600087803b1580156116cd57600080fd5b505af11580156116e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170591906148b5565b506009546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a90611738908490819060040161499f565b602060405180830381600087803b15801561175257600080fd5b505af1158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906148b5565b50600c546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906117bd908490819060040161499f565b602060405180830381600087803b1580156117d757600080fd5b505af11580156117eb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ff91906148b5565b600d546001600160a01b031681565b600260005414156118415760405162461bcd60e51b8152600401610284906152d8565b6002600055600654610a6890339081906001600160a01b031684612b36565b600260005414156118835760405162461bcd60e51b8152600401610284906152d8565b6002600055600f546040516370a0823160e01b81526001600160a01b03909116906370a08231906118b8908490600401614952565b60206040518083038186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190891906148b5565b156119255760405162461bcd60e51b815260040161028490614bd6565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190611955908490600401614952565b60206040518083038186803b15801561196d57600080fd5b505afa158015611981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a591906148b5565b156119c25760405162461bcd60e51b815260040161028490614bd6565b6001600160a01b0381811660009081526011602052604090205433911681146119fd5760405162461bcd60e51b815260040161028490614f08565b6001600160a01b038216600090815260116020526040902080546001600160a01b0319169055611a2c81613153565b611a3582612a57565b600954600554604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611a6d928892169060040161499f565b60206040518083038186803b158015611a8557600080fd5b505afa158015611a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abd91906148b5565b90508015611af957600554611adf9084906001600160a01b0316836000613b23565b600554611af990849084906001600160a01b031684612b36565b600954600654604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611b31928992169060040161499f565b60206040518083038186803b158015611b4957600080fd5b505afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906148b5565b90508015611bbd57600654611ba39085906001600160a01b0316836000613b23565b600654611bbd90859085906001600160a01b031684612b36565b600b54600754604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611bf5928a92169060040161499f565b60206040518083038186803b158015611c0d57600080fd5b505afa158015611c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4591906148b5565b90508015611d2757600b5460075460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611c88928a929091169086908390600401614a2a565b600060405180830381600087803b158015611ca257600080fd5b505af1158015611cb6573d6000803e3d6000fd5b5050600b54600754604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611cf4928a928a9291169087906004016149dc565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b505050505b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611d58908990600401614952565b60206040518083038186803b158015611d7057600080fd5b505afa158015611d84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da891906148b5565b90508015611e38576006546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611de490899089908690600401614a06565b602060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3691906147c6565b505b600d54600854604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92611e70928c92169060040161499f565b60206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec091906148b5565b9050801561207957600c54600d5460405163098bf59d60e01b81526001600160a01b039283169263098bf59d92611f03928c929091169086908390600401614a2a565b600060405180830381600087803b158015611f1d57600080fd5b505af1158015611f31573d6000803e3d6000fd5b5050600d5460085460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350611f6e928c92169086908390600401614a2a565b600060405180830381600087803b158015611f8857600080fd5b505af1158015611f9c573d6000803e3d6000fd5b5050600d54600854604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350611fda928c928c9291169087906004016149dc565b600060405180830381600087803b158015611ff457600080fd5b505af1158015612008573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612046928b92839291169087906004016149dc565b600060405180830381600087803b15801561206057600080fd5b505af1158015612074573d6000803e3d6000fd5b505050505b600f54604051630f713c2360e41b81526001600160a01b039091169063f713c230906120ab908a908a9060040161499f565b600060405180830381600087803b1580156120c557600080fd5b505af11580156120d9573d6000803e3d6000fd5b5050601054604051630f713c2360e41b81526001600160a01b03909116925063f713c230915061210f908a908a9060040161499f565b600060405180830381600087803b15801561212957600080fd5b505af115801561213d573d6000803e3d6000fd5b50506001600055505050505050505050565b600260005414156121725760405162461bcd60e51b8152600401610284906152d8565b6002600055600554610a6890339081906001600160a01b031684612b36565b600260005414156121b45760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146121e35760405162461bcd60e51b815260040161028490614f4c565b6005546107ff90339084906001600160a01b031684612b36565b600260005414156122205760405162461bcd60e51b8152600401610284906152d8565b6002600055600654610a689033906001600160a01b0316836001613b23565b600260005414156122625760405162461bcd60e51b8152600401610284906152d8565b60026000556009546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a90611738908490819060040161499f565b6001546001600160a01b031633146122c35760405162461bcd60e51b815260040161028490614f4c565b600154600160a01b900460ff16156122ed5760405162461bcd60e51b815260040161028490614d8c565b60018054600160a01b60ff60a01b19909116179055600980546001600160a01b03199081166001600160a01b039a8b1617909155600a80548216988a1698909817909755600b8054881696891696909617909555600d8054871694881694909417909355600c8054861692871692909217909155600e80548516918616919091179055600f80548416918516919091179055601080549092169216919091179055565b600f546001600160a01b031681565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156481565b6001546001600160a01b031633146123ed5760405162461bcd60e51b815260040161028490614f4c565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156124325760405162461bcd60e51b8152600401610284906152d8565b6002600055600554610a689033906001600160a01b0316836001613b23565b600260005414156124745760405162461bcd60e51b8152600401610284906152d8565b6002600055600b546040516309f4173d60e11b815233916001600160a01b0316906313e82e7a906124ab908490819060040161499f565b602060405180830381600087803b1580156124c557600080fd5b505af11580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd91906148b5565b50600d546040516309f4173d60e11b81526001600160a01b03909116906313e82e7a906117bd908490819060040161499f565b600260005414156125535760405162461bcd60e51b8152600401610284906152d8565b60026000556001546001600160a01b031633146125825760405162461bcd60e51b815260040161028490614f4c565b6005546001600160a01b031660005b83518110156125d4576125cc338583815181106125aa57fe5b6020026020010151848685815181106125bf57fe5b6020026020010151612b36565b600101612591565b505060016000555050565b6011602052600090815260409020546001600160a01b031681565b600e546001600160a01b031681565b6005546001600160a01b031681565b6008546001600160a01b031681565b6002600054141561264a5760405162461bcd60e51b8152600401610284906152d8565b6002600055600f546040516370a0823160e01b81526001600160a01b03909116906370a082319061267f903390600401614952565b60206040518083038186803b15801561269757600080fd5b505afa1580156126ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cf91906148b5565b156126ec5760405162461bcd60e51b815260040161028490614bd6565b6010546040516370a0823160e01b81526001600160a01b03909116906370a082319061271c903390600401614952565b60206040518083038186803b15801561273457600080fd5b505afa158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c91906148b5565b156127895760405162461bcd60e51b815260040161028490614bd6565b61279281613153565b33600090815260116020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b600a546001600160a01b031681565b600260005414156127f85760405162461bcd60e51b8152600401610284906152d8565b600260005561280633612a57565b6001600055565b6000600260005414156128325760405162461bcd60e51b8152600401610284906152d8565b6002600055836128545760405162461bcd60e51b815260040161028490614ed1565b600e546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061289390859081908c908c908c908c90600401614966565b602060405180830381600087803b1580156128ad57600080fd5b505af11580156128c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e591906148b5565b600d54600854604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c9261292392879283929091169087906004016149dc565b600060405180830381600087803b15801561293d57600080fd5b505af1158015612951573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c935061298f928792839291169087906004016149dc565b600060405180830381600087803b1580156129a957600080fd5b505af11580156129bd573d6000803e3d6000fd5b505050507ffce3ee85e2e412ef09992db90b048aff7ae30eb1013ba5b9ab3d8604d2336d4982826040516109e7929190614a85565b6003546001600160a01b031681565b61074b8363a9059cbb60e01b8484604051602401612a20929190614a85565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613fc5565b612a6081614054565b612a69816141f8565b50565b80471015612a8c5760405162461bcd60e51b815260040161028490614dcd565b6000826001600160a01b031682604051612aa59061494f565b60006040518083038185875af1925050503d8060008114612ae2576040519150601f19603f3d011682016040523d82523d6000602084013e612ae7565b606091505b505090508061074b5760405162461bcd60e51b815260040161028490614cde565b600082820183811015612b2d5760405162461bcd60e51b815260040161028490614c1c565b90505b92915050565b60008111612b565760405162461bcd60e51b815260040161028490614ed1565b600954604051631e42d69b60e21b81526001600160a01b039091169063790b5a6c90612b8c9087908790879087906004016149dc565b600060405180830381600087803b158015612ba657600080fd5b505af1158015612bba573d6000803e3d6000fd5b5050600a54600954604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612bf8928892839291169087906004016149dc565b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b5050600b54600a54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612c64928892839291169087906004016149dc565b600060405180830381600087803b158015612c7e57600080fd5b505af1158015612c92573d6000803e3d6000fd5b505050507fa69efa6d0ae966c7903f49691b8d8e4ae5cb51adb92e07d0ee4438dc7fddb583838383604051612cc993929190614a06565b60405180910390a150505050565b6000808411612cf85760405162461bcd60e51b815260040161028490614ed1565b600254600e5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612d2e929116908890600401614a85565b602060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8091906147c6565b50600e546002546040516317eb2a1560e01b815233926000926001600160a01b03918216926317eb2a1592612dc59230928892909116908c908c908c90600401614966565b602060405180830381600087803b158015612ddf57600080fd5b505af1158015612df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1791906148b5565b600d54600854604051631e42d69b60e21b81529293506001600160a01b039182169263790b5a6c92612e5592879283929091169087906004016149dc565b600060405180830381600087803b158015612e6f57600080fd5b505af1158015612e83573d6000803e3d6000fd5b5050600c54600d54604051631e42d69b60e21b81526001600160a01b03928316945063790b5a6c9350612ec1928792839291169087906004016149dc565b600060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050507ffce3ee85e2e412ef09992db90b048aff7ae30eb1013ba5b9ab3d8604d2336d498282604051612f24929190614a85565b60405180910390a19150505b9392505050565b600454600090612f71906001600160a01b03167f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648461305d565b612f7961446d565b506040805161010081018252600480546001600160a01b039081168352600554811660208401526127108385015230606084015242608084015260a08301869052600060c0840181905260e0840152925163414bf38960e01b815291927f000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564169163414bf3899161300b91859101615364565b602060405180830381600087803b15801561302557600080fd5b505af1158015613039573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3091906148b5565b60006060846001600160a01b031663095ea7b360e01b8585604051602401613086929190614a85565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516130c49190614933565b6000604051808303816000865af19150503d8060008114613101576040519150601f19603f3d011682016040523d82523d6000602084013e613106565b606091505b509150915081801561313057508051158061313057508080602001905181019061313091906147c6565b61314c5760405162461bcd60e51b815260040161028490614b8a565b5050505050565b60095460405163a318021760e01b81526001600160a01b039091169063a318021790613183908490600401614952565b60206040518083038186803b15801561319b57600080fd5b505afa1580156131af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d391906148b5565b156131f05760405162461bcd60e51b81526004016102849061506c565b600954604051633792def360e01b81526001600160a01b0390911690633792def390613220908490600401614952565b60206040518083038186803b15801561323857600080fd5b505afa15801561324c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327091906148b5565b1561328d5760405162461bcd60e51b8152600401610284906150fa565b600a5460405163a318021760e01b81526001600160a01b039091169063a3180217906132bd908490600401614952565b60206040518083038186803b1580156132d557600080fd5b505afa1580156132e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330d91906148b5565b1561332a5760405162461bcd60e51b815260040161028490614b34565b600a54604051633792def360e01b81526001600160a01b0390911690633792def39061335a908490600401614952565b60206040518083038186803b15801561337257600080fd5b505afa158015613386573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133aa91906148b5565b156133c75760405162461bcd60e51b815260040161028490614f7b565b600b5460405163a318021760e01b81526001600160a01b039091169063a3180217906133f7908490600401614952565b60206040518083038186803b15801561340f57600080fd5b505afa158015613423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344791906148b5565b156134645760405162461bcd60e51b815260040161028490614c53565b600b54604051633792def360e01b81526001600160a01b0390911690633792def390613494908490600401614952565b60206040518083038186803b1580156134ac57600080fd5b505afa1580156134c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e491906148b5565b156135015760405162461bcd60e51b815260040161028490614d3b565b600f54604051631ccdc0d760e21b81526001600160a01b0390911690637337035c90613531908490600401614952565b60206040518083038186803b15801561354957600080fd5b505afa15801561355d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358191906148b5565b1561359e5760405162461bcd60e51b815260040161028490614fce565b600f54604051635b8de71560e11b81526001600160a01b039091169063b71bce2a906135ce908490600401614952565b60206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e91906148b5565b1561363b5760405162461bcd60e51b81526004016102849061514e565b600c5460405163a318021760e01b81526001600160a01b039091169063a31802179061366b908490600401614952565b60206040518083038186803b15801561368357600080fd5b505afa158015613697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bb91906148b5565b156136d85760405162461bcd60e51b815260040161028490614adc565b600c54604051633792def360e01b81526001600160a01b0390911690633792def390613708908490600401614952565b60206040518083038186803b15801561372057600080fd5b505afa158015613734573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375891906148b5565b156137755760405162461bcd60e51b81526004016102849061530f565b600d5460405163a318021760e01b81526001600160a01b039091169063a3180217906137a5908490600401614952565b60206040518083038186803b1580156137bd57600080fd5b505afa1580156137d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137f591906148b5565b156138125760405162461bcd60e51b8152600401610284906151f0565b600d54604051633792def360e01b81526001600160a01b0390911690633792def390613842908490600401614952565b60206040518083038186803b15801561385a57600080fd5b505afa15801561386e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389291906148b5565b156138af5760405162461bcd60e51b815260040161028490615245565b601054604051631ccdc0d760e21b81526001600160a01b0390911690637337035c906138df908490600401614952565b60206040518083038186803b1580156138f757600080fd5b505afa15801561390b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392f91906148b5565b1561394c5760405162461bcd60e51b815260040161028490614fce565b601054604051635b8de71560e11b81526001600160a01b039091169063b71bce2a9061397c908490600401614952565b60206040518083038186803b15801561399457600080fd5b505afa1580156139a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139cc91906148b5565b156139e95760405162461bcd60e51b81526004016102849061514e565b600f546040516370a0823160e01b81526001600160a01b03909116906370a0823190613a19908490600401614952565b60206040518083038186803b158015613a3157600080fd5b505afa158015613a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6991906148b5565b15613a865760405162461bcd60e51b815260040161028490614e4a565b6010546040516370a0823160e01b81526001600160a01b03909116906370a0823190613ab6908490600401614952565b60206040518083038186803b158015613ace57600080fd5b505afa158015613ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b0691906148b5565b15612a695760405162461bcd60e51b815260040161028490614e8d565b60008211613b435760405162461bcd60e51b815260040161028490614ed1565b6009546040516310c1c10360e01b81526000916001600160a01b0316906310c1c10390613b74908890600401614952565b60206040518083038186803b158015613b8c57600080fd5b505afa158015613ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc491906148b5565b600b54600a5460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613c01928a9291169088908390600401614a2a565b600060405180830381600087803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b5050600a5460095460405163098bf59d60e01b81526001600160a01b03928316945063098bf59d9350613c6c928a92169088908390600401614a2a565b600060405180830381600087803b158015613c8657600080fd5b505af1158015613c9a573d6000803e3d6000fd5b505060095460405163098bf59d60e01b81526001600160a01b03909116925063098bf59d9150613cd4908890889088908390600401614a2a565b600060405180830381600087803b158015613cee57600080fd5b505af1158015613d02573d6000803e3d6000fd5b505050508115613f8357600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90613d3f908990819060040161499f565b602060405180830381600087803b158015613d5957600080fd5b505af1158015613d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9191906148b5565b90508015613e0557600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c92613dd2928b928392169087906004016149dc565b600060405180830381600087803b158015613dec57600080fd5b505af1158015613e00573d6000803e3d6000fd5b505050505b600b54600754604051637aeceb1f60e11b81526000926001600160a01b039081169263f5d9d63e92613e3d928c92169060040161499f565b60206040518083038186803b158015613e5557600080fd5b505afa158015613e69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e8d91906148b5565b90508015613f80576000613eab84613ea584896142a3565b906142dd565b600b5460075460405163098bf59d60e01b81529293506001600160a01b039182169263098bf59d92613ee8928d9291169086908390600401614a2a565b600060405180830381600087803b158015613f0257600080fd5b505af1158015613f16573d6000803e3d6000fd5b5050600754604051632770a7eb60e21b81526001600160a01b039091169250639dc29fac9150613f4c908b908590600401614a85565b600060405180830381600087803b158015613f6657600080fd5b505af1158015613f7a573d6000803e3d6000fd5b50505050505b50505b7f4ec9c81e92795d300fa492175fce6418403e87faed90b688be8867b5067e10e8858585604051613fb693929190614a06565b60405180910390a15050505050565b606061401a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661431f9092919063ffffffff16565b80519091501561074b578080602001905181019061403891906147c6565b61074b5760405162461bcd60e51b8152600401610284906151a6565b6009546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a90614087908590819060040161499f565b602060405180830381600087803b1580156140a157600080fd5b505af11580156140b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d991906148b5565b905080156140fb576006546140fb90839081906001600160a01b031684612b36565b600a546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061412e908690819060040161499f565b602060405180830381600087803b15801561414857600080fd5b505af115801561415c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418091906148b5565b9050801561074b57600b54600754604051631e42d69b60e21b81526001600160a01b039283169263790b5a6c926141c19288928392169087906004016149dc565b600060405180830381600087803b1580156141db57600080fd5b505af11580156141ef573d6000803e3d6000fd5b50505050505050565b600c546040516309f4173d60e11b81526000916001600160a01b0316906313e82e7a9061422b908590819060040161499f565b602060405180830381600087803b15801561424557600080fd5b505af1158015614259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061427d91906148b5565b9050801561429f5760065461429f90839081906001600160a01b031684612b36565b5050565b6000826142b257506000612b30565b828202828482816142bf57fe5b0414612b2d5760405162461bcd60e51b81526004016102849061502b565b6000612b2d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614336565b606061432e848460008561436d565b949350505050565b600081836143575760405162461bcd60e51b81526004016102849190614aa9565b50600083858161436357fe5b0495945050505050565b60608247101561438f5760405162461bcd60e51b815260040161028490614e04565b6143988561442e565b6143b45760405162461bcd60e51b8152600401610284906150c3565b60006060866001600160a01b031685876040516143d19190614933565b60006040518083038185875af1925050503d806000811461440e576040519150601f19603f3d011682016040523d82523d6000602084013e614413565b606091505b5091509150614423828286614434565b979650505050505050565b3b151590565b60608315614443575081612f30565b8251156144535782518084602001fd5b8160405162461bcd60e51b81526004016102849190614aa9565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b600082601f8301126144c1578081fd5b81356144d46144cf82615419565b6153f2565b8181529150602080830190848101818402860182018710156144f557600080fd5b60005b8481101561451d57813561450b81615469565b845292820192908201906001016144f8565b505050505092915050565b600060208284031215614539578081fd5b8135612b2d81615469565b600080600080600080600080610100898b031215614560578384fd5b883561456b81615469565b9750602089013561457b81615469565b9650604089013561458b81615469565b9550606089013561459b81615469565b945060808901356145ab81615469565b935060a08901356145bb81615469565b925060c08901356145cb81615469565b915060e08901356145db81615469565b809150509295985092959890939650565b600080600060608486031215614600578283fd5b833561460b81615469565b9250602084013561461b81615469565b929592945050506040919091013590565b6000806040838503121561463e578182fd5b823561464981615469565b946020939093013593505050565b6000806000806080858703121561466c578384fd5b843561467781615469565b93506020850135925060408501359150606085013561469581615469565b939692955090935050565b600080600080608085870312156146b5578384fd5b84356146c081615469565b966020860135965060408601359560600135945092505050565b6000602082840312156146eb578081fd5b813567ffffffffffffffff811115614701578182fd5b61432e848285016144b1565b6000806040838503121561471f578182fd5b823567ffffffffffffffff80821115614736578384fd5b614742868387016144b1565b9350602091508185013581811115614758578384fd5b85019050601f8101861361476a578283fd5b80356147786144cf82615419565b81815283810190838501858402850186018a1015614794578687fd5b8694505b838510156147b6578035835260019490940193918501918501614798565b5080955050505050509250929050565b6000602082840312156147d7578081fd5b8151612b2d8161547e565b60008060008060008060008060006101208a8c031215614800578081fd5b893561480b8161547e565b985060208a013561481b8161547e565b975060408a013561482b8161547e565b965060608a013561483b8161547e565b955060808a013561484b8161547e565b945060a08a013561485b8161547e565b935060c08a013561486b8161547e565b925060e08a013561487b8161547e565b91506101008a013561488c8161547e565b809150509295985092959850929598565b6000602082840312156148ae578081fd5b5035919050565b6000602082840312156148c6578081fd5b5051919050565b600080604083850312156148df578182fd5b50508035926020909101359150565b600080600060608486031215614902578081fd5b8335925060208401359150604084013561491b81615469565b809150509250925092565b6001600160a01b03169052565b60008251614945818460208701615439565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03948516815292841660208401526040830191909152909116606082015260800190565b6001600160a01b039586168152938516602085015260408401929092526060830152909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082528251806020840152614ac8816040850160208701615439565b601f01601f19169190910160400192915050565b60208082526038908201527f526577617264526f757465723a207374616b65644d766c70547261636b65722e6040820152770617665726167655374616b6564416d6f756e7473203e20360441b606082015260800190565b60208082526036908201527f526577617264526f757465723a20626f6e75734d7678547261636b65722e6176604082015275065726167655374616b6564416d6f756e7473203e20360541b606082015260800190565b602080825260029082015261534160f01b604082015260600190565b6020808252601690820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604082015260600190565b60208082526026908201527f526577617264526f757465723a2073656e646572206861732076657374656420604082015265746f6b656e7360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526034908201527f526577617264526f757465723a206665654d7678547261636b65722e6176657260408201527306167655374616b6564416d6f756e7473203e20360641b606082015260800190565b6020808252601f908201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260408201527f6563697069656e74206d61792068617665207265766572746564000000000000606082015260800190565b60208082526031908201527f526577617264526f757465723a206665654d7678547261636b65722e63756d7560408201527006c617469766552657761726473203e203607c1b606082015260800190565b60208082526021908201527f526577617264526f757465723a20616c726561647920696e697469616c697a656040820152601960fa1b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526023908201527f526577617264526f757465723a206d76785665737465722e62616c616e63652060408201526203e20360ec1b606082015260800190565b60208082526024908201527f526577617264526f757465723a206d766c705665737465722e62616c616e63656040820152630203e20360e41b606082015260800190565b6020808252601d908201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604082015260600190565b60208082526024908201527f526577617264526f757465723a207472616e73666572206e6f74207369676e616040820152631b1b195960e21b606082015260800190565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526033908201527f526577617264526f757465723a20626f6e75734d7678547261636b65722e637560408201527206d756c617469766552657761726473203e203606c1b606082015260800190565b6020808252603b908201527f526577617264526f757465723a206d76785665737465722e7472616e7366657260408201527f726564417665726167655374616b6564416d6f756e7473203e20300000000000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526037908201527f526577617264526f757465723a207374616b65644d7678547261636b65722e6160408201527607665726167655374616b6564416d6f756e7473203e203604c1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526034908201527f526577617264526f757465723a207374616b65644d7678547261636b65722e636040820152730756d756c617469766552657761726473203e20360641b606082015260800190565b60208082526038908201527f526577617264526f757465723a206d76785665737465722e7472616e73666572604082015277072656443756d756c617469766552657761726473203e20360441b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526035908201527f526577617264526f757465723a206665654d766c70547261636b65722e6176656040820152740726167655374616b6564416d6f756e7473203e203605c1b606082015260800190565b60208082526032908201527f526577617264526f757465723a206665654d766c70547261636b65722e63756d6040820152710756c617469766552657761726473203e20360741b606082015260800190565b60208082526021908201527f526577617264526f757465723a20696e76616c6964205f6d766c70416d6f756e6040820152601d60fa1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526035908201527f526577617264526f757465723a207374616b65644d766c70547261636b65722e604082015274063756d756c617469766552657761726473203e203605c1b606082015260800190565b60006101008201905060018060a01b0380845116835280602085015116602084015262ffffff6040850151166040840152806060850151166060840152506080830151608083015260a083015160a083015260c083015160c083015260e08301516153d260e0840182614926565b5092915050565b62ffffff91909116815260200190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561541157600080fd5b604052919050565b600067ffffffffffffffff82111561542f578081fd5b5060209081020190565b60005b8381101561545457818101518382015260200161543c565b83811115615463576000848401525b50505050565b6001600160a01b0381168114612a6957600080fd5b8015158114612a6957600080fdfea164736f6c634300060c000a

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

000000000000000000000000e592427a0aece92de3edee1f18e0157c058615640000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000002760e46d9bb43dafcbecaad1f64b93207f9f0ed7000000000000000000000000d1b2f8dff8437be57430ee98767d512f252ead61000000000000000000000000b6bdd10a12286401c8dfac93fe933c7abbd6d0af0000000000000000000000009f4f8bc00f48663b7c204c96b932c29ccc43a2e80000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000032848e2d3aecfa7364595609fb050a301050a6b4

-----Decoded View---------------
Arg [0] : _swapRouter (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [1] : _weth (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Arg [2] : _mvx (address): 0x2760E46d9BB43dafCbEcaad1F64b93207f9f0eD7
Arg [3] : _esMvx (address): 0xd1b2f8DFF8437BE57430Ee98767d512F252ead61
Arg [4] : _bnMvx (address): 0xB6BDd10A12286401C8DfaC93Fe933c7abBD6d0aF
Arg [5] : _mvlp (address): 0x9F4f8bc00F48663B7C204c96b932C29ccc43A2E8
Arg [6] : _usdc (address): 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
Arg [7] : _vault (address): 0x32848E2d3aeCFA7364595609FB050A301050A6B4

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [2] : 0000000000000000000000002760e46d9bb43dafcbecaad1f64b93207f9f0ed7
Arg [3] : 000000000000000000000000d1b2f8dff8437be57430ee98767d512f252ead61
Arg [4] : 000000000000000000000000b6bdd10a12286401c8dfac93fe933c7abbd6d0af
Arg [5] : 0000000000000000000000009f4f8bc00f48663b7c204c96b932c29ccc43a2e8
Arg [6] : 0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174
Arg [7] : 00000000000000000000000032848e2d3aecfa7364595609fb050a301050a6b4


Block Transaction 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
[ Download: CSV Export  ]
[ 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.