Contract 0xb36aaF73604993ace5E97f660Ac364EdCd82E395 9

 
Txn Hash Method
Block
From
To
Value
0x1bb32c546c060ed222176b5a09e1915e31a4773b64b2efeb4c72cc2172bea096Handle Rewards72624962023-11-30 3:18:5952 mins ago0x5be66f4095f89bd18abe4ae9d2acd5021ec433bc IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000801070690.001
0x9a7913441cb4f89247cdde65f4214c31102283d7efcae5d4cc08c93aa630fbb7Handle Rewards72621692023-11-30 3:08:051 hr 3 mins ago0x4ce268f49ef0726d602a8b0f22fcc543aa23bb51 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000769042650.001
0x2ec00fe0c5c5593afb3c6bf959008d6173491e415958c78c1e384c623de85d23Stake Es Gmx72590742023-11-30 1:24:552 hrs 46 mins ago0xff4f7b726ee86f810531d2842b3bdd8a512db594 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000489603250.000008218
0xe15cb79a258b88262122351250096d986491c6ffb00b2d71735b95b7271c7939Unstake Es Gmx72590582023-11-30 1:24:232 hrs 47 mins ago0xff4f7b726ee86f810531d2842b3bdd8a512db594 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000484885150.000008473
0x3497b3d8a5c1ac6da5bf059cf66fc216bf66dee0768fc75383150058267ef673Handle Rewards72590392023-11-30 1:23:452 hrs 47 mins ago0xff4f7b726ee86f810531d2842b3bdd8a512db594 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000676743310.000008919
0x2cd7960e4e4605807b4703a99e5de7d47342133f0a35b537e46c14e2bf565ca1Handle Rewards72542542023-11-29 22:44:155 hrs 27 mins ago0x374d5221a4367fe746cc6c92d333c6ce15386fcd IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000677408920.000000425
0x489f56cd51bdf9c68c69d224cae11a21868bffbc1efa09349f6346e1d5c51ba6Stake Gmx72536602023-11-29 22:24:275 hrs 47 mins ago0x5ad140e616ea0d6f10f729a3d73674a07167b745 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000643910510.001
0xe8a5a169fae277c76ea174685836a3fd2a6bcb12e78d5b9252fe8e4b6ebb45c5Unstake And Rede...72519192023-11-29 21:26:256 hrs 45 mins ago0x416679287b3f618a2d9e4f88a089430c91b0d11c IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000844111530.000000117
0x64624ecee8ec029833dc4334dddaac3c45ade44e3385a29f3d557f843c0f1812Handle Rewards72518372023-11-29 21:23:416 hrs 47 mins ago0x416679287b3f618a2d9e4f88a089430c91b0d11c IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0001115859210.000000131
0xb5621ba2e0d12ca6d8d82ffeb52ade89e4c752f54ed635120f22c9f5359d425aHandle Rewards72406442023-11-29 15:10:3513 hrs 1 min ago0x4cd34f7ea5412cfdcf382139786b44eb63617701 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0001112896450.001
0x6975c51db0fa51b37507c8b5e73aadb7acfce43253dacb902105d30db1191ea0Stake Gmx72387532023-11-29 14:07:3314 hrs 4 mins ago0x02170af779b9ac7fa2cba6ee76d5fedbce6ec5df IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.000050661260.000007204
0x525bb62188588f93f6e644157d305fcf2a28949fe5d793702ec7c3120be05cf6Handle Rewards72384482023-11-29 13:57:2314 hrs 14 mins ago0x0b789136ca58ce27f744d7735e7eb2a38742bcff IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000655326630.002
0x56c4e4f7f7c4de1a518af066ad21e22045678ff120377cb4fcd16dd99c108216Stake Gmx72364132023-11-29 12:49:3315 hrs 22 mins ago0x81f6f5b04d29bece6f08db46f6a3c4518a377f03 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000485534650.000009752
0x8dd884dd24089f2c9c0d4774cb70cf658216653603f4141ddca1e6008e243059Handle Rewards72314302023-11-29 10:03:2718 hrs 8 mins ago0xf4a1322f4dfecaf652f0b360097745887ecdd07c IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000655326080.000001555
0xe4af7ff50f750718543c58ed5b91b73d971c738c2d792857cc8bfeeeecf551ccUnstake Es Gmx72281952023-11-29 8:15:3719 hrs 56 mins ago0x39f8e35b54a7aca35d657064db6a377076ef11e1 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000473005520.000009404
0x30d9fe25bfd8135cf969753cd0c755df111c10efb3b8b28659016bb557c5fbefHandle Rewards72280252023-11-29 8:09:5720 hrs 1 min ago0x39f8e35b54a7aca35d657064db6a377076ef11e1 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000573997470.000005003
0x6fe5cc6760a10586f3a1cda64fdb8449f9f89859c928dc96c6a35dc63cec74b3Handle Rewards72250352023-11-29 6:30:1721 hrs 41 mins ago0x79c80fb4431b23940c0ed3f5ce45ba71d0f03577 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000596629240.002
0x388e93955a8f0177fd0b0f8b62c0b9c46b42b60fd026216f3ccbf52cfaefeccfStake Gmx72250292023-11-29 6:30:0521 hrs 41 mins ago0x79c80fb4431b23940c0ed3f5ce45ba71d0f03577 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000463429810.002
0x92d848a10a7de0d98cb2d0313e1136c8e600fcd29ae6aefd9d393a707c0124c2Unstake And Rede...72133632023-11-29 0:01:131 day 4 hrs ago0x7c3d3c9ea0f11b162a4261a849033030b4cd3064 IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000671044270.001
0x9b68f65e138cff61bf39bd148bb68a8eff87a1f5849172b2ee5944e628939bc5Mint And Stake G...72067442023-11-28 20:20:351 day 7 hrs ago0x416679287b3f618a2d9e4f88a089430c91b0d11c IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950.000618425161914 ETH0.000115971080.000008995
0x4245ff303de621e29ea2cf4f9cd8e2cb1911caa3c1f962d24bf75af552e88830Handle Rewards72067282023-11-28 20:20:031 day 7 hrs ago0x416679287b3f618a2d9e4f88a089430c91b0d11c IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.000143798540.000009459
0x19d82f239753aef8cb443a2a0fcf36aa7a68f66dd7c5e3fe1e3dfcbfea5a1566Handle Rewards72050452023-11-28 19:23:571 day 8 hrs ago0x0dc4e81df0feff747f49b1c00382069c3779c7ea IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0001081829490.00000975
0xb9ee78291b917750bdb8fa6bbee9eb3f614818c8bbc24f924811291b097251a9Stake Gmx72050392023-11-28 19:23:451 day 8 hrs ago0x0dc4e81df0feff747f49b1c00382069c3779c7ea IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000807907620.00000102
0x2e2bdca93b0d7f7d1ad806ae9cd24cb947988a2495e3493e5cf99f2e6dca9a4eStake Gmx72005822023-11-28 16:55:111 day 11 hrs ago0x02170af779b9ac7fa2cba6ee76d5fedbce6ec5df IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000797763490.000009301
0xd2b45139f1dad0b4132b7844153119d2d4eedd904d6f3babc9fa59020d7566a6Handle Rewards72000012023-11-28 16:35:491 day 11 hrs ago0x02170af779b9ac7fa2cba6ee76d5fedbce6ec5df IN  0xb36aaf73604993ace5e97f660ac364edcd82e3950 ETH0.0000864716260.00000833
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1bb32c546c060ed222176b5a09e1915e31a4773b64b2efeb4c72cc2172bea09672624962023-11-30 3:18:5952 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x5be66f4095f89bd18abe4ae9d2acd5021ec433bc0.005392442277738954 ETH
0x1bb32c546c060ed222176b5a09e1915e31a4773b64b2efeb4c72cc2172bea09672624962023-11-30 3:18:5952 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.005392442277738954 ETH
0x9a7913441cb4f89247cdde65f4214c31102283d7efcae5d4cc08c93aa630fbb772621692023-11-30 3:08:051 hr 3 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x4ce268f49ef0726d602a8b0f22fcc543aa23bb510.000468374161531047 ETH
0x9a7913441cb4f89247cdde65f4214c31102283d7efcae5d4cc08c93aa630fbb772621692023-11-30 3:08:051 hr 3 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000468374161531047 ETH
0x3497b3d8a5c1ac6da5bf059cf66fc216bf66dee0768fc75383150058267ef67372590392023-11-30 1:23:452 hrs 47 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950xff4f7b726ee86f810531d2842b3bdd8a512db5940.000035742111309422 ETH
0x3497b3d8a5c1ac6da5bf059cf66fc216bf66dee0768fc75383150058267ef67372590392023-11-30 1:23:452 hrs 47 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000035742111309422 ETH
0x2cd7960e4e4605807b4703a99e5de7d47342133f0a35b537e46c14e2bf565ca172542542023-11-29 22:44:155 hrs 27 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x374d5221a4367fe746cc6c92d333c6ce15386fcd0.000147153818272503 ETH
0x2cd7960e4e4605807b4703a99e5de7d47342133f0a35b537e46c14e2bf565ca172542542023-11-29 22:44:155 hrs 27 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000147153818272503 ETH
0xe8a5a169fae277c76ea174685836a3fd2a6bcb12e78d5b9252fe8e4b6ebb45c572519192023-11-29 21:26:256 hrs 45 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x416679287b3f618a2d9e4f88a089430c91b0d11c0.005172274958130629 ETH
0xe8a5a169fae277c76ea174685836a3fd2a6bcb12e78d5b9252fe8e4b6ebb45c572519192023-11-29 21:26:256 hrs 45 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.005172274958130629 ETH
0x64624ecee8ec029833dc4334dddaac3c45ade44e3385a29f3d557f843c0f181272518372023-11-29 21:23:416 hrs 47 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x416679287b3f618a2d9e4f88a089430c91b0d11c0.000661701970400176 ETH
0x64624ecee8ec029833dc4334dddaac3c45ade44e3385a29f3d557f843c0f181272518372023-11-29 21:23:416 hrs 47 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000661701970400176 ETH
0xb5621ba2e0d12ca6d8d82ffeb52ade89e4c752f54ed635120f22c9f5359d425a72406442023-11-29 15:10:3513 hrs 1 min ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x4cd34f7ea5412cfdcf382139786b44eb636177010.000037131282791994 ETH
0xb5621ba2e0d12ca6d8d82ffeb52ade89e4c752f54ed635120f22c9f5359d425a72406442023-11-29 15:10:3513 hrs 1 min ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000037131282791994 ETH
0x525bb62188588f93f6e644157d305fcf2a28949fe5d793702ec7c3120be05cf672384482023-11-29 13:57:2314 hrs 14 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x0b789136ca58ce27f744d7735e7eb2a38742bcff0.000503468771613444 ETH
0x525bb62188588f93f6e644157d305fcf2a28949fe5d793702ec7c3120be05cf672384482023-11-29 13:57:2314 hrs 14 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000503468771613444 ETH
0x8dd884dd24089f2c9c0d4774cb70cf658216653603f4141ddca1e6008e24305972314302023-11-29 10:03:2718 hrs 8 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950xf4a1322f4dfecaf652f0b360097745887ecdd07c0.00001609924497198 ETH
0x8dd884dd24089f2c9c0d4774cb70cf658216653603f4141ddca1e6008e24305972314302023-11-29 10:03:2718 hrs 8 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.00001609924497198 ETH
0x30d9fe25bfd8135cf969753cd0c755df111c10efb3b8b28659016bb557c5fbef72280252023-11-29 8:09:5720 hrs 1 min ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x39f8e35b54a7aca35d657064db6a377076ef11e10.000314577472971078 ETH
0x30d9fe25bfd8135cf969753cd0c755df111c10efb3b8b28659016bb557c5fbef72280252023-11-29 8:09:5720 hrs 1 min ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000314577472971078 ETH
0x6fe5cc6760a10586f3a1cda64fdb8449f9f89859c928dc96c6a35dc63cec74b372250352023-11-29 6:30:1721 hrs 41 mins ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x79c80fb4431b23940c0ed3f5ce45ba71d0f035770.001693435395478843 ETH
0x6fe5cc6760a10586f3a1cda64fdb8449f9f89859c928dc96c6a35dc63cec74b372250352023-11-29 6:30:1721 hrs 41 mins ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.001693435395478843 ETH
0x9b68f65e138cff61bf39bd148bb68a8eff87a1f5849172b2ee5944e628939bc572067442023-11-28 20:20:351 day 7 hrs ago 0xb36aaf73604993ace5e97f660ac364edcd82e395Wrapped Ether0.000618425161914933 ETH
0x4245ff303de621e29ea2cf4f9cd8e2cb1911caa3c1f962d24bf75af552e8883072067282023-11-28 20:20:031 day 7 hrs ago 0xb36aaf73604993ace5e97f660ac364edcd82e3950x416679287b3f618a2d9e4f88a089430c91b0d11c0.000914521213602977 ETH
0x4245ff303de621e29ea2cf4f9cd8e2cb1911caa3c1f962d24bf75af552e8883072067282023-11-28 20:20:031 day 7 hrs ago Wrapped Ether 0xb36aaf73604993ace5e97f660ac364edcd82e3950.000914521213602977 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardRouterV2

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 1 runs

Other Settings:
istanbul EvmVersion
File 1 of 15 : 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/IRewardRouterV2.sol";
import "./interfaces/IVester.sol";
import "../tokens/interfaces/IMintable.sol";
import "../tokens/interfaces/IWETH.sol";
import "../core/interfaces/INlpManager.sol";
import "../access/Governable.sol";

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

    bool public isInitialized;

    address public weth;

    address public gmx; //0
    address public esGmx; //0
    address public bnGmx; //0

    address public glp; // GMX Liquidity Provider token

    address public stakedGmxTracker; //0
    address public bonusGmxTracker; //0
    address public feeGmxTracker; //0

    address public override stakedGlpTracker;
    address public override feeGlpTracker;

    address public glpManager;

    address public gmxVester; //0
    address public glpVester; //0

    mapping (address => address) public pendingReceivers;

    event StakeGmx(address account, address token, uint256 amount);
    event UnstakeGmx(address account, address token, uint256 amount);

    event StakeGlp(address account, uint256 amount);
    event UnstakeGlp(address account, uint256 amount);

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

    function initialize(
        address _weth,
        address _gmx,
        address _esGmx,
        address _bnGmx,
        address _glp,
        address _stakedGmxTracker,
        address _bonusGmxTracker,
        address _feeGmxTracker,
        address _feeGlpTracker,
        address _stakedGlpTracker,
        address _glpManager,
        address _gmxVester,
        address _glpVester
    ) external onlyGov {
        require(!isInitialized, "RewardRouter: already initialized");
        isInitialized = true;

        weth = _weth;

        gmx = _gmx;
        esGmx = _esGmx;
        bnGmx = _bnGmx;

        glp = _glp;

        stakedGmxTracker = _stakedGmxTracker;
        bonusGmxTracker = _bonusGmxTracker;
        feeGmxTracker = _feeGmxTracker;

        feeGlpTracker = _feeGlpTracker;
        stakedGlpTracker = _stakedGlpTracker;

        glpManager = _glpManager;

        gmxVester = _gmxVester;
        glpVester = _glpVester;
    }

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

    function stakeGmxForAccount(address _account, uint256 _amount) external nonReentrant onlyGov {
        _stakeGmx(msg.sender, _account, gmx, _amount);
    }

    function stakeGmx(uint256 _amount) external nonReentrant {
        _stakeGmx(msg.sender, msg.sender, gmx, _amount);
    }

    function stakeEsGmx(uint256 _amount) external nonReentrant {
        _stakeGmx(msg.sender, msg.sender, esGmx, _amount);
    }

    function unstakeGmx(uint256 _amount) external nonReentrant {
        _unstakeGmx(msg.sender, gmx, _amount, true);
    }

    function unstakeEsGmx(uint256 _amount) external nonReentrant {
        _unstakeGmx(msg.sender, esGmx, _amount, true);
    }

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

        address account = msg.sender;
        uint256 glpAmount = INlpManager(glpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdg, _minGlp);
        IRewardTracker(feeGlpTracker).stakeForAccount(account, account, glp, glpAmount);
        IRewardTracker(stakedGlpTracker).stakeForAccount(account, account, feeGlpTracker, glpAmount);

        emit StakeGlp(account, glpAmount);

        return glpAmount;
    }

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

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

        address account = msg.sender;
        uint256 glpAmount = INlpManager(glpManager).addLiquidityForAccount(address(this), account, weth, msg.value, _minUsdg, _minGlp);

        IRewardTracker(feeGlpTracker).stakeForAccount(account, account, glp, glpAmount);
        IRewardTracker(stakedGlpTracker).stakeForAccount(account, account, feeGlpTracker, glpAmount);

        emit StakeGlp(account, glpAmount);

        return glpAmount;
    }

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

        address account = msg.sender;
        IRewardTracker(stakedGlpTracker).unstakeForAccount(account, feeGlpTracker, _glpAmount, account);
        IRewardTracker(feeGlpTracker).unstakeForAccount(account, glp, _glpAmount, account);
        uint256 amountOut = INlpManager(glpManager).removeLiquidityForAccount(account, _tokenOut, _glpAmount, _minOut, _receiver);

        emit UnstakeGlp(account, _glpAmount);

        return amountOut;
    }

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

        address account = msg.sender;
        IRewardTracker(stakedGlpTracker).unstakeForAccount(account, feeGlpTracker, _glpAmount, account);
        IRewardTracker(feeGlpTracker).unstakeForAccount(account, glp, _glpAmount, account);
        uint256 amountOut = INlpManager(glpManager).removeLiquidityForAccount(account, weth, _glpAmount, _minOut, address(this));

        IWETH(weth).withdraw(amountOut);

        _receiver.sendValue(amountOut);

        emit UnstakeGlp(account, _glpAmount);

        return amountOut;
    }

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

        IRewardTracker(feeGmxTracker).claimForAccount(account, account);
        IRewardTracker(feeGlpTracker).claimForAccount(account, account);

        IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
    }

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

        IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
        IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
    }

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

        IRewardTracker(feeGmxTracker).claimForAccount(account, account);
        IRewardTracker(feeGlpTracker).claimForAccount(account, account);
    }

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

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

    function handleRewards(
        bool _shouldClaimGmx,
        bool _shouldStakeGmx,
        bool _shouldClaimEsGmx,
        bool _shouldStakeEsGmx,
        bool _shouldStakeMultiplierPoints,
        bool _shouldClaimWeth,
        bool _shouldConvertWethToEth
    ) external nonReentrant {
        address account = msg.sender;

        uint256 gmxAmount = 0;
        if (_shouldClaimGmx) {
            uint256 gmxAmount0 = IVester(gmxVester).claimForAccount(account, account);
            uint256 gmxAmount1 = IVester(glpVester).claimForAccount(account, account);
            gmxAmount = gmxAmount0.add(gmxAmount1);
        }

        if (_shouldStakeGmx && gmxAmount > 0) {
            _stakeGmx(account, account, gmx, gmxAmount);
        }

        uint256 esGmxAmount = 0;
        if (_shouldClaimEsGmx) {
            uint256 esGmxAmount0 = IRewardTracker(stakedGmxTracker).claimForAccount(account, account);
            uint256 esGmxAmount1 = IRewardTracker(stakedGlpTracker).claimForAccount(account, account);
            esGmxAmount = esGmxAmount0.add(esGmxAmount1);
        }

        if (_shouldStakeEsGmx && esGmxAmount > 0) {
            _stakeGmx(account, account, esGmx, esGmxAmount);
        }

        if (_shouldStakeMultiplierPoints) {
            uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(account, account);
            if (bnGmxAmount > 0) {
                IRewardTracker(feeGmxTracker).stakeForAccount(account, account, bnGmx, bnGmxAmount);
            }
        }

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

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

                payable(account).sendValue(wethAmount);
            } else {
                IRewardTracker(feeGmxTracker).claimForAccount(account, account);
                IRewardTracker(feeGlpTracker).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(gmxVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(glpVester).balanceOf(msg.sender) == 0, "RewardRouter: sender has vested tokens");

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

    function acceptTransfer(address _sender) external nonReentrant {
        require(IERC20(gmxVester).balanceOf(_sender) == 0, "RewardRouter: sender has vested tokens");
        require(IERC20(glpVester).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 stakedGmx = IRewardTracker(stakedGmxTracker).depositBalances(_sender, gmx);
        if (stakedGmx > 0) {
            _unstakeGmx(_sender, gmx, stakedGmx, false);
            _stakeGmx(_sender, receiver, gmx, stakedGmx);
        }

        uint256 stakedEsGmx = IRewardTracker(stakedGmxTracker).depositBalances(_sender, esGmx);
        if (stakedEsGmx > 0) {
            _unstakeGmx(_sender, esGmx, stakedEsGmx, false);
            _stakeGmx(_sender, receiver, esGmx, stakedEsGmx);
        }

        uint256 stakedBnGmx = IRewardTracker(feeGmxTracker).depositBalances(_sender, bnGmx);
        if (stakedBnGmx > 0) {
            IRewardTracker(feeGmxTracker).unstakeForAccount(_sender, bnGmx, stakedBnGmx, _sender);
            IRewardTracker(feeGmxTracker).stakeForAccount(_sender, receiver, bnGmx, stakedBnGmx);
        }

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

        uint256 glpAmount = IRewardTracker(feeGlpTracker).depositBalances(_sender, glp);
        if (glpAmount > 0) {
            IRewardTracker(stakedGlpTracker).unstakeForAccount(_sender, feeGlpTracker, glpAmount, _sender);
            IRewardTracker(feeGlpTracker).unstakeForAccount(_sender, glp, glpAmount, _sender);

            IRewardTracker(feeGlpTracker).stakeForAccount(_sender, receiver, glp, glpAmount);
            IRewardTracker(stakedGlpTracker).stakeForAccount(receiver, receiver, feeGlpTracker, glpAmount);
        }

        IVester(gmxVester).transferStakeValues(_sender, receiver);
        IVester(glpVester).transferStakeValues(_sender, receiver);
    }

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

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

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

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

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

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

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

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

    function _compound(address _account) private {
        _compoundGmx(_account);
        _compoundGlp(_account);
    }

    function _compoundGmx(address _account) private {
        uint256 esGmxAmount = IRewardTracker(stakedGmxTracker).claimForAccount(_account, _account);
        if (esGmxAmount > 0) {
            _stakeGmx(_account, _account, esGmx, esGmxAmount);
        }

        uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(_account, _account);
        if (bnGmxAmount > 0) {
            IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bnGmx, bnGmxAmount);
        }
    }

    function _compoundGlp(address _account) private {
        uint256 esGmxAmount = IRewardTracker(stakedGlpTracker).claimForAccount(_account, _account);
        if (esGmxAmount > 0) {
            _stakeGmx(_account, _account, esGmx, esGmxAmount);
        }
    }

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

        IRewardTracker(stakedGmxTracker).stakeForAccount(_fundingAccount, _account, _token, _amount);
        IRewardTracker(bonusGmxTracker).stakeForAccount(_account, _account, stakedGmxTracker, _amount);
        IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bonusGmxTracker, _amount);

        emit StakeGmx(_account, _token, _amount);
    }

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

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

        IRewardTracker(feeGmxTracker).unstakeForAccount(_account, bonusGmxTracker, _amount, _account);
        IRewardTracker(bonusGmxTracker).unstakeForAccount(_account, stakedGmxTracker, _amount, _account);
        IRewardTracker(stakedGmxTracker).unstakeForAccount(_account, _token, _amount, _account);

        if (_shouldReduceBnGmx) {
            uint256 bnGmxAmount = IRewardTracker(bonusGmxTracker).claimForAccount(_account, _account);
            if (bnGmxAmount > 0) {
                IRewardTracker(feeGmxTracker).stakeForAccount(_account, _account, bnGmx, bnGmxAmount);
            }

            uint256 stakedBnGmx = IRewardTracker(feeGmxTracker).depositBalances(_account, bnGmx);
            if (stakedBnGmx > 0) {
                uint256 reductionAmount = stakedBnGmx.mul(_amount).div(balance);
                IRewardTracker(feeGmxTracker).unstakeForAccount(_account, bnGmx, reductionAmount, _account);
                IMintable(bnGmx).burn(_account, reductionAmount);
            }
        }

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

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

pragma solidity 0.6.12;

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

File 4 of 15 : 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 5 of 15 : 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 6 of 15 : IRewardRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

interface IRewardRouterV2 {
    function feeGlpTracker() external view returns (address);
    function stakedGlpTracker() external view returns (address);
}

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

pragma solidity 0.6.12;

interface IVaultUtils {
    function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
    function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
    function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
    function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
    function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
    function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
    function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
    function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}

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

pragma solidity 0.6.12;

import "./IVaultUtils.sol";

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

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

    function router() external view returns (address);
    function usdg() external view returns (address);
    function gov() external view returns (address);

    function whitelistedTokenCount() external view returns (uint256);
    function maxLeverage() external view returns (uint256);

    function minProfitTime() external view returns (uint256);
    function hasDynamicFees() external view returns (bool);
    function fundingInterval() external view returns (uint256);
    function totalTokenWeights() external view returns (uint256);
    function getTargetUsdgAmount(address _token) external view returns (uint256);

    function inManagerMode() external view returns (bool);
    function inPrivateLiquidationMode() external view returns (bool);

    function maxGasPrice() external view returns (uint256);

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

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

    function setMaxLeverage(uint256 _maxLeverage) external;
    function setInManagerMode(bool _inManagerMode) external;
    function setManager(address _manager, bool _isManager) external;
    function setIsSwapEnabled(bool _isSwapEnabled) external;
    function setIsLeverageEnabled(bool _isLeverageEnabled) external;
    function setMaxGasPrice(uint256 _maxGasPrice) external;
    function setUsdgAmount(address _token, uint256 _amount) external;
    function setBufferAmount(address _token, uint256 _amount) external;
    function setMaxGlobalShortSize(address _token, uint256 _amount) external;
    function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
    function setLiquidator(address _liquidator, bool _isActive) external;

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

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

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

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

    function directPoolDeposit(address _token) external;
    function buyUSDG(address _token, address _receiver) external returns (uint256);
    function sellUSDG(address _token, address _receiver) external returns (uint256);
    function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
    function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
    function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
    function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
    function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
    function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);

    function priceFeed() external view returns (address);
    function fundingRateFactor() external view returns (uint256);
    function stableFundingRateFactor() external view returns (uint256);
    function cumulativeFundingRates(address _token) external view returns (uint256);
    function getNextFundingRate(address _token) external view returns (uint256);
    function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);

    function liquidationFeeUsd() external view returns (uint256);
    function taxBasisPoints() external view returns (uint256);
    function stableTaxBasisPoints() external view returns (uint256);
    function mintBurnFeeBasisPoints() external view returns (uint256);
    function swapFeeBasisPoints() external view returns (uint256);
    function stableSwapFeeBasisPoints() external view returns (uint256);
    function marginFeeBasisPoints() external view returns (uint256);

    function allWhitelistedTokensLength() external view returns (uint256);
    function allWhitelistedTokens(uint256) external view returns (address);
    function whitelistedTokens(address _token) external view returns (bool);
    function stableTokens(address _token) external view returns (bool);
    function shortableTokens(address _token) external view returns (bool);
    function feeReserves(address _token) external view returns (uint256);
    function globalShortSizes(address _token) external view returns (uint256);
    function globalShortAveragePrices(address _token) external view returns (uint256);
    function maxGlobalShortSizes(address _token) external view returns (uint256);
    function tokenDecimals(address _token) external view returns (uint256);
    function tokenWeights(address _token) external view returns (uint256);
    function guaranteedUsd(address _token) external view returns (uint256);
    function poolAmounts(address _token) external view returns (uint256);
    function bufferAmounts(address _token) external view returns (uint256);
    function reservedAmounts(address _token) external view returns (uint256);
    function usdgAmounts(address _token) external view returns (uint256);
    function maxUsdgAmounts(address _token) external view returns (uint256);
    function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256);
    function getMaxPrice(address _token) external view returns (uint256);
    function getMinPrice(address _token) external view returns (uint256);

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

File 14 of 15 : INlpManager.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

import "./IVault.sol";

interface INlpManager {
    function glp() external view returns (address);
    function usdg() external view returns (address);
    function vault() external view returns (IVault);
    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 _minGlp) external returns (uint256);
    function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minGlp) external returns (uint256);
    function removeLiquidity(address _tokenOut, uint256 _glpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _glpAmount, uint256 _minOut, address _receiver) external returns (uint256);
    function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external;
    function setCooldownDuration(uint256 _cooldownDuration) external;
}

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

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeGlp","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":"StakeGmx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeGlp","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":"UnstakeGmx","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":"batchStakeGmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bnGmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsGmx","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":"esGmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gmx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gmxVester","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":"_shouldClaimGmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeGmx","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsGmx","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsGmx","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":"_gmx","type":"address"},{"internalType":"address","name":"_esGmx","type":"address"},{"internalType":"address","name":"_bnGmx","type":"address"},{"internalType":"address","name":"_glp","type":"address"},{"internalType":"address","name":"_stakedGmxTracker","type":"address"},{"internalType":"address","name":"_bonusGmxTracker","type":"address"},{"internalType":"address","name":"_feeGmxTracker","type":"address"},{"internalType":"address","name":"_feeGlpTracker","type":"address"},{"internalType":"address","name":"_stakedGlpTracker","type":"address"},{"internalType":"address","name":"_glpManager","type":"address"},{"internalType":"address","name":"_gmxVester","type":"address"},{"internalType":"address","name":"_glpVester","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":"_minGlp","type":"uint256"}],"name":"mintAndStakeGlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minGlp","type":"uint256"}],"name":"mintAndStakeGlpETH","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":"stakeEsGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeGmxForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedGlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedGmxTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_glpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemGlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_glpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemGlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsGmx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeGmx","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"}]

608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556153a4806100376000396000f3fe6080604052600436106101b95760003560e01c806301e336671461021d578063078580d2146102605780630ce4018a1461028a5780630db79e52146102bb5780630f3aa554146103eb57806312d43a51146104445780631af276a6146104595780631fcd60e5146105075780632a9f40831461051c5780632fdd983d1461054f57806330b70002146105ea57806331e67c7114610646578063364e23111461065b5780633671df25146106a0578063392e53cd146106b55780633fc8cef3146106de57806341d315b4146106f35780634e71d92d1461070857806351c3e3b41461071d57806353a8aa03146107325780635da4b8dd146107555780635fe3945f1461078e57806364f64467146107a3578063655603a4146107cd5780636a192a781461080057806378a207ee14610815578063abb5e5e21461082a578063af394d0014610869578063cfad57a21461087e578063d294f093146108b1578063e102f564146108c6578063e1b9db89146108db578063e1c363b71461090e578063ef8c599414610923578063ef9aacfd1461094d578063f3daeacc14610980578063f69e2046146109aa578063fa6db1bc146109bf57610218565b36610218576002546001600160a01b03163314610216576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561022957600080fd5b506102166004803603606081101561024057600080fd5b506001600160a01b038135811691602081013590911690604001356109d4565b34801561026c57600080fd5b506102166004803603602081101561028357600080fd5b5035610a3a565b34801561029657600080fd5b5061029f610aa7565b604080516001600160a01b039092168252519081900360200190f35b3480156102c757600080fd5b50610216600480360360408110156102de57600080fd5b810190602081018135600160201b8111156102f857600080fd5b82018360208201111561030a57600080fd5b803590602001918460208302840111600160201b8311171561032b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561037a57600080fd5b82018360208201111561038c57600080fd5b803590602001918460208302840111600160201b831117156103ad57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ab6945050505050565b3480156103f757600080fd5b506104326004803603608081101561040e57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516610bab565b60408051918252519081900360200190f35b34801561045057600080fd5b5061029f610e1b565b34801561046557600080fd5b506102166004803603602081101561047c57600080fd5b810190602081018135600160201b81111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460208302840111600160201b831117156104c957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e2a945050505050565b34801561051357600080fd5b5061029f610efb565b34801561052857600080fd5b506102166004803603602081101561053f57600080fd5b50356001600160a01b0316610f0a565b34801561055b57600080fd5b5061021660048036036101a081101561057357600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e08101358216916101008201358116916101208101358216916101408201358116916101608101358216916101809091013516610fab565b3480156105f657600080fd5b50610216600480360360e081101561060d57600080fd5b508035151590602081013515159060408101351515906060810135151590608081013515159060a081013515159060c001351515611138565b34801561065257600080fd5b5061029f6117fa565b34801561066757600080fd5b506104326004803603608081101561067e57600080fd5b506001600160a01b038135169060208101359060408101359060600135611809565b3480156106ac57600080fd5b5061029f611a77565b3480156106c157600080fd5b506106ca611a86565b604080519115158252519081900360200190f35b3480156106ea57600080fd5b5061029f611a96565b3480156106ff57600080fd5b5061029f611aa5565b34801561071457600080fd5b50610216611ab4565b34801561072957600080fd5b5061029f611d13565b6104326004803603604081101561074857600080fd5b5080359060200135611d22565b34801561076157600080fd5b506102166004803603604081101561077857600080fd5b506001600160a01b03813516906020013561208d565b34801561079a57600080fd5b5061021661213f565b3480156107af57600080fd5b50610216600480360360208110156107c657600080fd5b50356121e4565b3480156107d957600080fd5b50610216600480360360208110156107f057600080fd5b50356001600160a01b0316612249565b34801561080c57600080fd5b5061029f612c52565b34801561082157600080fd5b5061029f612c61565b34801561083657600080fd5b506104326004803603606081101561084d57600080fd5b50803590602081013590604001356001600160a01b0316612c70565b34801561087557600080fd5b5061029f612f59565b34801561088a57600080fd5b50610216600480360360208110156108a157600080fd5b50356001600160a01b0316612f68565b3480156108bd57600080fd5b50610216612fd7565b3480156108d257600080fd5b5061029f6130fe565b3480156108e757600080fd5b5061029f600480360360208110156108fe57600080fd5b50356001600160a01b031661310d565b34801561091a57600080fd5b5061029f613128565b34801561092f57600080fd5b506102166004803603602081101561094657600080fd5b5035613137565b34801561095957600080fd5b506102166004803603602081101561097057600080fd5b50356001600160a01b031661319c565b34801561098c57600080fd5b50610216600480360360208110156109a357600080fd5b503561338a565b3480156109b657600080fd5b506102166133ef565b3480156109cb57600080fd5b5061029f61344a565b6001546001600160a01b03163314610a21576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b610a356001600160a01b0384168383613459565b505050565b60026000541415610a80576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610a9f9033906001600160a01b03168360016134ab565b506001600055565b6007546001600160a01b031681565b60026000541415610afc576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610b4e576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b6003546001600160a01b031660005b8351811015610ba057610b9833858381518110610b7657fe5b602002602001015184868581518110610b8b57fe5b60200260200101516139ed565b600101610b5d565b505060016000555050565b600060026000541415610bf3576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583610c38576040805162461bcd60e51b815260206004820181905260248201526000805160206152b8833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015610ca157600080fd5b505af1158015610cb5573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015610d2357600080fd5b505af1158015610d37573d6000803e3d6000fd5b5050600c54604080516371d597ad60e01b81526001600160a01b0386811660048301528b81166024830152604482018b9052606482018a905288811660848301529151600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015610dab57600080fd5b505af1158015610dbf573d6000803e3d6000fd5b505050506040513d6020811015610dd557600080fd5b5051604080516001600160a01b03851681526020810189905281519293506000805160206151d1833981519152929081900390910190a160016000559695505050505050565b6001546001600160a01b031681565b60026000541415610e70576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610ec2576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b60005b8151811015610ef257610eea828281518110610edd57fe5b6020026020010151613bfc565b600101610ec5565b50506001600055565b6008546001600160a01b031681565b60026000541415610f50576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610fa2576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b610a9f81613bfc565b6001546001600160a01b03163314610ff8576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600154600160a01b900460ff16156110415760405162461bcd60e51b8152600401808060200182810382526021815260200180614fe26021913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039e8f166001600160a01b031991821617909155600380549d8f169d82169d909d17909c55600480549b8e169b8d169b909b17909a5560058054998d16998c169990991790985560068054978c16978b169790971790965560078054958b16958a169590951790945560088054938a169389169390931790925560098054918916918816919091179055600b8054918816918716919091179055600a8054918716918616919091179055600c8054918616918516919091179055600d8054918516918416919091179055600e8054919093169116179055565b6002600054141561117e576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155339088156112aa57600d54604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156111e657600080fd5b505af11580156111fa573d6000803e3d6000fd5b505050506040513d602081101561121057600080fd5b5051600e54604080516309f4173d60e11b81526001600160a01b03878116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b505190506112a58282613c11565b925050505b8780156112b75750600081115b156112d6576003546112d690839081906001600160a01b0316846139ed565b600087156113fb57600754604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561133757600080fd5b505af115801561134b573d6000803e3d6000fd5b505050506040513d602081101561136157600080fd5b5051600a54604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b1580156113be57600080fd5b505af11580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b505190506113f68282613c11565b925050505b8680156114085750600081115b156114275760045461142790849081906001600160a01b0316846139ed565b851561153c57600854604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561148657600080fd5b505af115801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50519050801561153a5760095460055460408051631e42d69b60e21b81526001600160a01b038881166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505050505b505b84156117e95783156116e457600954604080516309f4173d60e11b81526001600160a01b038681166004830152306024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b1580156115a057600080fd5b505af11580156115b4573d6000803e3d6000fd5b505050506040513d60208110156115ca57600080fd5b5051600b54604080516309f4173d60e11b81526001600160a01b038881166004830152306024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b5051905060006116608383613c11565b60025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156116b057600080fd5b505af11580156116c4573d6000803e3d6000fd5b506116dc925050506001600160a01b03871682613c72565b5050506117e9565b600954604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d602081101561176457600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b1580156117bc57600080fd5b505af11580156117d0573d6000803e3d6000fd5b505050506040513d60208110156117e657600080fd5b50505b505060016000555050505050505050565b6003546001600160a01b031681565b600060026000541415611851576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583611896576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b600c54604080516317eb2a1560e01b81523360048201819052602482018190526001600160a01b038981166044840152606483018990526084830188905260a483018790529251909360009316916317eb2a159160c480830192602092919082900301818787803b15801561190a57600080fd5b505af115801561191e573d6000803e3d6000fd5b505050506040513d602081101561193457600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b5050604080516001600160a01b038616815260208101859052815160008051602061517d8339815191529450908190039091019150a160016000559695505050505050565b600e546001600160a01b031681565b600154600160a01b900460ff1681565b6002546001600160a01b031681565b600d546001600160a01b031681565b60026000541415611afa576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505050506040513d6020811015611b8357600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611bdb57600080fd5b505af1158015611bef573d6000803e3d6000fd5b505050506040513d6020811015611c0557600080fd5b5050600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611c5d57600080fd5b505af1158015611c71573d6000803e3d6000fd5b505050506040513d6020811015611c8757600080fd5b5050600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050506040513d6020811015611d0957600080fd5b5050600160005550565b6009546001600160a01b031681565b600060026000541415611d6a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005534611dc1576040805162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015290519081900360640190fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e1157600080fd5b505af1158015611e25573d6000803e3d6000fd5b5050600254600c546040805163095ea7b360e01b81526001600160a01b039283166004820152346024820152905191909216945063095ea7b39350604480830193506020928290030181600087803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050506040513d6020811015611eaa57600080fd5b5050600c54600254604080516317eb2a1560e01b815230600482015233602482018190526001600160a01b0393841660448301523460648301526084820188905260a482018790529151919360009316916317eb2a159160c48082019260209290919082900301818787803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b505050506040513d6020811015611f4c57600080fd5b5051600b5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015611fb757600080fd5b505af1158015611fcb573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561203657600080fd5b505af115801561204a573d6000803e3d6000fd5b5050604080516001600160a01b038616815260208101859052815160008051602061517d8339815191529450908190039091019150a16001600055949350505050565b600260005414156120d3576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314612125576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600354610ef290339084906001600160a01b0316846139ed565b60026000541415612185576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600754604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b158015611c5d57600080fd5b6002600054141561222a576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610a9f9033906001600160a01b03168360016134ab565b6002600054141561228f576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b1580156122e157600080fd5b505afa1580156122f5573d6000803e3d6000fd5b505050506040513d602081101561230b57600080fd5b5051156123495760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d60208110156123c057600080fd5b5051156123fe5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b6001600160a01b038181166000908152600f602052604090205433911681146124585760405162461bcd60e51b81526004018080602001828103825260248152602001806150296024913960400191505060405180910390fd5b6001600160a01b0382166000908152600f6020526040902080546001600160a01b031916905561248781613d57565b61249082613bfc565b60075460035460408051637aeceb1f60e11b81526001600160a01b03868116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d602081101561251657600080fd5b5051905080156125545760035461253a9084906001600160a01b03168360006134ab565b60035461255490849084906001600160a01b0316846139ed565b6007546004805460408051637aeceb1f60e11b81526001600160a01b0388811694820194909452918316602483015251600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156125b257600080fd5b505afa1580156125c6573d6000803e3d6000fd5b505050506040513d60208110156125dc57600080fd5b50519050801561261a576004546126009085906001600160a01b03168360006134ab565b60045461261a90859085906001600160a01b0316846139ed565b60095460055460408051637aeceb1f60e11b81526001600160a01b03888116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561267657600080fd5b505afa15801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b5051905080156127ad576009546005546040805163098bf59d60e01b81526001600160a01b038981166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b505060095460055460408051631e42d69b60e21b81526001600160a01b038b811660048301528a81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050505b6000600460009054906101000a90046001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561281157600080fd5b505afa158015612825573d6000803e3d6000fd5b505050506040513d602081101561283b57600080fd5b5051905080156128d45760048054604080516323b872dd60e01b81526001600160a01b038a811694820194909452888416602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b1580156128a757600080fd5b505af11580156128bb573d6000803e3d6000fd5b505050506040513d60208110156128d157600080fd5b50505b600b5460065460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d602081101561295a57600080fd5b505190508015612b6857600a54600b546040805163098bf59d60e01b81526001600160a01b038b81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b1580156129ce57600080fd5b505af11580156129e2573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015612a5057600080fd5b505af1158015612a64573d6000803e3d6000fd5b5050600b5460065460408051631e42d69b60e21b81526001600160a01b038d811660048301528c81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612ad057600080fd5b505af1158015612ae4573d6000803e3d6000fd5b5050600a54600b5460408051631e42d69b60e21b81526001600160a01b038c8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612b4f57600080fd5b505af1158015612b63573d6000803e3d6000fd5b505050505b600d5460408051630f713c2360e41b81526001600160a01b038a8116600483015289811660248301529151919092169163f713c23091604480830192600092919082900301818387803b158015612bbe57600080fd5b505af1158015612bd2573d6000803e3d6000fd5b5050600e5460408051630f713c2360e41b81526001600160a01b038c811660048301528b81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612c2c57600080fd5b505af1158015612c40573d6000803e3d6000fd5b50506001600055505050505050505050565b6004546001600160a01b031681565b6006546001600160a01b031681565b600060026000541415612cb8576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005583612cfd576040805162461bcd60e51b815260206004820181905260248201526000805160206152b8833981519152604482015290519081900360640190fd5b600a54600b546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b5050600b546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015612de857600080fd5b505af1158015612dfc573d6000803e3d6000fd5b5050600c54600254604080516371d597ad60e01b81526001600160a01b0387811660048301529283166024820152604481018b9052606481018a90523060848201529051600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015612e7157600080fd5b505af1158015612e85573d6000803e3d6000fd5b505050506040513d6020811015612e9b57600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b50612f19925050506001600160a01b03851682613c72565b604080516001600160a01b03841681526020810188905281516000805160206151d1833981519152929181900390910190a1600160005595945050505050565b600a546001600160a01b031681565b6001546001600160a01b03163314612fb5576040805162461bcd60e51b81526020600482015260156024820152600080516020614f51833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002600054141561301d576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b60026000908155600954604080516309f4173d60e11b8152336004820181905260248201819052915191936001600160a01b03909316926313e82e7a926044808401936020939083900390910190829087803b15801561307c57600080fd5b505af1158015613090573d6000803e3d6000fd5b505050506040513d60208110156130a657600080fd5b5050600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915191909216916313e82e7a9160448083019260209291908290030181600087803b158015611cdf57600080fd5b6005546001600160a01b031681565b600f602052600090815260409020546001600160a01b031681565b600b546001600160a01b031681565b6002600054141561317d576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600454610a9f90339081906001600160a01b0316846139ed565b600260005414156131e2576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600d54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561323257600080fd5b505afa158015613246573d6000803e3d6000fd5b505050506040513d602081101561325c57600080fd5b50511561329a5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b600e54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156132e557600080fd5b505afa1580156132f9573d6000803e3d6000fd5b505050506040513d602081101561330f57600080fd5b50511561334d5760405162461bcd60e51b8152600401808060200182810382526026815260200180614f2b6026913960400191505060405180910390fd5b61335681613d57565b336000908152600f6020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b600260005414156133d0576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b6002600055600354610a9f90339081906001600160a01b0316846139ed565b60026000541415613435576040805162461bcd60e51b815260206004820152601f6024820152600080516020614f0b833981519152604482015290519081900360640190fd5b600260005561344333613bfc565b6001600055565b600c546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610a359084906148a7565b600082116134ee576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b600754604080516310c1c10360e01b81526001600160a01b038781166004830152915160009392909216916310c1c10391602480820192602092909190829003018186803b15801561353f57600080fd5b505afa158015613553573d6000803e3d6000fd5b505050506040513d602081101561356957600080fd5b50516009546008546040805163098bf59d60e01b81526001600160a01b038a8116600483018190529381166024830152604482018990526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b1580156135d757600080fd5b505af11580156135eb573d6000803e3d6000fd5b50506008546007546040805163098bf59d60e01b81526001600160a01b038b8116600483018190529381166024830152604482018a90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b50506007546040805163098bf59d60e01b81526001600160a01b038a8116600483018190528a82166024840152604483018a90526064830152915191909216935063098bf59d9250608480830192600092919082900301818387803b1580156136d557600080fd5b505af11580156136e9573d6000803e3d6000fd5b50505050811561399c57600854604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561374c57600080fd5b505af1158015613760573d6000803e3d6000fd5b505050506040513d602081101561377657600080fd5b5051905080156138005760095460055460408051631e42d69b60e21b81526001600160a01b038a81166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156137e757600080fd5b505af11580156137fb573d6000803e3d6000fd5b505050505b60095460055460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561385c57600080fd5b505afa158015613870573d6000803e3d6000fd5b505050506040513d602081101561388657600080fd5b5051905080156139995760006138a6846138a08489614958565b906149b1565b6009546005546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018690526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b15801561391257600080fd5b505af1158015613926573d6000803e3d6000fd5b505060055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018790529151919092169350639dc29fac9250604480830192600092919082900301818387803b15801561397f57600080fd5b505af1158015613993573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b0380881682528616602082015280820185905290517fce8eb393006add0768cc6cefb3ca0fc4787015ce1ac86bd800e72a79993103459181900360600190a15050505050565b60008111613a30576040805162461bcd60e51b815260206004820152601d60248201526000805160206152fb833981519152604482015290519081900360640190fd5b60075460408051631e42d69b60e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163790b5a6c91608480830192600092919082900301818387803b158015613a9557600080fd5b505af1158015613aa9573d6000803e3d6000fd5b505060085460075460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613b1457600080fd5b505af1158015613b28573d6000803e3d6000fd5b505060095460085460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613b9357600080fd5b505af1158015613ba7573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517fad0723806aa1e5a8fb826fc9f0c5b589e585a6b60dc768a1b20691c95062d2d69350908190036060019150a150505050565b613c05816149f0565b613c0e81614ba8565b50565b600082820183811015613c69576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b80471015613cc7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114613d12576040519150601f19603f3d011682016040523d82523d6000602084013e613d17565b606091505b5050905080610a355760405162461bcd60e51b815260040180806020018281038252603a815260200180614fa8603a913960400191505060405180910390fd5b6007546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613da457600080fd5b505afa158015613db8573d6000803e3d6000fd5b505050506040513d6020811015613dce57600080fd5b505115613e0c5760405162461bcd60e51b8152600401808060200182810382526037815260200180614f716037913960400191505060405180910390fd5b60075460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613e5957600080fd5b505afa158015613e6d573d6000803e3d6000fd5b505050506040513d6020811015613e8357600080fd5b505115613ec15760405162461bcd60e51b81526004018080602001828103825260348152602001806151496034913960400191505060405180910390fd5b6008546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d6020811015613f3857600080fd5b505115613f765760405162461bcd60e51b81526004018080602001828103825260368152602001806150e06036913960400191505060405180910390fd5b60085460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b158015613fc357600080fd5b505afa158015613fd7573d6000803e3d6000fd5b505050506040513d6020811015613fed57600080fd5b50511561402b5760405162461bcd60e51b81526004018080602001828103825260338152602001806151166033913960400191505060405180910390fd5b6009546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561407857600080fd5b505afa15801561408c573d6000803e3d6000fd5b505050506040513d60208110156140a257600080fd5b5051156140e05760405162461bcd60e51b815260040180806020018281038252603481526020018061519d6034913960400191505060405180910390fd5b60095460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561412d57600080fd5b505afa158015614141573d6000803e3d6000fd5b505050506040513d602081101561415757600080fd5b5051156141955760405162461bcd60e51b81526004018080602001828103825260318152602001806152256031913960400191505060405180910390fd5b600d5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b1580156141e257600080fd5b505afa1580156141f6573d6000803e3d6000fd5b505050506040513d602081101561420c57600080fd5b50511561424a5760405162461bcd60e51b815260040180806020018281038252603b8152602001806150a5603b913960400191505060405180910390fd5b600d5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b15801561429757600080fd5b505afa1580156142ab573d6000803e3d6000fd5b505050506040513d60208110156142c157600080fd5b5051156142ff5760405162461bcd60e51b81526004018080602001828103825260388152602001806152806038913960400191505060405180910390fd5b600a546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b15801561434c57600080fd5b505afa158015614360573d6000803e3d6000fd5b505050506040513d602081101561437657600080fd5b5051156143b45760405162461bcd60e51b815260040180806020018281038252603781526020018061504d6037913960400191505060405180910390fd5b600a5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561440157600080fd5b505afa158015614415573d6000803e3d6000fd5b505050506040513d602081101561442b57600080fd5b5051156144695760405162461bcd60e51b8152600401808060200182810382526034815260200180614ed76034913960400191505060405180910390fd5b600b546040805163a318021760e01b81526001600160a01b0384811660048301529151919092169163a3180217916024808301926020929190829003018186803b1580156144b657600080fd5b505afa1580156144ca573d6000803e3d6000fd5b505050506040513d60208110156144e057600080fd5b50511561451e5760405162461bcd60e51b81526004018080602001828103825260348152602001806151f16034913960400191505060405180910390fd5b600b5460408051633792def360e01b81526001600160a01b03848116600483015291519190921691633792def3916024808301926020929190829003018186803b15801561456b57600080fd5b505afa15801561457f573d6000803e3d6000fd5b505050506040513d602081101561459557600080fd5b5051156145d35760405162461bcd60e51b815260040180806020018281038252603181526020018061533e6031913960400191505060405180910390fd5b600e5460408051631ccdc0d760e21b81526001600160a01b03848116600483015291519190921691637337035c916024808301926020929190829003018186803b15801561462057600080fd5b505afa158015614634573d6000803e3d6000fd5b505050506040513d602081101561464a57600080fd5b5051156146885760405162461bcd60e51b815260040180806020018281038252603b8152602001806150a5603b913960400191505060405180910390fd5b600e5460408051635b8de71560e11b81526001600160a01b0384811660048301529151919092169163b71bce2a916024808301926020929190829003018186803b1580156146d557600080fd5b505afa1580156146e9573d6000803e3d6000fd5b505050506040513d60208110156146ff57600080fd5b50511561473d5760405162461bcd60e51b81526004018080602001828103825260388152602001806152806038913960400191505060405180910390fd5b600d54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561478a57600080fd5b505afa15801561479e573d6000803e3d6000fd5b505050506040513d60208110156147b457600080fd5b5051156147f25760405162461bcd60e51b815260040180806020018281038252602381526020018061531b6023913960400191505060405180910390fd5b600e54604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b15801561483f57600080fd5b505afa158015614853573d6000803e3d6000fd5b505050506040513d602081101561486957600080fd5b505115613c0e5760405162461bcd60e51b81526004018080602001828103825260238152602001806152d86023913960400191505060405180910390fd5b60606148fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c539092919063ffffffff16565b805190915015610a355780806020019051602081101561491b57600080fd5b5051610a355760405162461bcd60e51b815260040180806020018281038252602a815260200180615256602a913960400191505060405180910390fd5b60008261496757506000613c6c565b8282028284828161497457fe5b0414613c695760405162461bcd60e51b81526004018080602001828103825260218152602001806150846021913960400191505060405180910390fd5b6000613c6983836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250614c6c565b600754604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614a4957600080fd5b505af1158015614a5d573d6000803e3d6000fd5b505050506040513d6020811015614a7357600080fd5b505190508015614a9757600454614a9790839081906001600160a01b0316846139ed565b600854604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614af057600080fd5b505af1158015614b04573d6000803e3d6000fd5b505050506040513d6020811015614b1a57600080fd5b505190508015610a355760095460055460408051631e42d69b60e21b81526001600160a01b038781166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b158015614b8b57600080fd5b505af1158015614b9f573d6000803e3d6000fd5b50505050505050565b600a54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614c0157600080fd5b505af1158015614c15573d6000803e3d6000fd5b505050506040513d6020811015614c2b57600080fd5b505190508015614c4f57600454614c4f90839081906001600160a01b0316846139ed565b5050565b6060614c628484600085614d0e565b90505b9392505050565b60008183614cf85760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614cbd578181015183820152602001614ca5565b50505050905090810190601f168015614cea5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581614d0457fe5b0495945050505050565b606082471015614d4f5760405162461bcd60e51b81526004018080602001828103825260268152602001806150036026913960400191505060405180910390fd5b614d5885614e6a565b614da9576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310614de85780518252601f199092019160209182019101614dc9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614e4a576040519150601f19603f3d011682016040523d82523d6000602084013e614e4f565b606091505b5091509150614e5f828286614e70565b979650505050505050565b3b151590565b60608315614e7f575081614c65565b825115614e8f5782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315614cbd578181015183820152602001614ca556fe526577617264526f757465723a207374616b6564476c70547261636b65722e63756d756c617469766552657761726473203e20305265656e7472616e637947756172643a207265656e7472616e742063616c6c00526577617264526f757465723a2073656e646572206861732076657374656420746f6b656e73476f7665726e61626c653a20666f7262696464656e0000000000000000000000526577617264526f757465723a207374616b6564476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526577617264526f757465723a20616c726561647920696e697469616c697a6564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526577617264526f757465723a207472616e73666572206e6f74207369676e616c6c6564526577617264526f757465723a207374616b6564476c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77526577617264526f757465723a20676d785665737465722e7472616e73666572726564417665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20626f6e7573476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20626f6e7573476d78547261636b65722e63756d756c617469766552657761726473203e2030526577617264526f757465723a207374616b6564476d78547261636b65722e63756d756c617469766552657761726473203e2030a4725d47fa458d9222498e4d63f34527cf7318c1506f89d9092b35fdbcb64f3a526577617264526f757465723a20666565476d78547261636b65722e617665726167655374616b6564416d6f756e7473203e20301cb6202519b6b6c72ba5ed11e2c3f53af3cea010f96bfc705584e53e75cf034c526577617264526f757465723a20666565476c70547261636b65722e617665726167655374616b6564416d6f756e7473203e2030526577617264526f757465723a20666565476d78547261636b65722e63756d756c617469766552657761726473203e20305361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526577617264526f757465723a20676d785665737465722e7472616e7366657272656443756d756c617469766552657761726473203e2030526577617264526f757465723a20696e76616c6964205f676c70416d6f756e74526577617264526f757465723a20676c705665737465722e62616c616e6365203e2030526577617264526f757465723a20696e76616c6964205f616d6f756e74000000526577617264526f757465723a20676d785665737465722e62616c616e6365203e2030526577617264526f757465723a20666565476c70547261636b65722e63756d756c617469766552657761726473203e2030a26469706673582212206314dbe413591c16f47bb2a96521673da7d7d59e2023f7632160666baa925db964736f6c634300060c0033

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.