Contract 0x2318eb76f4530d0021664479b66794e2bb325d03

Contract Overview

Balance:
0 BTT
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540Handle Rewards152448702022-12-02 6:07:1866 days 13 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT559.0536
0xb13bfc3bd62579db40f4098df2513e4fcf883d48455c447a8bdf1006eeaa4ff9Stake Es Dmx151390882022-11-29 17:31:0269 days 1 hr ago0x017e10efdb065ca88fcb62452227d9a8bbeb3cbb IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT281.0484
0x91201720a5ebb47c831018ec378954806306011c7172def2863d36a64571ffa2Handle Rewards151390712022-11-29 17:30:2469 days 1 hr ago0x017e10efdb065ca88fcb62452227d9a8bbeb3cbb IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT161.7762
0x79f09fb549014b5df5f514c8f8c311acff9de4456358f61d8596976de16b90d4Accept Transfer151386872022-11-29 17:17:1269 days 2 hrs ago0x017e10efdb065ca88fcb62452227d9a8bbeb3cbb IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT269.2014
0x3bee96eeeba295690835ad9c44f5a9922a0db2b9570a1c6bd3677b511eddc3e3Signal Transfer151386562022-11-29 17:16:1069 days 2 hrs ago0xdc8baab2b29ae7a494882108bf924eb4c3f8daa5 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT84.9912
0xf38e695a2af327aef735df529357cb9dda52186e844122c74f59aacf5bc870c2Stake Es Dmx151347202022-11-29 15:00:5469 days 4 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT318.7938
0xd7b564cadeda97c9434a5e565a4d12bafaeca8c282496cf3f177a226d93cd524Handle Rewards151345302022-11-29 14:54:2269 days 4 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT308.034
0xc3a508f645c06ffc684dd08ac9af3d91f0ac1eecdd76108505c30439e37dcc6dStake Dmx151180772022-11-29 5:28:4469 days 13 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT351.1158
0x8744adb496365eefec5bcd73b51e9be4641789903641b4fdf3dd1b423380cbb4Mint And Stake D...150906382022-11-28 13:45:3470 days 5 hrs ago0x017e10efdb065ca88fcb62452227d9a8bbeb3cbb IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT613.6506
0x5680c8defabc1ebe47a0b802562d1f68ad202cc0e70ea0f1112ef80b44763190Mint And Stake D...150905182022-11-28 13:41:2670 days 5 hrs ago0xf2e3fbdc5038ca680a76bd416933abf0a1500c96 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT557.4714
0xe68c0826435da6183c52cd3cfbb3578eb09fa1fe69ac60ac4431870d421d6da8Mint And Stake D...150904832022-11-28 13:40:1270 days 5 hrs ago0xf2e3fbdc5038ca680a76bd416933abf0a1500c96 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT554.2116
0x4b9a37ce93feb90e49e5d5af4ff3babcee44c67fac6c3f19308857483fb547a9Mint And Stake D...150904492022-11-28 13:39:0470 days 5 hrs ago0xf2e3fbdc5038ca680a76bd416933abf0a1500c96 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT554.7066
0xada103b886647394694d773191e1b5bf4d1d6e9ba1e757b01b44162af6cdc50aMint And Stake D...150904122022-11-28 13:37:4670 days 5 hrs ago0xf2e3fbdc5038ca680a76bd416933abf0a1500c96 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT587.3214
0x5cb7ab5579e98857243a98952d1f5b9ffd0ddfaf926a2f080a0b433c3b15565cMint And Stake D...150903602022-11-28 13:35:5870 days 5 hrs ago0xf2e3fbdc5038ca680a76bd416933abf0a1500c96 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT619.8516
0xc706bdd0b0f27360b97995c502dd2b286b220a84b7eed8371edbfbf637ee3b26Unstake And Rede...150848902022-11-28 10:27:5870 days 8 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT552.9846
0xbeb81eeedbc049430292fbf16cddd418e542a0ac4bbaf68c4afb1bdc3ff464aeUnstake And Rede...150848292022-11-28 10:25:5270 days 8 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT554.5614
0xdbfe73990ca2a614851bb04ab5ebbf0b367969ee45c352eb63ad15fbee6c3c6eUnstake And Rede...150848012022-11-28 10:24:5670 days 8 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT562.1376
0x316e5c65f8d1faab962a1dda09dfc34c782a67dd1c01856022963f2389a128bcUnstake And Rede...150847752022-11-28 10:24:0070 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT560.3508
0x427b5cd820bfcc6eae8a88dbd15ffcf20addb04f390c98ec00c860aae51373d7Unstake And Rede...150847462022-11-28 10:23:0270 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT559.8024
0xa3eeb04219000c9e5ab33fa9334043223c7a89455f499d6f2b2be5761a517f00Unstake And Rede...150847132022-11-28 10:21:5270 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT561.5976
0x3d6a1f04d2573d8e336d8086837270bd70be6a9d620f4ed083466905f02ffd6fUnstake And Rede...150846782022-11-28 10:20:4270 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT562.6434
0x669d625ed7f7b1be2f00ee695243fb729805f59aeba7a351cc2a37a1ee2bbbbaMint And Stake D...150842002022-11-28 10:04:1470 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT554.9028
0x4f45845a58d0b5b5eb505d5e443758c0bf5d3f8c8ca88b56c1bbc20efb0fc925Mint And Stake D...150841052022-11-28 10:01:0070 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT611.5332
0x0aeeed24c1085afa631dbbcfc6da8558d516daa1f56d1303d035e108e433f5b9Mint And Stake D...150840222022-11-28 9:58:0670 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT613.7448
0xe33b54b232e7e8bb1a3447eb8b7ef84ae83677c24ce5bd0934ef000c069e60ecMint And Stake D...150839512022-11-28 9:55:4070 days 9 hrs ago0x9610f65f06337d332d08ffe1109b311d33f681d8 IN  0x2318eb76f4530d0021664479b66794e2bb325d030 BTT609.2616
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d030x9610f65f06337d332d08ffe1109b311d33f681d80 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0xdc332535823a197cf0a5e3116d319a1eea960b67 0x2318eb76f4530d0021664479b66794e2bb325d030 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xdc332535823a197cf0a5e3116d319a1eea960b670 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xf8b765b270786936ca772ee6a1cb77124fe390c40 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xc190c712a4d88796cb993c0f59c3e3653ba838160 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xc190c712a4d88796cb993c0f59c3e3653ba838160 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x81c93c4e61e66acce8598772ba572a83229447670 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xc190c712a4d88796cb993c0f59c3e3653ba838160 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x81c93c4e61e66acce8598772ba572a83229447670 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x4a3c1b517bb5e420dd2097249de80741301b29010 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xb77f53bb8e09db51832397dba429cca66f2d69e50 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x4a3c1b517bb5e420dd2097249de80741301b29010 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xc190c712a4d88796cb993c0f59c3e3653ba838160 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x81c93c4e61e66acce8598772ba572a83229447670 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x4a3c1b517bb5e420dd2097249de80741301b29010 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x6b5ee7a701b24f972bcef605a117cad64079e3840 BTT
0xa226515bf43fc6437bca0ba7cc3a0abdfcdc7de52b69fc393e6d655f82a56540152448702022-12-02 6:07:1866 days 13 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xede4aa8259a0a1ca50d607994cc586cfcfc4d1690 BTT
0xb13bfc3bd62579db40f4098df2513e4fcf883d48455c447a8bdf1006eeaa4ff9151390882022-11-29 17:31:0269 days 1 hr ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xc190c712a4d88796cb993c0f59c3e3653ba838160 BTT
0xb13bfc3bd62579db40f4098df2513e4fcf883d48455c447a8bdf1006eeaa4ff9151390882022-11-29 17:31:0269 days 1 hr ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x81c93c4e61e66acce8598772ba572a83229447670 BTT
0xb13bfc3bd62579db40f4098df2513e4fcf883d48455c447a8bdf1006eeaa4ff9151390882022-11-29 17:31:0269 days 1 hr ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x4a3c1b517bb5e420dd2097249de80741301b29010 BTT
0x91201720a5ebb47c831018ec378954806306011c7172def2863d36a64571ffa2151390712022-11-29 17:30:2469 days 1 hr ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xb77f53bb8e09db51832397dba429cca66f2d69e50 BTT
0x91201720a5ebb47c831018ec378954806306011c7172def2863d36a64571ffa2151390712022-11-29 17:30:2469 days 1 hr ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x4a3c1b517bb5e420dd2097249de80741301b29010 BTT
0x79f09fb549014b5df5f514c8f8c311acff9de4456358f61d8596976de16b90d4151386872022-11-29 17:17:1269 days 2 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0x6b5ee7a701b24f972bcef605a117cad64079e3840 BTT
0x79f09fb549014b5df5f514c8f8c311acff9de4456358f61d8596976de16b90d4151386872022-11-29 17:17:1269 days 2 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xede4aa8259a0a1ca50d607994cc586cfcfc4d1690 BTT
0x79f09fb549014b5df5f514c8f8c311acff9de4456358f61d8596976de16b90d4151386872022-11-29 17:17:1269 days 2 hrs ago 0x2318eb76f4530d0021664479b66794e2bb325d03 0xf8b765b270786936ca772ee6a1cb77124fe390c40 BTT
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x1F2Cf59C42aA150329f26b0c456b539Ef409D397

Contract Name:
RewardRouterV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 12 : RewardRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "../libraries/math/SafeMath.sol";
import "../libraries/token/IERC20.sol";
import "../libraries/token/SafeERC20.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/IDlpManager.sol";
import "../access/Governable.sol";

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

    bool public isInitialized;

    address public weth;

    address public dmx;
    address public esDmx;
    address public bnDmx;

    address public dlp; // DMX Liquidity Provider token

    address public stakedDmxTracker;
    address public bonusDmxTracker;
    address public feeDmxTracker;

    address public stakedDlpTracker;
    address public feeDlpTracker;

    address public dlpManager;

    address public dmxVester;
    address public dlpVester;

    mapping (address => address) public pendingReceivers;

    event StakeDmx(address account, address token, uint256 amount);
    event UnstakeDmx(address account, address token, uint256 amount);

    event StakeDlp(address account, uint256 amount);
    event UnstakeDlp(address account, uint256 amount);

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

    function initialize(
        address _weth,
        address _dmx,
        address _esDmx,
        address _bnDmx,
        address _dlp,
        address _stakedDmxTracker,
        address _bonusDmxTracker,
        address _feeDmxTracker,
        address _feeDlpTracker,
        address _stakedDlpTracker,
        address _dlpManager,
        address _dmxVester,
        address _dlpVester
    ) external onlyGov {
        require(!isInitialized, "RewardRouter: already initialized");
        isInitialized = true;

        weth = _weth;

        dmx = _dmx;
        esDmx = _esDmx;
        bnDmx = _bnDmx;

        dlp = _dlp;

        stakedDmxTracker = _stakedDmxTracker;
        bonusDmxTracker = _bonusDmxTracker;
        feeDmxTracker = _feeDmxTracker;

        feeDlpTracker = _feeDlpTracker;
        stakedDlpTracker = _stakedDlpTracker;

        dlpManager = _dlpManager;

        dmxVester = _dmxVester;
        dlpVester = _dlpVester;
    }

    // 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 batchStakeDmxForAccount(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyGov {
        address _dmx = dmx;
        for (uint256 i = 0; i < _accounts.length; i++) {
            _stakeDmx(msg.sender, _accounts[i], _dmx, _amounts[i]);
        }
    }

    function stakeDmxForAccount(address _account, uint256 _amount) external nonReentrant onlyGov {
        _stakeDmx(msg.sender, _account, dmx, _amount);
    }

    function stakeDmx(uint256 _amount) external nonReentrant {
        _stakeDmx(msg.sender, msg.sender, dmx, _amount);
    }

    function stakeEsDmx(uint256 _amount) external nonReentrant {
        _stakeDmx(msg.sender, msg.sender, esDmx, _amount);
    }

    function unstakeDmx(uint256 _amount) external nonReentrant {
        _unstakeDmx(msg.sender, dmx, _amount, true);
    }

    function unstakeEsDmx(uint256 _amount) external nonReentrant {
        _unstakeDmx(msg.sender, esDmx, _amount, true);
    }

    function mintAndStakeDlp(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minDlp) external nonReentrant returns (uint256) {
        require(_amount > 0, "RewardRouter: invalid _amount");

        address account = msg.sender;
        uint256 dlpAmount = IDlpManager(dlpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdg, _minDlp);
        IRewardTracker(feeDlpTracker).stakeForAccount(account, account, dlp, dlpAmount);
        IRewardTracker(stakedDlpTracker).stakeForAccount(account, account, feeDlpTracker, dlpAmount);

        emit StakeDlp(account, dlpAmount);

        return dlpAmount;
    }

    function mintAndStakeDlpETH(uint256 _minUsdg, uint256 _minDlp) external payable nonReentrant returns (uint256) {
        require(msg.value > 0, "RewardRouter: invalid msg.value");

        IWETH(weth).deposit{value: msg.value}();
        IERC20(weth).approve(dlpManager, msg.value);

        address account = msg.sender;
        uint256 dlpAmount = IDlpManager(dlpManager).addLiquidityForAccount(address(this), account, weth, msg.value, _minUsdg, _minDlp);

        IRewardTracker(feeDlpTracker).stakeForAccount(account, account, dlp, dlpAmount);
        IRewardTracker(stakedDlpTracker).stakeForAccount(account, account, feeDlpTracker, dlpAmount);

        emit StakeDlp(account, dlpAmount);

        return dlpAmount;
    }

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

        address account = msg.sender;
        IRewardTracker(stakedDlpTracker).unstakeForAccount(account, feeDlpTracker, _dlpAmount, account);
        IRewardTracker(feeDlpTracker).unstakeForAccount(account, dlp, _dlpAmount, account);
        uint256 amountOut = IDlpManager(dlpManager).removeLiquidityForAccount(account, _tokenOut, _dlpAmount, _minOut, _receiver);

        emit UnstakeDlp(account, _dlpAmount);

        return amountOut;
    }

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

        address account = msg.sender;
        IRewardTracker(stakedDlpTracker).unstakeForAccount(account, feeDlpTracker, _dlpAmount, account);
        IRewardTracker(feeDlpTracker).unstakeForAccount(account, dlp, _dlpAmount, account);
        uint256 amountOut = IDlpManager(dlpManager).removeLiquidityForAccount(account, weth, _dlpAmount, _minOut, address(this));

        IWETH(weth).withdraw(amountOut);

        _receiver.sendValue(amountOut);

        emit UnstakeDlp(account, _dlpAmount);

        return amountOut;
    }

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

        IRewardTracker(feeDmxTracker).claimForAccount(account, account);
        IRewardTracker(feeDlpTracker).claimForAccount(account, account);

        IRewardTracker(stakedDmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedDlpTracker).claimForAccount(account, account);
    }

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

        IRewardTracker(stakedDmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedDlpTracker).claimForAccount(account, account);
    }

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

        IRewardTracker(feeDmxTracker).claimForAccount(account, account);
        IRewardTracker(feeDlpTracker).claimForAccount(account, account);
    }

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

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

    function handleRewards(
        bool _shouldClaimDmx,
        bool _shouldStakeDmx,
        bool _shouldClaimEsDmx,
        bool _shouldStakeEsDmx,
        bool _shouldStakeMultiplierPoints,
        bool _shouldClaimWeth,
        bool _shouldConvertWethToEth
    ) external nonReentrant {
        address account = msg.sender;

        uint256 dmxAmount = 0;
        if (_shouldClaimDmx) {
            uint256 dmxAmount0 = IVester(dmxVester).claimForAccount(account, account);
            uint256 dmxAmount1 = IVester(dlpVester).claimForAccount(account, account);
            dmxAmount = dmxAmount0.add(dmxAmount1);
        }

        if (_shouldStakeDmx && dmxAmount > 0) {
            _stakeDmx(account, account, dmx, dmxAmount);
        }

        uint256 esDmxAmount = 0;
        if (_shouldClaimEsDmx) {
            uint256 esDmxAmount0 = IRewardTracker(stakedDmxTracker).claimForAccount(account, account);
            uint256 esDmxAmount1 = IRewardTracker(stakedDlpTracker).claimForAccount(account, account);
            esDmxAmount = esDmxAmount0.add(esDmxAmount1);
        }

        if (_shouldStakeEsDmx && esDmxAmount > 0) {
            _stakeDmx(account, account, esDmx, esDmxAmount);
        }

        if (_shouldStakeMultiplierPoints) {
            uint256 bnDmxAmount = IRewardTracker(bonusDmxTracker).claimForAccount(account, account);
            if (bnDmxAmount > 0) {
                IRewardTracker(feeDmxTracker).stakeForAccount(account, account, bnDmx, bnDmxAmount);
            }
        }

        if (_shouldClaimWeth) {
            if (_shouldConvertWethToEth) {
                uint256 weth0 = IRewardTracker(feeDmxTracker).claimForAccount(account, address(this));
                uint256 weth1 = IRewardTracker(feeDlpTracker).claimForAccount(account, address(this));

                uint256 wethAmount = weth0.add(weth1);
                IWETH(weth).withdraw(wethAmount);

                payable(account).sendValue(wethAmount);
            } else {
                IRewardTracker(feeDmxTracker).claimForAccount(account, account);
                IRewardTracker(feeDlpTracker).claimForAccount(account, account);
            }
        }
    }

    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(dmxVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(dlpVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");

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

    function acceptTransfer(address _sender) external nonReentrant {
        require(IERC20(dmxVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(dlpVester).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 stakedDmx = IRewardTracker(stakedDmxTracker).depositBalances(_sender, dmx);
        if (stakedDmx > 0) {
            _unstakeDmx(_sender, dmx, stakedDmx, false);
            _stakeDmx(_sender, receiver, dmx, stakedDmx);
        }

        uint256 stakedEsDmx = IRewardTracker(stakedDmxTracker).depositBalances(_sender, esDmx);
        if (stakedEsDmx > 0) {
            _unstakeDmx(_sender, esDmx, stakedEsDmx, false);
            _stakeDmx(_sender, receiver, esDmx, stakedEsDmx);
        }

        uint256 stakedBnDmx = IRewardTracker(feeDmxTracker).depositBalances(_sender, bnDmx);
        if (stakedBnDmx > 0) {
            IRewardTracker(feeDmxTracker).unstakeForAccount(_sender, bnDmx, stakedBnDmx, _sender);
            IRewardTracker(feeDmxTracker).stakeForAccount(_sender, receiver, bnDmx, stakedBnDmx);
        }

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

        uint256 dlpAmount = IRewardTracker(feeDlpTracker).depositBalances(_sender, dlp);
        if (dlpAmount > 0) {
            IRewardTracker(stakedDlpTracker).unstakeForAccount(_sender, feeDlpTracker, dlpAmount, _sender);
            IRewardTracker(feeDlpTracker).unstakeForAccount(_sender, dlp, dlpAmount, _sender);

            IRewardTracker(feeDlpTracker).stakeForAccount(_sender, receiver, dlp, dlpAmount);
            IRewardTracker(stakedDlpTracker).stakeForAccount(receiver, receiver, feeDlpTracker, dlpAmount);
        }

        IVester(dmxVester).transferStakeValues(_sender, receiver);
        IVester(dlpVester).transferStakeValues(_sender, receiver);
    }

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

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

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

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

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

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

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

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

    function _compound(address _account) private {
        _compoundDmx(_account);
        _compoundDlp(_account);
    }

    function _compoundDmx(address _account) private {
        uint256 esDmxAmount = IRewardTracker(stakedDmxTracker).claimForAccount(_account, _account);
        if (esDmxAmount > 0) {
            _stakeDmx(_account, _account, esDmx, esDmxAmount);
        }

        uint256 bnDmxAmount = IRewardTracker(bonusDmxTracker).claimForAccount(_account, _account);
        if (bnDmxAmount > 0) {
            IRewardTracker(feeDmxTracker).stakeForAccount(_account, _account, bnDmx, bnDmxAmount);
        }
    }

    function _compoundDlp(address _account) private {
        uint256 esDmxAmount = IRewardTracker(stakedDlpTracker).claimForAccount(_account, _account);
        if (esDmxAmount > 0) {
            _stakeDmx(_account, _account, esDmx, esDmxAmount);
        }
    }

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

        IRewardTracker(stakedDmxTracker).stakeForAccount(_fundingAccount, _account, _token, _amount);
        IRewardTracker(bonusDmxTracker).stakeForAccount(_account, _account, stakedDmxTracker, _amount);
        IRewardTracker(feeDmxTracker).stakeForAccount(_account, _account, bonusDmxTracker, _amount);

        emit StakeDmx(_account, _token, _amount);
    }

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

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

        IRewardTracker(feeDmxTracker).unstakeForAccount(_account, bonusDmxTracker, _amount, _account);
        IRewardTracker(bonusDmxTracker).unstakeForAccount(_account, stakedDmxTracker, _amount, _account);
        IRewardTracker(stakedDmxTracker).unstakeForAccount(_account, _token, _amount, _account);

        if (_shouldReduceBnDmx) {
            uint256 bnDmxAmount = IRewardTracker(bonusDmxTracker).claimForAccount(_account, _account);
            if (bnDmxAmount > 0) {
                IRewardTracker(feeDmxTracker).stakeForAccount(_account, _account, bnDmx, bnDmxAmount);
            }

            uint256 stakedBnDmx = IRewardTracker(feeDmxTracker).depositBalances(_account, bnDmx);
            if (stakedBnDmx > 0) {
                uint256 reductionAmount = stakedBnDmx.mul(_amount).div(balance);
                IRewardTracker(feeDmxTracker).unstakeForAccount(_account, bnDmx, reductionAmount, _account);
                IMintable(bnDmx).burn(_account, reductionAmount);
            }
        }

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

File 2 of 12 : 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 3 of 12 : 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 12 : 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 5 of 12 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 12 : 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 7 of 12 : 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 8 of 12 : 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 9 of 12 : 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 10 of 12 : 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 11 of 12 : IDlpManager.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IDlpManager {
    function usdg() external view returns (address);
    function cooldownDuration() external returns (uint256);
    function getAumInUsdg(bool maximise) external view returns (uint256);
    function lastAddedAt(address _account) external returns (uint256);
    function addLiquidity(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minDlp) external returns (uint256);
    function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minDlp) external returns (uint256);
    function removeLiquidity(address _tokenOut, uint256 _dlpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _dlpAmount, uint256 _minOut, address _receiver) external returns (uint256);
}

File 12 of 12 : 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;
}

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

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeDlp","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":"StakeDmx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeDlp","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":"UnstakeDmx","type":"event"},{"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":"batchStakeDmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bnDmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusDmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsDmx","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":"dlp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dlpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dlpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dmxVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"esDmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeDmxTracker","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":"_shouldClaimDmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeDmx","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsDmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsDmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimWeth","type":"bool"},{"internalType":"bool","name":"_shouldConvertWethToEth","type":"bool"}],"name":"handleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_dmx","type":"address"},{"internalType":"address","name":"_esDmx","type":"address"},{"internalType":"address","name":"_bnDmx","type":"address"},{"internalType":"address","name":"_dlp","type":"address"},{"internalType":"address","name":"_stakedDmxTracker","type":"address"},{"internalType":"address","name":"_bonusDmxTracker","type":"address"},{"internalType":"address","name":"_feeDmxTracker","type":"address"},{"internalType":"address","name":"_feeDlpTracker","type":"address"},{"internalType":"address","name":"_stakedDlpTracker","type":"address"},{"internalType":"address","name":"_dlpManager","type":"address"},{"internalType":"address","name":"_dmxVester","type":"address"},{"internalType":"address","name":"_dlpVester","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":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minDlp","type":"uint256"}],"name":"mintAndStakeDlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minDlp","type":"uint256"}],"name":"mintAndStakeDlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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":"stakeDmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeDmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsDmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedDlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedDmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_dlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemDlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemDlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeDmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsDmx","outputs":[],"stateMutability":"nonpayable","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"}]

608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556153a4806100376000396000f3fe6080604052600436106101b95760003560e01c806301e336671461021d57806311d5aaea1461026057806312d43a51146102915780631af276a6146102a65780631ce32e2f146103545780632a9f40831461037e5780632fa5b657146103b15780632fdd983d146103e657806330b700021461048157806337780876146104dd578063392e53cd146104f25780633fc8cef31461051b5780634822a255146105305780634d7d6dd91461055a5780634e71d92d1461056f57806352094de51461058457806357e2f91f1461059957806361673f22146105de578063655603a4146105f35780636b003e30146106265780636fd8fab61461063b57806374937a43146106505780637523b2ce1461066557806381a4ec621461067a57806396af45241461068f578063a2484346146106c8578063ae7b20bd146106dd578063c185892814610724578063c359bb2814610739578063cfad57a214610763578063d294f09314610796578063dc9e7fbd146107ab578063e1b9db89146108db578063ec232a421461090e578063ed12a2c714610938578063ef9aacfd14610977578063f1992b8f146109aa578063f69e2046146109bf57610218565b36610218576002546001600160a01b03163314610216576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561022957600080fd5b506102166004803603606081101561024057600080fd5b506001600160a01b038135811691602081013590911690604001356109d4565b34801561026c57600080fd5b50610275610a3a565b604080516001600160a01b039092168252519081900360200190f35b34801561029d57600080fd5b50610275610a49565b3480156102b257600080fd5b50610216600480360360208110156102c957600080fd5b810190602081018135600160201b8111156102e357600080fd5b8201836020820111156102f557600080fd5b803590602001918460208302840111600160201b8311171561031657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a58945050505050565b34801561036057600080fd5b506102166004803603602081101561037757600080fd5b5035610b29565b34801561038a57600080fd5b50610216600480360360208110156103a157600080fd5b50356001600160a01b0316610b96565b6103d4600480360360408110156103c757600080fd5b5080359060200135610c37565b60408051918252519081900360200190f35b3480156103f257600080fd5b5061021660048036036101a081101561040a57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e08101358216916101008201358116916101208101358216916101408201358116916101608101358216916101809091013516610fa2565b34801561048d57600080fd5b50610216600480360360e08110156104a457600080fd5b508035151590602081013515159060408101351515906060810135151590608081013515159060a081013515159060c00135151561112f565b3480156104e957600080fd5b506102166117f1565b3480156104fe57600080fd5b5061050761194c565b604080519115158252519081900360200190f35b34801561052757600080fd5b5061027561195c565b34801561053c57600080fd5b506102166004803603602081101561055357600080fd5b503561196b565b34801561056657600080fd5b506102756119d0565b34801561057b57600080fd5b506102166119df565b34801561059057600080fd5b50610275611b88565b3480156105a557600080fd5b506103d4600480360360808110156105bc57600080fd5b506001600160a01b038135169060208101359060408101359060600135611b97565b3480156105ea57600080fd5b50610275611e05565b3480156105ff57600080fd5b506102166004803603602081101561061657600080fd5b50356001600160a01b0316611e14565b34801561063257600080fd5b5061027561281d565b34801561064757600080fd5b5061027561282c565b34801561065c57600080fd5b5061027561283b565b34801561067157600080fd5b5061027561284a565b34801561068657600080fd5b50610275612859565b34801561069b57600080fd5b50610216600480360360408110156106b257600080fd5b506001600160a01b038135169060200135612868565b3480156106d457600080fd5b5061027561291a565b3480156106e957600080fd5b506103d46004803603608081101561070057600080fd5b506001600160a01b0381358116916020810135916040820135916060013516612929565b34801561073057600080fd5b50610275612b99565b34801561074557600080fd5b506102166004803603602081101561075c57600080fd5b5035612ba8565b34801561076f57600080fd5b506102166004803603602081101561078657600080fd5b50356001600160a01b0316612c0d565b3480156107a257600080fd5b50610216612c7c565b3480156107b757600080fd5b50610216600480360360408110156107ce57600080fd5b810190602081018135600160201b8111156107e857600080fd5b8201836020820111156107fa57600080fd5b803590602001918460208302840111600160201b8311171561081b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561086a57600080fd5b82018360208201111561087c57600080fd5b803590602001918460208302840111600160201b8311171561089d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612da3945050505050565b3480156108e757600080fd5b50610275600480360360208110156108fe57600080fd5b50356001600160a01b0316612e98565b34801561091a57600080fd5b506102166004803603602081101561093157600080fd5b5035612eb3565b34801561094457600080fd5b506103d46004803603606081101561095b57600080fd5b50803590602081013590604001356001600160a01b0316612f18565b34801561098357600080fd5b506102166004803603602081101561099a57600080fd5b50356001600160a01b0316613201565b3480156109b657600080fd5b506102756133ef565b3480156109cb57600080fd5b506102166133fe565b6001546001600160a01b03163314610a21576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b610a356001600160a01b0384168383613459565b505050565b6003546001600160a01b031681565b6001546001600160a01b031681565b60026000541415610a9e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610af0576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b60005b8151811015610b2057610b18828281518110610b0b57fe5b60200260200101516134ab565b600101610af3565b50506001600055565b60026000541415610b6f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610b8e9033906001600160a01b03168360016134c0565b506001600055565b60026000541415610bdc576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610c2e576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b610b8e816134ab565b600060026000541415610c7f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005534610cd6576040805162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015290519081900360640190fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d2657600080fd5b505af1158015610d3a573d6000803e3d6000fd5b5050600254600c546040805163095ea7b360e01b81526001600160a01b039283166004820152346024820152905191909216945063095ea7b39350604480830193506020928290030181600087803b158015610d9557600080fd5b505af1158015610da9573d6000803e3d6000fd5b505050506040513d6020811015610dbf57600080fd5b5050600c54600254604080516317eb2a1560e01b815230600482015233602482018190526001600160a01b0393841660448301523460648301526084820188905260a482018790529151919360009316916317eb2a159160c48082019260209290919082900301818787803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015610ecc57600080fd5b505af1158015610ee0573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015610f4b57600080fd5b505af1158015610f5f573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590528151600080516020614f2b8339815191529450908190039091019150a16001600055949350505050565b6001546001600160a01b03163314610fef576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b600154600160a01b900460ff16156110385760405162461bcd60e51b81526004018080602001828103825260218152602001806150566021913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039e8f166001600160a01b031991821617909155600380549d8f169d82169d909d17909c55600480549b8e169b8d169b909b17909a5560058054998d16998c169990991790985560068054978c16978b169790971790965560078054958b16958a169590951790945560088054938a169389169390931790925560098054918916918816919091179055600b8054918816918716919091179055600a8054918716918616919091179055600c8054918616918516919091179055600d8054918516918416919091179055600e8054919093169116179055565b60026000541415611175576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155339088156112a157600d54604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156111dd57600080fd5b505af11580156111f1573d6000803e3d6000fd5b505050506040513d602081101561120757600080fd5b5051600e54604080516309f4173d60e11b81526001600160a01b03878116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561126457600080fd5b505af1158015611278573d6000803e3d6000fd5b505050506040513d602081101561128e57600080fd5b5051905061129c8282613a02565b925050505b8780156112ae5750600081115b156112cd576003546112cd90839081906001600160a01b031684613a63565b600087156113f257600754604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561132e57600080fd5b505af1158015611342573d6000803e3d6000fd5b505050506040513d602081101561135857600080fd5b5051600a54604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b1580156113b557600080fd5b505af11580156113c9573d6000803e3d6000fd5b505050506040513d60208110156113df57600080fd5b505190506113ed8282613a02565b925050505b8680156113ff5750600081115b1561141e5760045461141e90849081906001600160a01b031684613a63565b851561153357600854604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561147d57600080fd5b505af1158015611491573d6000803e3d6000fd5b505050506040513d60208110156114a757600080fd5b5051905080156115315760095460055460408051631e42d69b60e21b81526001600160a01b038881166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b15801561151857600080fd5b505af115801561152c573d6000803e3d6000fd5b505050505b505b84156117e05783156116db57600954604080516309f4173d60e11b81526001600160a01b038681166004830152306024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561159757600080fd5b505af11580156115ab573d6000803e3d6000fd5b505050506040513d60208110156115c157600080fd5b5051600b54604080516309f4173d60e11b81526001600160a01b038881166004830152306024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561161d57600080fd5b505af1158015611631573d6000803e3d6000fd5b505050506040513d602081101561164757600080fd5b5051905060006116578383613a02565b60025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156116a757600080fd5b505af11580156116bb573d6000803e3d6000fd5b506116d3925050506001600160a01b03871682613c72565b5050506117e0565b600954604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561173157600080fd5b505af1158015611745573d6000803e3d6000fd5b505050506040513d602081101561175b57600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b1580156117b357600080fd5b505af11580156117c7573d6000803e3d6000fd5b505050506040513d60208110156117dd57600080fd5b50505b505060016000555050505050505050565b60026000541415611837576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600754604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b15801561189657600080fd5b505af11580156118aa573d6000803e3d6000fd5b505050506040513d60208110156118c057600080fd5b5050600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561191857600080fd5b505af115801561192c573d6000803e3d6000fd5b505050506040513d602081101561194257600080fd5b5050600160005550565b600154600160a01b900460ff1681565b6002546001600160a01b031681565b600260005414156119b1576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610b8e90339081906001600160a01b031684613a63565b600a546001600160a01b031681565b60026000541415611a25576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015611a8457600080fd5b505af1158015611a98573d6000803e3d6000fd5b505050506040513d6020811015611aae57600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611b0657600080fd5b505af1158015611b1a573d6000803e3d6000fd5b505050506040513d6020811015611b3057600080fd5b5050600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561189657600080fd5b600e546001600160a01b031681565b600060026000541415611bdf576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583611c24576040805162461bcd60e51b815260206004820152601d602482015260008051602061534f833981519152604482015290519081900360640190fd5b600c54604080516317eb2a1560e01b81523360048201819052602482018190526001600160a01b038981166044840152606483018990526084830188905260a483018790529251909360009316916317eb2a159160c480830192602092919082900301818787803b158015611c9857600080fd5b505af1158015611cac573d6000803e3d6000fd5b505050506040513d6020811015611cc257600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015611d2d57600080fd5b505af1158015611d41573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015611dac57600080fd5b505af1158015611dc0573d6000803e3d6000fd5b5050604080516001600160a01b0386168152602081018590528151600080516020614f2b8339815191529450908190039091019150a160016000559695505050505050565b600d546001600160a01b031681565b60026000541415611e5a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611eac57600080fd5b505afa158015611ec0573d6000803e3d6000fd5b505050506040513d6020811015611ed657600080fd5b505115611f145760405162461bcd60e51b8152600401808060200182810382526026815260200180614fb66026913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611f6157600080fd5b505afa158015611f75573d6000803e3d6000fd5b505050506040513d6020811015611f8b57600080fd5b505115611fc95760405162461bcd60e51b8152600401808060200182810382526026815260200180614fb66026913960400191505060405180910390fd5b6001600160a01b038181166000908152600f602052604090205433911681146120235760405162461bcd60e51b815260040180806020018281038252602481526020018061515d6024913960400191505060405180910390fd5b6001600160a01b0382166000908152600f6020526040902080546001600160a01b031916905561205281613d57565b61205b826134ab565b60075460035460408051637aeceb1f60e11b81526001600160a01b03868116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156120b757600080fd5b505afa1580156120cb573d6000803e3d6000fd5b505050506040513d60208110156120e157600080fd5b50519050801561211f576003546121059084906001600160a01b03168360006134c0565b60035461211f90849084906001600160a01b031684613a63565b6007546004805460408051637aeceb1f60e11b81526001600160a01b0388811694820194909452918316602483015251600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561217d57600080fd5b505afa158015612191573d6000803e3d6000fd5b505050506040513d60208110156121a757600080fd5b5051905080156121e5576004546121cb9085906001600160a01b03168360006134c0565b6004546121e590859085906001600160a01b031684613a63565b60095460055460408051637aeceb1f60e11b81526001600160a01b03888116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561224157600080fd5b505afa158015612255573d6000803e3d6000fd5b505050506040513d602081101561226b57600080fd5b505190508015612378576009546005546040805163098bf59d60e01b81526001600160a01b038981166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b1580156122df57600080fd5b505af11580156122f3573d6000803e3d6000fd5b505060095460055460408051631e42d69b60e21b81526001600160a01b038b811660048301528a81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561235f57600080fd5b505af1158015612373573d6000803e3d6000fd5b505050505b6000600460009054906101000a90046001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123dc57600080fd5b505afa1580156123f0573d6000803e3d6000fd5b505050506040513d602081101561240657600080fd5b50519050801561249f5760048054604080516323b872dd60e01b81526001600160a01b038a811694820194909452888416602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b15801561247257600080fd5b505af1158015612486573d6000803e3d6000fd5b505050506040513d602081101561249c57600080fd5b50505b600b5460065460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156124fb57600080fd5b505afa15801561250f573d6000803e3d6000fd5b505050506040513d602081101561252557600080fd5b50519050801561273357600a54600b546040805163098bf59d60e01b81526001600160a01b038b81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561259957600080fd5b505af11580156125ad573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b5050600b5460065460408051631e42d69b60e21b81526001600160a01b038d811660048301528c81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561269b57600080fd5b505af11580156126af573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b038c8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561271a57600080fd5b505af115801561272e573d6000803e3d6000fd5b505050505b600d5460408051630f713c2360e41b81526001600160a01b038a8116600483015289811660248301529151919092169163f713c23091604480830192600092919082900301818387803b15801561278957600080fd5b505af115801561279d573d6000803e3d6000fd5b5050600e5460408051630f713c2360e41b81526001600160a01b038c811660048301528b81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b1580156127f757600080fd5b505af115801561280b573d6000803e3d6000fd5b50506001600055505050505050505050565b6009546001600160a01b031681565b6006546001600160a01b031681565b600b546001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b031681565b600260005414156128ae576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314612900576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b600354610b2090339084906001600160a01b031684613a63565b6005546001600160a01b031681565b600060026000541415612971576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055836129b6576040805162461bcd60e51b81526020600482018190526024820152600080516020614ffc833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015612a1f57600080fd5b505af1158015612a33573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015612aa157600080fd5b505af1158015612ab5573d6000803e3d6000fd5b5050600c54604080516371d597ad60e01b81526001600160a01b0386811660048301528b81166024830152604482018b9052606482018a905288811660848301529151600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015612b2957600080fd5b505af1158015612b3d573d6000803e3d6000fd5b505050506040513d6020811015612b5357600080fd5b5051604080516001600160a01b0385168152602081018990528151929350600080516020615181833981519152929081900390910190a160016000559695505050505050565b6004546001600160a01b031681565b60026000541415612bee576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610b8e90339081906001600160a01b031684613a63565b6001546001600160a01b03163314612c5a576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415612cc2576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015612d2157600080fd5b505af1158015612d35573d6000803e3d6000fd5b505050506040513d6020811015612d4b57600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561191857600080fd5b60026000541415612de9576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314612e3b576040805162461bcd60e51b81526020600482015260156024820152600080516020614fdc833981519152604482015290519081900360640190fd5b6003546001600160a01b031660005b8351811015612e8d57612e8533858381518110612e6357fe5b602002602001015184868581518110612e7857fe5b6020026020010151613a63565b600101612e4a565b505060016000555050565b600f602052600090815260409020546001600160a01b031681565b60026000541415612ef9576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610b8e9033906001600160a01b03168360016134c0565b600060026000541415612f60576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583612fa5576040805162461bcd60e51b81526020600482018190526024820152600080516020614ffc833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b15801561300e57600080fd5b505af1158015613022573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561309057600080fd5b505af11580156130a4573d6000803e3d6000fd5b5050600c54600254604080516371d597ad60e01b81526001600160a01b0387811660048301529283166024820152604481018b9052606481018a90523060848201529051600095509190921692506371d597ad9160a48082019260209290919082900301818787803b15801561311957600080fd5b505af115801561312d573d6000803e3d6000fd5b505050506040513d602081101561314357600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b15801561319557600080fd5b505af11580156131a9573d6000803e3d6000fd5b506131c1925050506001600160a01b03851682613c72565b604080516001600160a01b0384168152602081018890528151600080516020615181833981519152929181900390910190a1600160005595945050505050565b60026000541415613247576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561329757600080fd5b505afa1580156132ab573d6000803e3d6000fd5b505050506040513d60208110156132c157600080fd5b5051156132ff5760405162461bcd60e51b8152600401808060200182810382526026815260200180614fb66026913960400191505060405180910390fd5b600e54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561334a57600080fd5b505afa15801561335e573d6000803e3d6000fd5b505050506040513d602081101561337457600080fd5b5051156133b25760405162461bcd60e51b8152600401808060200182810382526026815260200180614fb66026913960400191505060405180910390fd5b6133bb81613d57565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b600c546001600160a01b031681565b60026000541415613444576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055613452336134ab565b6001600055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a359084906148a7565b6134b481614958565b6134bd81614b10565b50565b60008211613503576040805162461bcd60e51b815260206004820152601d602482015260008051602061534f833981519152604482015290519081900360640190fd5b600754604080516310c1c10360e01b81526001600160a01b038781166004830152915160009392909216916310c1c10391602480820192602092909190829003018186803b15801561355457600080fd5b505afa158015613568573d6000803e3d6000fd5b505050506040513d602081101561357e57600080fd5b50516009546008546040805163098bf59d60e01b81526001600160a01b038a8116600483018190529381166024830152604482018990526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b1580156135ec57600080fd5b505af1158015613600573d6000803e3d6000fd5b50506008546007546040805163098bf59d60e01b81526001600160a01b038b8116600483018190529381166024830152604482018a90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561366e57600080fd5b505af1158015613682573d6000803e3d6000fd5b50506007546040805163098bf59d60e01b81526001600160a01b038a8116600483018190528a82166024840152604483018a90526064830152915191909216935063098bf59d9250608480830192600092919082900301818387803b1580156136ea57600080fd5b505af11580156136fe573d6000803e3d6000fd5b5050505081156139b157600854604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561376157600080fd5b505af1158015613775573d6000803e3d6000fd5b505050506040513d602081101561378b57600080fd5b5051905080156138155760095460055460408051631e42d69b60e21b81526001600160a01b038a81166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156137fc57600080fd5b505af1158015613810573d6000803e3d6000fd5b505050505b60095460055460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561387157600080fd5b505afa158015613885573d6000803e3d6000fd5b505050506040513d602081101561389b57600080fd5b5051905080156139ae5760006138bb846138b58489614bbb565b90614c14565b6009546005546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018690526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b15801561392757600080fd5b505af115801561393b573d6000803e3d6000fd5b505060055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018790529151919092169350639dc29fac9250604480830192600092919082900301818387803b15801561399457600080fd5b505af11580156139a8573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b0380881682528616602082015280820185905290517fadd6c4388d59f0dd654e786f3f5667cd79087a7f66b9309b9a86c70aff716ca89181900360600190a15050505050565b600082820183811015613a5a576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b60008111613aa6576040805162461bcd60e51b815260206004820152601d602482015260008051602061534f833981519152604482015290519081900360640190fd5b60075460408051631e42d69b60e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163790b5a6c91608480830192600092919082900301818387803b158015613b0b57600080fd5b505af1158015613b1f573d6000803e3d6000fd5b505060085460075460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613b8a57600080fd5b505af1158015613b9e573d6000803e3d6000fd5b505060095460085460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613c0957600080fd5b505af1158015613c1d573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517fcfbc12218f7b057b1344908a8071a23f3719fbcac2eada6a11ed5dbb318474019350908190036060019150a150505050565b80471015613cc7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114613d12576040519150601f19603f3d011682016040523d82523d6000602084013e613d17565b606091505b5050905080610a355760405162461bcd60e51b815260040180806020018281038252603a81526020018061501c603a913960400191505060405180910390fd5b6007546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613da457600080fd5b505afa158015613db8573d6000803e3d6000fd5b505050506040513d6020811015613dce57600080fd5b505115613e0c5760405162461bcd60e51b81526004018080602001828103825260378152602001806152ee6037913960400191505060405180910390fd5b60075460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613e5957600080fd5b505afa158015613e6d573d6000803e3d6000fd5b505050506040513d6020811015613e8357600080fd5b505115613ec15760405162461bcd60e51b8152600401808060200182810382526034815260200180614ed76034913960400191505060405180910390fd5b6008546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d6020811015613f3857600080fd5b505115613f765760405162461bcd60e51b815260040180806020018281038252603681526020018061509d6036913960400191505060405180910390fd5b60085460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613fc357600080fd5b505afa158015613fd7573d6000803e3d6000fd5b505050506040513d6020811015613fed57600080fd5b50511561402b5760405162461bcd60e51b81526004018080602001828103825260338152602001806151076033913960400191505060405180910390fd5b6009546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561407857600080fd5b505afa15801561408c573d6000803e3d6000fd5b505050506040513d60208110156140a257600080fd5b5051156140e05760405162461bcd60e51b81526004018080602001828103825260348152602001806150d36034913960400191505060405180910390fd5b60095460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561412d57600080fd5b505afa158015614141573d6000803e3d6000fd5b505050506040513d602081101561415757600080fd5b5051156141955760405162461bcd60e51b81526004018080602001828103825260318152602001806152316031913960400191505060405180910390fd5b600d5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b1580156141e257600080fd5b505afa1580156141f6573d6000803e3d6000fd5b505050506040513d602081101561420c57600080fd5b50511561424a5760405162461bcd60e51b815260040180806020018281038252603b8152602001806151c2603b913960400191505060405180910390fd5b600d5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b15801561429757600080fd5b505afa1580156142ab573d6000803e3d6000fd5b505050506040513d60208110156142c157600080fd5b5051156142ff5760405162461bcd60e51b81526004018080602001828103825260388152602001806152b66038913960400191505060405180910390fd5b600a546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561434c57600080fd5b505afa158015614360573d6000803e3d6000fd5b505050506040513d602081101561437657600080fd5b5051156143b45760405162461bcd60e51b8152600401808060200182810382526037815260200180614f7f6037913960400191505060405180910390fd5b600a5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561440157600080fd5b505afa158015614415573d6000803e3d6000fd5b505050506040513d602081101561442b57600080fd5b5051156144695760405162461bcd60e51b81526004018080602001828103825260348152602001806151fd6034913960400191505060405180910390fd5b600b546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b1580156144b657600080fd5b505afa1580156144ca573d6000803e3d6000fd5b505050506040513d60208110156144e057600080fd5b50511561451e5760405162461bcd60e51b8152600401808060200182810382526034815260200180614f4b6034913960400191505060405180910390fd5b600b5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561456b57600080fd5b505afa15801561457f573d6000803e3d6000fd5b505050506040513d602081101561459557600080fd5b5051156145d35760405162461bcd60e51b81526004018080602001828103825260318152602001806152856031913960400191505060405180910390fd5b600e5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b15801561462057600080fd5b505afa158015614634573d6000803e3d6000fd5b505050506040513d602081101561464a57600080fd5b5051156146885760405162461bcd60e51b815260040180806020018281038252603b8152602001806151c2603b913960400191505060405180910390fd5b600e5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b1580156146d557600080fd5b505afa1580156146e9573d6000803e3d6000fd5b505050506040513d60208110156146ff57600080fd5b50511561473d5760405162461bcd60e51b81526004018080602001828103825260388152602001806152b66038913960400191505060405180910390fd5b600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561478a57600080fd5b505afa15801561479e573d6000803e3d6000fd5b505050506040513d60208110156147b457600080fd5b5051156147f25760405162461bcd60e51b81526004018080602001828103825260238152602001806152626023913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561483f57600080fd5b505afa158015614853573d6000803e3d6000fd5b505050506040513d602081101561486957600080fd5b5051156134bd5760405162461bcd60e51b815260040180806020018281038252602381526020018061513a6023913960400191505060405180910390fd5b60606148fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c539092919063ffffffff16565b805190915015610a355780806020019051602081101561491b57600080fd5b5051610a355760405162461bcd60e51b815260040180806020018281038252602a815260200180615325602a913960400191505060405180910390fd5b600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156149b157600080fd5b505af11580156149c5573d6000803e3d6000fd5b505050506040513d60208110156149db57600080fd5b5051905080156149ff576004546149ff90839081906001600160a01b031684613a63565b600854604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614a5857600080fd5b505af1158015614a6c573d6000803e3d6000fd5b505050506040513d6020811015614a8257600080fd5b505190508015610a355760095460055460408051631e42d69b60e21b81526001600160a01b038781166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b158015614af357600080fd5b505af1158015614b07573d6000803e3d6000fd5b50505050505050565b600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614b6957600080fd5b505af1158015614b7d573d6000803e3d6000fd5b505050506040513d6020811015614b9357600080fd5b505190508015614bb757600454614bb790839081906001600160a01b031684613a63565b5050565b600082614bca57506000613a5d565b82820282848281614bd757fe5b0414613a5a5760405162461bcd60e51b81526004018080602001828103825260218152602001806151a16021913960400191505060405180910390fd5b6000613a5a83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250614c6c565b6060614c628484600085614d0e565b90505b9392505050565b60008183614cf85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614cbd578181015183820152602001614ca5565b50505050905090810190601f168015614cea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614d0457fe5b0495945050505050565b606082471015614d4f5760405162461bcd60e51b81526004018080602001828103825260268152602001806150776026913960400191505060405180910390fd5b614d5885614e6a565b614da9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614de85780518252601f199092019160209182019101614dc9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614e4a576040519150601f19603f3d011682016040523d82523d6000602084013e614e4f565b606091505b5091509150614e5f828286614e70565b979650505050505050565b3b151590565b60608315614e7f575081614c65565b825115614e8f5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315614cbd578181015183820152602001614ca556fe526577617264526f757465723a207374616b6564446d78547261636b65722e63756d756c617469766552657761726473203e20305265656e7472616e637947756172643a207265656e7472616e742063616c6c000f29be1dde644188b51494b5f0ade9b1af9e356b987cca3430202907842437d8526577617264526f757465723a20666565446c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a207374616b6564446c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a2073656e646572206861732076657374656420746f6b656e73476f7665726e61626c653a20666f7262696464656e0000000000000000000000526577617264526f757465723a20696e76616c6964205f646c70416d6f756e74416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526577617264526f757465723a20616c726561647920696e697469616c697a6564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526577617264526f757465723a20626f6e7573446d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20666565446d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20626f6e7573446d78547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a20646c705665737465722e62616c616e6365203e2030526577617264526f757465723a207472616e73666572206e6f74207369676e616c6c6564e6de574619aa06acc3fca433d0757f3e97d2670888a10cfc879262c3cc547c43536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526577617264526f757465723a20646d785665737465722e7472616e73666572726564417665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a207374616b6564446c70547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a20666565446d78547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a20646d785665737465722e62616c616e6365203e2030526577617264526f757465723a20666565446c70547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a20646d785665737465722e7472616e7366657272656443756d756c617469766552657761726473203e2030526577617264526f757465723a207374616b6564446d78547261636b65722e617665726167655374616b6564416d6f756e7473203e20305361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526577617264526f757465723a20696e76616c6964205f616d6f756e74000000a264697066735822122010a6e59cb2a4e339b367e109651bb46904468dd29a2390c0567cad022ae808c064736f6c634300060c0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading